diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..fe9bc7b --- /dev/null +++ b/Podfile @@ -0,0 +1,20 @@ +platform :ios, '8.0' +use_frameworks! + +target 'Ryff' do + pod 'AFNetworking', '~> 2.0' + pod 'SDWebImage', '~>3.7' + pod 'MBProgressHUD', '~> 0.9.1' + pod 'SSKeychain' + pod 'CHTCollectionViewWaterfallLayout' + pod 'KRLCollectionViewGridLayout', '~> 0.4' +end + +target 'RyffTests' do + pod 'AFNetworking', '~> 2.0' + pod 'SDWebImage', '~>3.7' + pod 'MBProgressHUD', '~> 0.9.1' + pod 'SSKeychain' + pod 'CHTCollectionViewWaterfallLayout' + pod 'KRLCollectionViewGridLayout', '~> 0.4' +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..243801b --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,47 @@ +PODS: + - AFNetworking (2.6.0): + - AFNetworking/NSURLConnection (= 2.6.0) + - AFNetworking/NSURLSession (= 2.6.0) + - AFNetworking/Reachability (= 2.6.0) + - AFNetworking/Security (= 2.6.0) + - AFNetworking/Serialization (= 2.6.0) + - AFNetworking/UIKit (= 2.6.0) + - AFNetworking/NSURLConnection (2.6.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.6.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.6.0) + - AFNetworking/Security (2.6.0) + - AFNetworking/Serialization (2.6.0) + - AFNetworking/UIKit (2.6.0): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - CHTCollectionViewWaterfallLayout (0.9.2) + - KRLCollectionViewGridLayout (0.4.0) + - MBProgressHUD (0.9.1) + - SDWebImage (3.7.3): + - SDWebImage/Core (= 3.7.3) + - SDWebImage/Core (3.7.3) + - SSKeychain (1.2.3) + +DEPENDENCIES: + - AFNetworking (~> 2.0) + - CHTCollectionViewWaterfallLayout + - KRLCollectionViewGridLayout (~> 0.4) + - MBProgressHUD (~> 0.9.1) + - SDWebImage (~> 3.7) + - SSKeychain + +SPEC CHECKSUMS: + AFNetworking: 79f7eb1a0fcfa7beb409332b2ca49afe9ce53b05 + CHTCollectionViewWaterfallLayout: 43232febcb3e4d3985cd758718cbe499b21b822f + KRLCollectionViewGridLayout: e805613ef7ba82c2b226faec87c1c16e1ebf07e4 + MBProgressHUD: c47f2c166c126cf2ce36498d80f33e754d4e93ad + SDWebImage: 1d2b1a1efda1ade1b00b6f8498865f8ddedc8a84 + SSKeychain: 3f42991739c6c60a9cf1bbd4dff6c0d3694bcf3d + +COCOAPODS: 0.38.2 diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.h b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h old mode 100755 new mode 100644 similarity index 87% rename from Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.h rename to Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h index dfa82f6..cf6def4 --- a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.h +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h @@ -1,6 +1,5 @@ // AFHTTPRequestOperation.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,6 +22,8 @@ #import #import "AFURLConnectionOperation.h" +NS_ASSUME_NONNULL_BEGIN + /** `AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. */ @@ -35,19 +36,19 @@ /** The last HTTP response received by the operation's connection. */ -@property (readonly, nonatomic, strong) NSHTTPURLResponse *response; +@property (readonly, nonatomic, strong, nullable) NSHTTPURLResponse *response; /** Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an AFHTTPResponse serializer, which uses the raw data as its response object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. - @warning `responseSerializer` must not be `nil`. Setting a response serializer will clear out any cached value + @warning `responseSerializer` must not be `nil`. Setting a response serializer will clear out any cached value */ @property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; /** An object constructed by the `responseSerializer` from the response and response data. Returns `nil` unless the operation `isFinished`, has a `response`, and has `responseData` with non-zero content length. If an error occurs during serialization, `nil` will be returned, and the `error` property will be populated with the serialization error. */ -@property (readonly, nonatomic, strong) id responseObject; +@property (readonly, nonatomic, strong, nullable) id responseObject; ///----------------------------------------------------------- /// @name Setting Completion Block Success / Failure Callbacks @@ -57,11 +58,13 @@ Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the request on completion. If `error` returns a value, which can be caused by an unacceptable status code or content type, then `failure` is executed. Otherwise, `success` is executed. This method should be overridden in subclasses in order to specify the response object passed into the success block. - + @param success The block to be executed on the completion of a successful request. This block has no return value and takes two arguments: the receiver operation and the object constructed from the response data of the request. @param failure The block to be executed on the completion of an unsuccessful request. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the request. */ -- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (void)setCompletionBlockWithSuccess:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; @end + +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.m b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m old mode 100755 new mode 100644 similarity index 97% rename from Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.m rename to Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m index 723a3b3..b8deda8 --- a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperation.m +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m @@ -1,6 +1,5 @@ // AFHTTPRequestOperation.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -57,6 +56,7 @@ @interface AFHTTPRequestOperation () @end @implementation AFHTTPRequestOperation +@dynamic response; @dynamic lock; - (instancetype)initWithRequest:(NSURLRequest *)urlRequest { @@ -168,7 +168,7 @@ - (void)pause { self.request = mutableURLRequest; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -194,7 +194,7 @@ - (void)encodeWithCoder:(NSCoder *)coder { #pragma mark - NSCopying - (id)copyWithZone:(NSZone *)zone { - AFHTTPRequestOperation *operation = [[[self class] allocWithZone:zone] initWithRequest:self.request]; + AFHTTPRequestOperation *operation = [super copyWithZone:zone]; operation.responseSerializer = [self.responseSerializer copyWithZone:zone]; operation.completionQueue = self.completionQueue; diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.h b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h old mode 100755 new mode 100644 similarity index 79% rename from Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.h rename to Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h index d7f6d42..d2385ed --- a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.h +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h @@ -1,6 +1,5 @@ // AFHTTPRequestOperationManager.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -36,23 +35,33 @@ #import "AFSecurityPolicy.h" #import "AFNetworkReachabilityManager.h" +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + +NS_ASSUME_NONNULL_BEGIN + /** `AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. ## Subclassing Notes - + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. - + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. - + ## Methods to Override To change the behavior of all request operation construction for an `AFHTTPRequestOperationManager` subclass, override `HTTPRequestOperationWithRequest:success:failure`. ## Serialization - - Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. - + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` ## URL Construction Using Relative Paths @@ -75,23 +84,23 @@ Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. - ## NSecureCoding & NSCopying Caveats + ## NSSecureCoding & NSCopying Caveats - `AFHTTPRequestOperationManager` conforms to the `NSecureCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: + `AFHTTPRequestOperationManager` conforms to the `NSSecureCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: - Archives and copies of HTTP clients will be initialized with an empty operation queue. - - NSecureCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. + - NSSecureCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. */ @interface AFHTTPRequestOperationManager : NSObject /** The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. */ -@property (readonly, nonatomic, strong) NSURL *baseURL; +@property (readonly, nonatomic, strong, nullable) NSURL *baseURL; /** Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. - + @warning `requestSerializer` must not be `nil`. */ @property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; @@ -124,7 +133,7 @@ @see AFURLConnectionOperation -credential */ -@property (nonatomic, strong) NSURLCredential *credential; +@property (nonatomic, strong, nullable) NSURLCredential *credential; ///------------------------------- /// @name Managing Security Policy @@ -151,12 +160,20 @@ /** The dispatch queue for the `completionBlock` of request operations. If `NULL` (default), the main queue is used. */ -@property (nonatomic, strong) dispatch_queue_t completionQueue; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif /** The dispatch group for the `completionBlock` of request operations. If `NULL` (default), a private dispatch group is used. */ -@property (nonatomic, strong) dispatch_group_t completionGroup; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif ///--------------------------------------------- /// @name Creating and Initializing HTTP Clients @@ -169,14 +186,14 @@ /** Initializes an `AFHTTPRequestOperationManager` object with the specified base URL. - + This is the designated initializer. - + @param url The base URL for the HTTP client. @return The newly-initialized HTTP client */ -- (instancetype)initWithBaseURL:(NSURL *)url; +- (instancetype)initWithBaseURL:(nullable NSURL *)url NS_DESIGNATED_INITIALIZER; ///--------------------------------------- /// @name Managing HTTP Request Operations @@ -190,8 +207,8 @@ @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. */ - (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; ///--------------------------- /// @name Making HTTP Requests @@ -207,10 +224,10 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)GET:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a `HEAD` request. @@ -222,10 +239,10 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a `POST` request. @@ -237,10 +254,10 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)POST:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a multipart `POST` request. @@ -253,11 +270,11 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)POST:(NSString *)URLString - parameters:(id)parameters - constructingBodyWithBlock:(void (^)(id formData))block - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(nullable id)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a `PUT` request. @@ -269,10 +286,10 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)PUT:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a `PATCH` request. @@ -284,10 +301,10 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; /** Creates and runs an `AFHTTPRequestOperation` with a `DELETE` request. @@ -299,10 +316,11 @@ @see -HTTPRequestOperationWithRequest:success:failure: */ -- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success - failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; +- (nullable AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(nullable void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; @end +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.m b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m old mode 100755 new mode 100644 similarity index 79% rename from Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.m rename to Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m index 03116cc..60739e5 --- a/Ryff/Frameworks/AFNetworking/AFHTTPRequestOperationManager.m +++ b/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m @@ -1,6 +1,5 @@ // AFHTTPRequestOperationManager.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -43,7 +42,7 @@ + (instancetype)manager { } - (instancetype)init { - return [self initWithBaseURL:nil]; + return [self initWithBaseURL:nil]; } - (instancetype)initWithBaseURL:(NSURL *)url { @@ -92,6 +91,30 @@ - (void)setResponseSerializer:(AFHTTPResponseSerializer ", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.operationQueue]; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -246,7 +277,7 @@ - (id)copyWithZone:(NSZone *)zone { HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; - + return HTTPClient; } diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.h b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h old mode 100755 new mode 100644 similarity index 77% rename from Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.h rename to Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h index a84fcc5..e516e6d --- a/Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.h +++ b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h @@ -1,6 +1,5 @@ // AFHTTPSessionManager.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -21,7 +20,9 @@ // THE SOFTWARE. #import +#if !TARGET_OS_WATCH #import +#endif #import #if __IPHONE_OS_VERSION_MIN_REQUIRED @@ -32,29 +33,37 @@ #import "AFURLSessionManager.h" +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + /** `AFHTTPSessionManager` is a subclass of `AFURLSessionManager` with convenience methods for making HTTP requests. When a `baseURL` is provided, requests made with the `GET` / `POST` / et al. convenience methods can be made with relative paths. - + ## Subclassing Notes - + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. - + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. ## Methods to Override To change the behavior of all data task operation construction, which is also used in the `GET` / `POST` / et al. convenience methods, override `dataTaskWithRequest:completionHandler:`. - + ## Serialization - + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. - + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` ## URL Construction Using Relative Paths For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. - + Below are a few examples of how `baseURL` and relative paths interact: NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; @@ -66,20 +75,24 @@ [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. */ -#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_OS_WATCH + +NS_ASSUME_NONNULL_BEGIN @interface AFHTTPSessionManager : AFURLSessionManager /** - The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + The URL used to construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. */ -@property (readonly, nonatomic, strong) NSURL *baseURL; +@property (readonly, nonatomic, strong, nullable) NSURL *baseURL; /** Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. - + @warning `requestSerializer` must not be `nil`. */ @property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; @@ -102,12 +115,12 @@ /** Initializes an `AFHTTPSessionManager` object with the specified base URL. - + @param url The base URL for the HTTP client. @return The newly-initialized HTTP client */ -- (instancetype)initWithBaseURL:(NSURL *)url; +- (instancetype)initWithBaseURL:(nullable NSURL *)url; /** Initializes an `AFHTTPSessionManager` object with the specified base URL. @@ -119,8 +132,8 @@ @return The newly-initialized HTTP client */ -- (instancetype)initWithBaseURL:(NSURL *)url - sessionConfiguration:(NSURLSessionConfiguration *)configuration; +- (instancetype)initWithBaseURL:(nullable NSURL *)url + sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; ///--------------------------- /// @name Making HTTP Requests @@ -136,10 +149,10 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)GET:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a `HEAD` request. @@ -151,10 +164,10 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)HEAD:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a `POST` request. @@ -166,10 +179,10 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)POST:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a multipart `POST` request. @@ -182,11 +195,11 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)POST:(NSString *)URLString - parameters:(id)parameters - constructingBodyWithBlock:(void (^)(id formData))block - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(nullable id)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a `PUT` request. @@ -198,10 +211,10 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)PUT:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a `PATCH` request. @@ -213,10 +226,10 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)PATCH:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; /** Creates and runs an `NSURLSessionDataTask` with a `DELETE` request. @@ -228,11 +241,13 @@ @see -dataTaskWithRequest:completionHandler: */ -- (NSURLSessionDataTask *)DELETE:(NSString *)URLString - parameters:(id)parameters - success:(void (^)(NSURLSessionDataTask *task, id responseObject))success - failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; +- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(nullable id)parameters + success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure; @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.m b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m old mode 100755 new mode 100644 similarity index 69% rename from Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.m rename to Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m index 5abfe7e..bd9163f --- a/Ryff/Frameworks/AFNetworking/AFHTTPSessionManager.m +++ b/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m @@ -1,6 +1,5 @@ // AFHTTPSessionManager.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -22,7 +21,7 @@ #import "AFHTTPSessionManager.h" -#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_WATCH_OS #import "AFURLRequestSerialization.h" #import "AFURLResponseSerialization.h" @@ -38,8 +37,10 @@ #import #endif -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS #import +#elif TARGET_OS_WATCH +#import #endif @interface AFHTTPSessionManager () @@ -47,6 +48,7 @@ @interface AFHTTPSessionManager () @end @implementation AFHTTPSessionManager +@dynamic responseSerializer; + (instancetype)manager { return [[[self class] alloc] initWithBaseURL:nil]; @@ -109,23 +111,11 @@ - (NSURLSessionDataTask *)GET:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { - if (error) { - if (failure) { - failure(task, error); - } - } else { - if (success) { - success(task, responseObject); - } - } - }]; + [dataTask resume]; - [task resume]; - - return task; + return dataTask; } - (NSURLSessionDataTask *)HEAD:(NSString *)URLString @@ -133,23 +123,15 @@ - (NSURLSessionDataTask *)HEAD:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"HEAD" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; - - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id __unused responseObject, NSError *error) { - if (error) { - if (failure) { - failure(task, error); - } - } else { - if (success) { - success(task); - } + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(NSURLSessionDataTask *task, __unused id responseObject) { + if (success) { + success(task); } - }]; + } failure:failure]; - [task resume]; + [dataTask resume]; - return task; + return dataTask; } - (NSURLSessionDataTask *)POST:(NSString *)URLString @@ -157,23 +139,11 @@ - (NSURLSessionDataTask *)POST:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { - if (error) { - if (failure) { - failure(task, error); - } - } else { - if (success) { - success(task, responseObject); - } - } - }]; - - [task resume]; + [dataTask resume]; - return task; + return dataTask; } - (NSURLSessionDataTask *)POST:(NSString *)URLString @@ -182,7 +152,20 @@ - (NSURLSessionDataTask *)POST:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:nil]; + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { if (error) { @@ -206,23 +189,11 @@ - (NSURLSessionDataTask *)PUT:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"PUT" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { - if (error) { - if (failure) { - failure(task, error); - } - } else { - if (success) { - success(task, responseObject); - } - } - }]; + [dataTask resume]; - [task resume]; - - return task; + return dataTask; } - (NSURLSessionDataTask *)PATCH:(NSString *)URLString @@ -230,23 +201,11 @@ - (NSURLSessionDataTask *)PATCH:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"PATCH" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { - if (error) { - if (failure) { - failure(task, error); - } - } else { - if (success) { - success(task, responseObject); - } - } - }]; + [dataTask resume]; - [task resume]; - - return task; + return dataTask; } - (NSURLSessionDataTask *)DELETE:(NSString *)URLString @@ -254,23 +213,48 @@ - (NSURLSessionDataTask *)DELETE:(NSString *)URLString success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { - NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"DELETE" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *, id))success + failure:(void (^)(NSURLSessionDataTask *, NSError *))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } - __block NSURLSessionDataTask *task = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + return nil; + } + + __block NSURLSessionDataTask *dataTask = nil; + dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { if (error) { if (failure) { - failure(task, error); + failure(dataTask, error); } } else { if (success) { - success(task, responseObject); + success(dataTask, responseObject); } } }]; - [task resume]; - - return task; + return dataTask; } #pragma mark - NSObject @@ -279,7 +263,7 @@ - (NSString *)description { return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.session, self.operationQueue]; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -291,7 +275,7 @@ - (id)initWithCoder:(NSCoder *)decoder { if (!configuration) { NSString *configurationIdentifier = [decoder decodeObjectOfClass:[NSString class] forKey:@"identifier"]; if (configurationIdentifier) { -#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100) +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1100) configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationIdentifier]; #else configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:configurationIdentifier]; @@ -330,7 +314,7 @@ - (id)copyWithZone:(NSZone *)zone { HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; - + return HTTPClient; } diff --git a/Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.h b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h old mode 100755 new mode 100644 similarity index 91% rename from Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.h rename to Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h index 6320783..5a44507 --- a/Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.h +++ b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h @@ -1,6 +1,5 @@ // AFNetworkReachabilityManager.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -21,13 +20,17 @@ // THE SOFTWARE. #import + +#if !TARGET_OS_WATCH #import -#import -#import -#import -#import -#import +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusUnknown = -1, @@ -36,13 +39,15 @@ typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusReachableViaWiFi = 2, }; +NS_ASSUME_NONNULL_BEGIN + /** `AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. - + Reachability can be used to determine background information about why a network operation failed, or to trigger a network operation retrying when a connection is established. It should not be used to prevent a user from initiating a network request, as it's possible that an initial request may be required to establish reachability. See Apple's Reachability Sample Code (https://developer.apple.com/library/ios/samplecode/reachability/) - + @warning Instances of `AFNetworkReachabilityManager` must be started with `-startMonitoring` before reachability status can be determined. */ @interface AFNetworkReachabilityManager : NSObject @@ -78,9 +83,9 @@ typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { /** Creates and returns a network reachability manager for the specified domain. - + @param domain The domain used to evaluate network reachability. - + @return An initialized network reachability manager, actively monitoring the specified domain. */ + (instancetype)managerForDomain:(NSString *)domain; @@ -88,20 +93,20 @@ typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { /** Creates and returns a network reachability manager for the socket address. - @param address The socket address used to evaluate network reachability. + @param address The socket address (`sockaddr_in`) used to evaluate network reachability. @return An initialized network reachability manager, actively monitoring the specified socket address. */ -+ (instancetype)managerForAddress:(const struct sockaddr_in *)address; ++ (instancetype)managerForAddress:(const void *)address; /** Initializes an instance of a network reachability manager from the specified reachability object. - + @param reachability The reachability object to monitor. - + @return An initialized network reachability manager, actively monitoring the specified reachability. */ -- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability; +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER; ///-------------------------------------------------- /// @name Starting & Stopping Reachability Monitoring @@ -135,7 +140,7 @@ typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { @param block A block object to be executed when the network availability of the `baseURL` host changes.. This block has no return value and takes a single argument which represents the various reachability states from the device to the `baseURL`. */ -- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block; +- (void)setReachabilityStatusChangeBlock:(nullable void (^)(AFNetworkReachabilityStatus status))block; @end @@ -197,3 +202,6 @@ extern NSString * const AFNetworkingReachabilityNotificationStatusItem; Returns a localized string representation of an `AFNetworkReachabilityStatus` value. */ extern NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status); + +NS_ASSUME_NONNULL_END +#endif diff --git a/Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.m b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m old mode 100755 new mode 100644 similarity index 87% rename from Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.m rename to Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m index 71adaef..2e5e2ed --- a/Ryff/Frameworks/AFNetworking/AFNetworkReachabilityManager.m +++ b/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m @@ -1,6 +1,5 @@ // AFNetworkReachabilityManager.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -21,6 +20,13 @@ // THE SOFTWARE. #import "AFNetworkReachabilityManager.h" +#if !TARGET_OS_WATCH + +#import +#import +#import +#import +#import NSString * const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem"; @@ -80,9 +86,10 @@ static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused targ dispatch_async(dispatch_get_main_queue(), ^{ NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; - [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + NSDictionary *userInfo = @{ AFNetworkingReachabilityNotificationStatusItem: @(status) }; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:userInfo]; }); - + } static const void * AFNetworkReachabilityRetainCallback(const void *info) { @@ -96,7 +103,7 @@ static void AFNetworkReachabilityReleaseCallback(const void *info) { } @interface AFNetworkReachabilityManager () -@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, strong) id networkReachability; @property (readwrite, nonatomic, assign) AFNetworkReachabilityAssociation networkReachabilityAssociation; @property (readwrite, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; @property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock; @@ -128,7 +135,7 @@ + (instancetype)managerForDomain:(NSString *)domain { return manager; } -+ (instancetype)managerForAddress:(const struct sockaddr_in *)address { ++ (instancetype)managerForAddress:(const void *)address { SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address); AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; @@ -143,19 +150,19 @@ - (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability { return nil; } - self.networkReachability = reachability; + self.networkReachability = CFBridgingRelease(reachability); self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown; return self; } +- (instancetype)init NS_UNAVAILABLE +{ + return nil; +} + - (void)dealloc { [self stopMonitoring]; - - if (_networkReachability) { - CFRelease(_networkReachability); - _networkReachability = NULL; - } } #pragma mark - @@ -192,9 +199,10 @@ - (void)startMonitoring { }; + id networkReachability = self.networkReachability; SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL}; - SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context); - SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + SCNetworkReachabilitySetCallback((__bridge SCNetworkReachabilityRef)networkReachability, AFNetworkReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop((__bridge SCNetworkReachabilityRef)networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); switch (self.networkReachabilityAssociation) { case AFNetworkReachabilityForName: @@ -204,15 +212,15 @@ - (void)startMonitoring { default: { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ SCNetworkReachabilityFlags flags; - SCNetworkReachabilityGetFlags(self.networkReachability, &flags); + SCNetworkReachabilityGetFlags((__bridge SCNetworkReachabilityRef)networkReachability, &flags); AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); dispatch_async(dispatch_get_main_queue(), ^{ callback(status); - + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; - + }); }); } @@ -225,7 +233,7 @@ - (void)stopMonitoring { return; } - SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + SCNetworkReachabilityUnscheduleFromRunLoop((__bridge SCNetworkReachabilityRef)self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); } #pragma mark - @@ -251,3 +259,4 @@ + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { } @end +#endif diff --git a/Ryff/Frameworks/AFNetworking/AFNetworking.h b/Pods/AFNetworking/AFNetworking/AFNetworking.h old mode 100755 new mode 100644 similarity index 95% rename from Ryff/Frameworks/AFNetworking/AFNetworking.h rename to Pods/AFNetworking/AFNetworking/AFNetworking.h index 68273da..6d442bb --- a/Ryff/Frameworks/AFNetworking/AFNetworking.h +++ b/Pods/AFNetworking/AFNetworking/AFNetworking.h @@ -29,14 +29,16 @@ #import "AFURLRequestSerialization.h" #import "AFURLResponseSerialization.h" #import "AFSecurityPolicy.h" +#if !TARGET_OS_WATCH #import "AFNetworkReachabilityManager.h" - #import "AFURLConnectionOperation.h" #import "AFHTTPRequestOperation.h" #import "AFHTTPRequestOperationManager.h" +#endif #if ( ( defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || \ - ( defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 ) ) + ( defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 ) || \ + TARGET_OS_WATCH ) #import "AFURLSessionManager.h" #import "AFHTTPSessionManager.h" #endif diff --git a/Ryff/Frameworks/AFNetworking/AFSecurityPolicy.h b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h old mode 100755 new mode 100644 similarity index 82% rename from Ryff/Frameworks/AFNetworking/AFSecurityPolicy.h rename to Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h index b86e76b..3c38da8 --- a/Ryff/Frameworks/AFNetworking/AFSecurityPolicy.h +++ b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h @@ -1,6 +1,5 @@ -// AFSecurity.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFSecurityPolicy.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -31,25 +30,23 @@ typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { /** `AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. - + Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. */ + +NS_ASSUME_NONNULL_BEGIN + @interface AFSecurityPolicy : NSObject /** The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `AFSSLPinningModeNone`. */ -@property (nonatomic, assign) AFSSLPinningMode SSLPinningMode; +@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode; /** - Whether to evaluate an entire SSL certificate chain, or just the leaf certificate. Defaults to `YES`. + The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. Note that if you create an array with duplicate certificates, the duplicate certificates will be removed. Note that if pinning is enabled, `evaluateServerTrust:forDomain:` will return true if any pinned certificate matches. */ -@property (nonatomic, assign) BOOL validatesCertificateChain; - -/** - The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. - */ -@property (nonatomic, strong) NSArray *pinnedCertificates; +@property (nonatomic, strong, nullable) NSArray *pinnedCertificates; /** Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. @@ -57,7 +54,7 @@ typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { @property (nonatomic, assign) BOOL allowInvalidCertificates; /** - Whether or not to validate the domain name in the certificates CN field. Defaults to `YES` for `AFSSLPinningModePublicKey` or `AFSSLPinningModeCertificate`, otherwise `NO`. + Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES`. */ @property (nonatomic, assign) BOOL validatesDomainName; @@ -66,8 +63,8 @@ typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { ///----------------------------------------- /** - Returns the shared default security policy, which does not accept invalid certificates, and does not validate against pinned certificates or public keys. - + Returns the shared default security policy, which does not allow invalid certificates, validates domain name, and does not validate against pinned certificates or public keys. + @return The default security policy. */ + (instancetype)defaultPolicy; @@ -78,9 +75,9 @@ typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { /** Creates and returns a security policy with the specified pinning mode. - + @param pinningMode The SSL pinning mode. - + @return A new security policy. */ + (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode; @@ -97,26 +94,28 @@ typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { @param serverTrust The X.509 certificate trust of the server. @return Whether or not to trust the server. - + @warning This method has been deprecated in favor of `-evaluateServerTrust:forDomain:`. */ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust DEPRECATED_ATTRIBUTE; /** - Whether or not the specified server trust should be accepted, based on the security policy. - + Whether or not the specified server trust should be accepted, based on the security policy. + This method should be used when responding to an authentication challenge from a server. - + @param serverTrust The X.509 certificate trust of the server. @param domain The domain of serverTrust. If `nil`, the domain will not be validated. - + @return Whether or not to trust the server. */ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust - forDomain:(NSString *)domain; + forDomain:(nullable NSString *)domain; @end +NS_ASSUME_NONNULL_END + ///---------------- /// @name Constants ///---------------- diff --git a/Ryff/Frameworks/AFNetworking/AFSecurityPolicy.m b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m old mode 100755 new mode 100644 similarity index 78% rename from Ryff/Frameworks/AFNetworking/AFSecurityPolicy.m rename to Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m index f11caaa..e8eaa65 --- a/Ryff/Frameworks/AFNetworking/AFSecurityPolicy.m +++ b/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m @@ -1,6 +1,5 @@ -// AFSecurity.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFSecurityPolicy.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -22,31 +21,13 @@ #import "AFSecurityPolicy.h" -// Equivalent of macro in , without causing compiler warning: -// "'DebugAssert' is deprecated: first deprecated in OS X 10.8" -#ifndef AF_Require - #define AF_Require(assertion, exceptionLabel) \ - do { \ - if (__builtin_expect(!(assertion), 0)) { \ - goto exceptionLabel; \ - } \ - } while (0) -#endif +#import -#ifndef AF_Require_noErr - #define AF_Require_noErr(errorCode, exceptionLabel) \ - do { \ - if (__builtin_expect(0 != (errorCode), 0)) { \ - goto exceptionLabel; \ - } \ - } while (0) -#endif - -#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if !TARGET_OS_IOS && !TARGET_OS_WATCH static NSData * AFSecKeyGetData(SecKeyRef key) { CFDataRef data = NULL; - AF_Require_noErr(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); + __Require_noErr_Quiet(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); return (__bridge_transfer NSData *)data; @@ -60,7 +41,7 @@ #endif static BOOL AFSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS || TARGET_OS_WATCH return [(__bridge id)key1 isEqual:(__bridge id)key2]; #else return [AFSecKeyGetData(key1) isEqual:AFSecKeyGetData(key2)]; @@ -77,14 +58,14 @@ static id AFPublicKeyForCertificate(NSData *certificate) { SecTrustResultType result; allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); - AF_Require(allowedCertificate != NULL, _out); + __Require_Quiet(allowedCertificate != NULL, _out); allowedCertificates[0] = allowedCertificate; tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); policy = SecPolicyCreateBasicX509(); - AF_Require_noErr(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); - AF_Require_noErr(SecTrustEvaluate(allowedTrust, &result), _out); + __Require_noErr_Quiet(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); + __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); @@ -111,7 +92,7 @@ static id AFPublicKeyForCertificate(NSData *certificate) { static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { BOOL isValid = NO; SecTrustResultType result; - AF_Require_noErr(SecTrustEvaluate(serverTrust, &result), _out); + __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); isValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); @@ -142,10 +123,10 @@ static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); SecTrustRef trust; - AF_Require_noErr(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); - + __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + SecTrustResultType result; - AF_Require_noErr(SecTrustEvaluate(trust, &result), _out); + __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; @@ -168,6 +149,7 @@ static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { #pragma mark - @interface AFSecurityPolicy() +@property (readwrite, nonatomic, assign) AFSSLPinningMode SSLPinningMode; @property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; @end @@ -202,7 +184,7 @@ + (instancetype)defaultPolicy { + (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode { AFSecurityPolicy *securityPolicy = [[self alloc] init]; securityPolicy.SSLPinningMode = pinningMode; - securityPolicy.validatesDomainName = YES; + [securityPolicy setPinnedCertificates:[self defaultPinnedCertificates]]; return securityPolicy; @@ -214,15 +196,13 @@ - (id)init { return nil; } - self.validatesCertificateChain = YES; + self.validatesDomainName = YES; return self; } -#pragma mark - - - (void)setPinnedCertificates:(NSArray *)pinnedCertificates { - _pinnedCertificates = pinnedCertificates; + _pinnedCertificates = [[NSOrderedSet orderedSetWithArray:pinnedCertificates] array]; if (self.pinnedCertificates) { NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:[self.pinnedCertificates count]]; @@ -248,6 +228,19 @@ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust { - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain { + if (domain && self.allowInvalidCertificates && self.validatesDomainName && (self.SSLPinningMode == AFSSLPinningModeNone || [self.pinnedCertificates count] == 0)) { + // https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html + // According to the docs, you should only trust your provided certs for evaluation. + // Pinned certificates are added to the trust. Without pinned certificates, + // there is nothing to evaluate against. + // + // From Apple Docs: + // "Do not implicitly trust self-signed certificates as anchors (kSecTrustOptionImplicitAnchors). + // Instead, add your own (self-signed) CA certificate to the list of trusted anchors." + NSLog(@"In order to validate a domain name for self signed certificates, you MUST use pinning."); + return NO; + } + NSMutableArray *policies = [NSMutableArray array]; if (self.validatesDomainName) { [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; @@ -257,14 +250,21 @@ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); - if (!AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + if (self.SSLPinningMode == AFSSLPinningModeNone) { + if (self.allowInvalidCertificates || AFServerTrustIsValid(serverTrust)){ + return YES; + } else { + return NO; + } + } else if (!AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { return NO; } NSArray *serverCertificates = AFCertificateTrustChainForServerTrust(serverTrust); switch (self.SSLPinningMode) { case AFSSLPinningModeNone: - return YES; + default: + return NO; case AFSSLPinningModeCertificate: { NSMutableArray *pinnedCertificates = [NSMutableArray array]; for (NSData *certificateData in self.pinnedCertificates) { @@ -276,25 +276,17 @@ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust return NO; } - if (!self.validatesCertificateChain) { - return YES; - } - NSUInteger trustedCertificateCount = 0; for (NSData *trustChainCertificate in serverCertificates) { if ([self.pinnedCertificates containsObject:trustChainCertificate]) { trustedCertificateCount++; } } - - return trustedCertificateCount == [serverCertificates count]; + return trustedCertificateCount > 0; } case AFSSLPinningModePublicKey: { NSUInteger trustedPublicKeyCount = 0; NSArray *publicKeys = AFPublicKeyTrustChainForServerTrust(serverTrust); - if (!self.validatesCertificateChain && [publicKeys count] > 0) { - publicKeys = @[[publicKeys firstObject]]; - } for (id trustChainPublicKey in publicKeys) { for (id pinnedPublicKey in self.pinnedPublicKeys) { @@ -303,8 +295,7 @@ - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust } } } - - return trustedPublicKeyCount > 0 && ((self.validatesCertificateChain && trustedPublicKeyCount == [serverCertificates count]) || (!self.validatesCertificateChain && trustedPublicKeyCount >= 1)); + return trustedPublicKeyCount > 0; } } diff --git a/Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.h b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h old mode 100755 new mode 100644 similarity index 85% rename from Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.h rename to Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h index 8543556..3ea87fe --- a/Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.h +++ b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h @@ -1,6 +1,5 @@ // AFURLConnectionOperation.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -27,6 +26,14 @@ #import "AFURLResponseSerialization.h" #import "AFSecurityPolicy.h" +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif + /** `AFURLConnectionOperation` is a subclass of `NSOperation` that implements `NSURLConnection` delegate methods. @@ -47,7 +54,7 @@ - `connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:` - `connection:willCacheResponse:` - `connectionShouldUseCredentialStorage:` - - `connection:needNewBodyStream:` + - `connection:needNewBodyStream:` - `connection:willSendRequestForAuthenticationChallenge:` If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. @@ -57,18 +64,14 @@ The built-in `completionBlock` provided by `NSOperation` allows for custom behavior to be executed after the request finishes. It is a common pattern for class constructors in subclasses to take callback block parameters, and execute them conditionally in the body of its `completionBlock`. Make sure to handle cancelled operations appropriately when setting a `completionBlock` (i.e. returning early before parsing response data). See the implementation of any of the `AFHTTPRequestOperation` subclasses for an example of this. Subclasses are strongly discouraged from overriding `setCompletionBlock:`, as `AFURLConnectionOperation`'s implementation includes a workaround to mitigate retain cycles, and what Apple rather ominously refers to as ["The Deallocation Problem"](http://developer.apple.com/library/ios/#technotes/tn2109/). - + ## SSL Pinning - + Relying on the CA trust model to validate SSL certificates exposes your app to security vulnerabilities, such as man-in-the-middle attacks. For applications that connect to known servers, SSL certificate pinning provides an increased level of security, by checking server certificate validity against those specified in the app bundle. - + SSL with certificate pinning is strongly recommended for any application that transmits sensitive information to an external webservice. Connections will be validated on all matching certificates with a `.cer` extension in the bundle root. - - ## App Extensions - - When using AFNetworking in an App Extension, `#define AF_APP_EXTENSIONS` to avoid using unavailable APIs. ## NSCoding & NSCopying Conformance @@ -86,6 +89,8 @@ - Operation copies do not include `completionBlock`, as it often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ operation when copied. */ +NS_ASSUME_NONNULL_BEGIN + @interface AFURLConnectionOperation : NSOperation ///------------------------------- @@ -109,12 +114,12 @@ /** The last response received by the operation's connection. */ -@property (readonly, nonatomic, strong) NSURLResponse *response; +@property (readonly, nonatomic, strong, nullable) NSURLResponse *response; /** The error, if any, that occurred in the lifecycle of the request. */ -@property (readonly, nonatomic, strong) NSError *error; +@property (readonly, nonatomic, strong, nullable) NSError *error; ///---------------------------- /// @name Getting Response Data @@ -123,12 +128,12 @@ /** The data received during the request. */ -@property (readonly, nonatomic, strong) NSData *responseData; +@property (readonly, nonatomic, strong, nullable) NSData *responseData; /** The string representation of the response data. */ -@property (readonly, nonatomic, copy) NSString *responseString; +@property (readonly, nonatomic, copy, nullable) NSString *responseString; /** The string encoding of the response. @@ -153,7 +158,7 @@ This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. */ -@property (nonatomic, strong) NSURLCredential *credential; +@property (nonatomic, strong, nullable) NSURLCredential *credential; ///------------------------------- /// @name Managing Security Policy @@ -180,7 +185,7 @@ By default, data is accumulated into a buffer that is stored into `responseData` upon completion of the request, with the intermediary `outputStream` property set to `nil`. When `outputStream` is set, the data will not be accumulated into an internal buffer, and as a result, the `responseData` property of the completed request will be `nil`. The output stream will be scheduled in the network thread runloop upon being set. */ -@property (nonatomic, strong) NSOutputStream *outputStream; +@property (nonatomic, strong, nullable) NSOutputStream *outputStream; ///--------------------------------- /// @name Managing Callback Queues @@ -189,12 +194,20 @@ /** The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. */ -@property (nonatomic, strong) dispatch_queue_t completionQueue; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif /** The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. */ -@property (nonatomic, strong) dispatch_group_t completionGroup; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif ///--------------------------------------------- /// @name Managing Request Operation Information @@ -204,6 +217,7 @@ The user info dictionary for the receiver. */ @property (nonatomic, strong) NSDictionary *userInfo; +// FIXME: It doesn't seem that this userInfo is used anywhere in the implementation. ///------------------------------------------------------ /// @name Initializing an AFURLConnectionOperation Object @@ -211,12 +225,12 @@ /** Initializes and returns a newly allocated operation object with a url connection configured with the specified url request. - + This is the designated initializer. - + @param urlRequest The request object to be used by the operation connection. */ -- (instancetype)initWithRequest:(NSURLRequest *)urlRequest; +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest NS_DESIGNATED_INITIALIZER; ///---------------------------------- /// @name Pausing / Resuming Requests @@ -252,8 +266,8 @@ @param handler A handler to be called shortly before the application’s remaining background time reaches 0. The handler is wrapped in a block that cancels the operation, and cleans up and marks the end of execution, unlike the `handler` parameter in `UIApplication -beginBackgroundTaskWithExpirationHandler:`, which expects this to be done in the handler itself. The handler is called synchronously on the main thread, thus blocking the application’s suspension momentarily while the application is notified. */ -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) -- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler; +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(nullable void (^)(void))handler NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); #endif ///--------------------------------- @@ -265,14 +279,14 @@ @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes three arguments: the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. */ -- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; +- (void)setUploadProgressBlock:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; /** Sets a callback to be called when an undetermined number of bytes have been downloaded from the server. @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. */ -- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; +- (void)setDownloadProgressBlock:(nullable void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; ///------------------------------------------------- /// @name Setting NSURLConnection Delegate Callbacks @@ -280,19 +294,19 @@ /** Sets a block to be executed when the connection will authenticate a challenge in order to download its request, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequestForAuthenticationChallenge:`. - + @param block A block object to be executed when the connection will authenticate a challenge in order to download its request. The block has no return type and takes two arguments: the URL connection object, and the challenge that must be authenticated. This block must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender protocol). - + If `allowsInvalidSSLCertificate` is set to YES, `connection:willSendRequestForAuthenticationChallenge:` will attempt to have the challenge sender use credentials with invalid SSL certificates. */ -- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; +- (void)setWillSendRequestForAuthenticationChallengeBlock:(nullable void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; /** Sets a block to be executed when the server redirects the request from one URL to another URL, or when the request URL changed by the `NSURLProtocol` subclass handling the request in order to standardize its format, as handled by the `NSURLConnectionDataDelegate` method `connection:willSendRequest:redirectResponse:`. @param block A block object to be executed when the request URL was changed. The block returns an `NSURLRequest` object, the URL request to redirect, and takes three arguments: the URL connection object, the the proposed redirected request, and the URL response that caused the redirect. */ -- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; +- (void)setRedirectResponseBlock:(nullable NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; /** @@ -300,16 +314,16 @@ @param block A block object to be executed to determine what response a connection will cache, if any. The block returns an `NSCachedURLResponse` object, the cached response to store in memory or `nil` to prevent the response from being cached, and takes two arguments: the URL connection object, and the cached response provided for the request. */ -- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; +- (void)setCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; /// /** */ -+ (NSArray *)batchOfRequestOperations:(NSArray *)operations - progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock - completionBlock:(void (^)(NSArray *operations))completionBlock; ++ (NSArray *)batchOfRequestOperations:(nullable NSArray *)operations + progressBlock:(nullable void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(nullable void (^)(NSArray *operations))completionBlock; @end @@ -326,3 +340,5 @@ extern NSString * const AFNetworkingOperationDidStartNotification; Posted when an operation finishes. */ extern NSString * const AFNetworkingOperationDidFinishNotification; + +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.m b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m old mode 100755 new mode 100644 similarity index 93% rename from Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.m rename to Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m index e5e6839..d28d69a --- a/Ryff/Frameworks/AFNetworking/AFURLConnectionOperation.m +++ b/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m @@ -1,6 +1,5 @@ // AFURLConnectionOperation.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -38,12 +37,6 @@ typedef NS_ENUM(NSInteger, AFOperationState) { AFOperationFinishedState = 3, }; -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) -typedef UIBackgroundTaskIdentifier AFBackgroundTaskIdentifier; -#else -typedef id AFBackgroundTaskIdentifier; -#endif - static dispatch_group_t url_request_operation_completion_group() { static dispatch_group_t af_url_request_operation_completion_group; static dispatch_once_t onceToken; @@ -73,6 +66,7 @@ static dispatch_queue_t url_request_operation_completion_queue() { typedef void (^AFURLConnectionOperationAuthenticationChallengeBlock)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge); typedef NSCachedURLResponse * (^AFURLConnectionOperationCacheResponseBlock)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse); typedef NSURLRequest * (^AFURLConnectionOperationRedirectResponseBlock)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse); +typedef void (^AFURLConnectionOperationBackgroundTaskCleanupBlock)(); static inline NSString * AFKeyPathFromOperationState(AFOperationState state) { switch (state) { @@ -145,7 +139,7 @@ @interface AFURLConnectionOperation () @property (readwrite, nonatomic, copy) NSString *responseString; @property (readwrite, nonatomic, assign) NSStringEncoding responseStringEncoding; @property (readwrite, nonatomic, assign) long long totalBytesRead; -@property (readwrite, nonatomic, assign) AFBackgroundTaskIdentifier backgroundTaskIdentifier; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationBackgroundTaskCleanupBlock backgroundTaskCleanup; @property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock uploadProgress; @property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock downloadProgress; @property (readwrite, nonatomic, copy) AFURLConnectionOperationAuthenticationChallengeBlock authenticationChallenge; @@ -177,7 +171,7 @@ + (NSThread *)networkRequestThread { _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil]; [_networkRequestThread start]; }); - + return _networkRequestThread; } @@ -193,11 +187,11 @@ - (instancetype)initWithRequest:(NSURLRequest *)urlRequest { self.lock = [[NSRecursiveLock alloc] init]; self.lock.name = kAFNetworkingLockName; - + self.runLoopModes = [NSSet setWithObject:NSRunLoopCommonModes]; - + self.request = urlRequest; - + self.shouldUseCredentialStorage = YES; self.securityPolicy = [AFSecurityPolicy defaultPolicy]; @@ -205,18 +199,20 @@ - (instancetype)initWithRequest:(NSURLRequest *)urlRequest { return self; } +- (instancetype)init NS_UNAVAILABLE +{ + return nil; +} + - (void)dealloc { if (_outputStream) { [_outputStream close]; _outputStream = nil; } -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) - if (_backgroundTaskIdentifier) { - [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier]; - _backgroundTaskIdentifier = UIBackgroundTaskInvalid; + if (_backgroundTaskCleanup) { + _backgroundTaskCleanup(); } -#endif } #pragma mark - @@ -289,24 +285,31 @@ - (void)setOutputStream:(NSOutputStream *)outputStream { [self.lock unlock]; } -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) - (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler { [self.lock lock]; - if (!self.backgroundTaskIdentifier) { + if (!self.backgroundTaskCleanup) { UIApplication *application = [UIApplication sharedApplication]; + UIBackgroundTaskIdentifier __block backgroundTaskIdentifier = UIBackgroundTaskInvalid; __weak __typeof(self)weakSelf = self; - self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ + + self.backgroundTaskCleanup = ^(){ + if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { + [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier]; + backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + }; + + backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ __strong __typeof(weakSelf)strongSelf = weakSelf; - + if (handler) { handler(); } - + if (strongSelf) { [strongSelf cancel]; - - [application endBackgroundTask:strongSelf.backgroundTaskIdentifier]; - strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + strongSelf.backgroundTaskCleanup(); } }]; } @@ -320,11 +323,11 @@ - (void)setState:(AFOperationState)state { if (!AFStateTransitionIsValid(self.state, state, [self isCancelled])) { return; } - + [self.lock lock]; NSString *oldStateKey = AFKeyPathFromOperationState(self.state); NSString *newStateKey = AFKeyPathFromOperationState(state); - + [self willChangeValueForKey:newStateKey]; [self willChangeValueForKey:oldStateKey]; _state = state; @@ -337,20 +340,18 @@ - (void)pause { if ([self isPaused] || [self isFinished] || [self isCancelled]) { return; } - + [self.lock lock]; - if ([self isExecuting]) { [self performSelector:@selector(operationDidPause) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; - + dispatch_async(dispatch_get_main_queue(), ^{ NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; [notificationCenter postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; }); } - + self.state = AFOperationPausedState; - [self.lock unlock]; } @@ -368,10 +369,10 @@ - (void)resume { if (![self isPaused]) { return; } - + [self.lock lock]; self.state = AFOperationReadyState; - + [self start]; [self.lock unlock]; } @@ -449,7 +450,7 @@ - (void)start { [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; } else if ([self isReady]) { self.state = AFOperationExecutingState; - + [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; } [self.lock unlock]; @@ -459,17 +460,18 @@ - (void)operationDidStart { [self.lock lock]; if (![self isCancelled]) { self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; - + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; for (NSString *runLoopMode in self.runLoopModes) { [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode]; [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode]; } - + + [self.outputStream open]; [self.connection start]; } [self.lock unlock]; - + dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidStartNotification object:self]; }); @@ -500,7 +502,7 @@ - (void)cancel { - (void)cancelConnection { NSDictionary *userInfo = nil; if ([self.request URL]) { - userInfo = [NSDictionary dictionaryWithObject:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + userInfo = @{NSURLErrorFailingURLErrorKey : [self.request URL]}; } NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; @@ -509,7 +511,7 @@ - (void)cancelConnection { [self.connection cancel]; [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:error]; } else { - // Accomodate race condition where `self.connection` has not yet been set before cancellation + // Accommodate race condition where `self.connection` has not yet been set before cancellation self.error = error; [self finish]; } @@ -578,7 +580,10 @@ + (NSArray *)batchOfRequestOperations:(NSArray *)operations #pragma mark - NSObject - (NSString *)description { - return [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; + [self.lock lock]; + NSString *description = [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; + [self.lock unlock]; + return description; } #pragma mark - NSURLConnectionDelegate @@ -642,8 +647,6 @@ - (void)connection:(NSURLConnection __unused *)connection didReceiveResponse:(NSURLResponse *)response { self.response = response; - - [self.outputStream open]; } - (void)connection:(NSURLConnection __unused *)connection @@ -661,13 +664,13 @@ - (void)connection:(NSURLConnection __unused *)connection if (numberOfBytesWritten == -1) { break; } - + totalNumberOfBytesWritten += numberOfBytesWritten; } break; } - + if (self.outputStream.streamError) { [self.connection cancel]; [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError]; @@ -721,12 +724,12 @@ - (NSCachedURLResponse *)connection:(NSURLConnection *)connection if ([self isCancelled]) { return nil; } - + return cachedResponse; } } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -734,7 +737,7 @@ + (BOOL)supportsSecureCoding { - (id)initWithCoder:(NSCoder *)decoder { NSURLRequest *request = [decoder decodeObjectOfClass:[NSURLRequest class] forKey:NSStringFromSelector(@selector(request))]; - + self = [self initWithRequest:request]; if (!self) { return nil; @@ -751,9 +754,9 @@ - (id)initWithCoder:(NSCoder *)decoder { - (void)encodeWithCoder:(NSCoder *)coder { [self pause]; - + [coder encodeObject:self.request forKey:NSStringFromSelector(@selector(request))]; - + switch (self.state) { case AFOperationExecutingState: case AFOperationPausedState: @@ -763,7 +766,7 @@ - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeInteger:self.state forKey:NSStringFromSelector(@selector(state))]; break; } - + [coder encodeObject:self.response forKey:NSStringFromSelector(@selector(response))]; [coder encodeObject:self.error forKey:NSStringFromSelector(@selector(error))]; [coder encodeObject:self.responseData forKey:NSStringFromSelector(@selector(responseData))]; @@ -774,7 +777,7 @@ - (void)encodeWithCoder:(NSCoder *)coder { - (id)copyWithZone:(NSZone *)zone { AFURLConnectionOperation *operation = [(AFURLConnectionOperation *)[[self class] allocWithZone:zone] initWithRequest:self.request]; - + operation.uploadProgress = self.uploadProgress; operation.downloadProgress = self.downloadProgress; operation.authenticationChallenge = self.authenticationChallenge; @@ -782,7 +785,7 @@ - (id)copyWithZone:(NSZone *)zone { operation.redirectResponse = self.redirectResponse; operation.completionQueue = self.completionQueue; operation.completionGroup = self.completionGroup; - + return operation; } diff --git a/Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.h b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h old mode 100755 new mode 100644 similarity index 87% rename from Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.h rename to Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h index 161b551..d747496 --- a/Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.h +++ b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h @@ -1,6 +1,5 @@ -// AFSerialization.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFURLRequestSerialization.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -21,10 +20,14 @@ // THE SOFTWARE. #import -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS #import +#elif TARGET_OS_WATCH +#import #endif +NS_ASSUME_NONNULL_BEGIN + /** The `AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary. @@ -41,9 +44,9 @@ @return A serialized request. */ -- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request - withParameters:(id)parameters - error:(NSError * __autoreleasing *)error; +- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(nullable id)parameters + error:(NSError * __nullable __autoreleasing *)error; @end @@ -72,42 +75,42 @@ typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { /** Whether created requests can use the device’s cellular radio (if present). `YES` by default. - + @see NSMutableURLRequest -setAllowsCellularAccess: */ @property (nonatomic, assign) BOOL allowsCellularAccess; /** The cache policy of created requests. `NSURLRequestUseProtocolCachePolicy` by default. - + @see NSMutableURLRequest -setCachePolicy: */ @property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy; /** Whether created requests should use the default cookie handling. `YES` by default. - + @see NSMutableURLRequest -setHTTPShouldHandleCookies: */ @property (nonatomic, assign) BOOL HTTPShouldHandleCookies; /** Whether created requests can continue transmitting data before receiving a response from an earlier transmission. `NO` by default - + @see NSMutableURLRequest -setHTTPShouldUsePipelining: */ @property (nonatomic, assign) BOOL HTTPShouldUsePipelining; /** The network service type for created requests. `NSURLNetworkServiceTypeDefault` by default. - + @see NSMutableURLRequest -setNetworkServiceType: */ @property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType; /** The timeout interval, in seconds, for created requests. The default timeout interval is 60 seconds. - + @see NSMutableURLRequest -setTimeoutInterval: */ @property (nonatomic, assign) NSTimeInterval timeoutInterval; @@ -117,7 +120,12 @@ typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { ///--------------------------------------- /** - Default HTTP header field values to be applied to serialized requests. + Default HTTP header field values to be applied to serialized requests. By default, these include the following: + + - `Accept-Language` with the contents of `NSLocale +preferredLanguages` + - `User-Agent` with the contents of various bundle identifiers and OS designations + + @discussion To add or remove default request headers, use `setValue:forHTTPHeaderField:`. */ @property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders; @@ -132,9 +140,18 @@ typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { @param field The HTTP header to set a default value for @param value The value set as default for the specified header, or `nil` */ -- (void)setValue:(NSString *)value +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field; +/** + Returns the value for the HTTP headers set in the request serializer. + + @param field The HTTP header to retrieve the default value for + + @return The value set as default for the specified header, or `nil` + */ +- (nullable NSString *)valueForHTTPHeaderField:(NSString *)field; + /** Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64-encoded username and password. This overwrites any existing value for this header. @@ -178,7 +195,7 @@ forHTTPHeaderField:(NSString *)field; @param block A block that defines a process of encoding parameters into a query string. This block returns the query string and takes three arguments: the request, the parameters to encode, and the error that occurred when attempting to encode parameters for the given request. */ -- (void)setQueryStringSerializationWithBlock:(NSString * (^)(NSURLRequest *request, NSDictionary *parameters, NSError * __autoreleasing *error))block; +- (void)setQueryStringSerializationWithBlock:(nullable NSString * (^)(NSURLRequest *request, id parameters, NSError * __autoreleasing *error))block; ///------------------------------- /// @name Creating Request Objects @@ -199,14 +216,14 @@ forHTTPHeaderField:(NSString *)field; @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. This parameter must not be `nil`. @param URLString The URL string used to create the request URL. @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. - @param error The error that occured while constructing the request. + @param error The error that occurred while constructing the request. @return An `NSMutableURLRequest` object. */ - (NSMutableURLRequest *)requestWithMethod:(NSString *)method URLString:(NSString *)URLString - parameters:(id)parameters - error:(NSError * __autoreleasing *)error; + parameters:(nullable id)parameters + error:(NSError * __nullable __autoreleasing *)error; /** @deprecated This method has been deprecated. Use -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error: instead. @@ -225,30 +242,30 @@ forHTTPHeaderField:(NSString *)field; @param URLString The URL string used to create the request URL. @param parameters The parameters to be encoded and set in the request HTTP body. @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. - @param error The error that occured while constructing the request. + @param error The error that occurred while constructing the request. @return An `NSMutableURLRequest` object */ - (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString - parameters:(NSDictionary *)parameters - constructingBodyWithBlock:(void (^)(id formData))block - error:(NSError * __autoreleasing *)error; + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + error:(NSError * __nullable __autoreleasing *)error; /** Creates an `NSMutableURLRequest` by removing the `HTTPBodyStream` from a request, and asynchronously writing its contents into the specified file, invoking the completion handler when finished. - - @param request The multipart form request. + + @param request The multipart form request. The `HTTPBodyStream` property of `request` must not be `nil`. @param fileURL The file URL to write multipart form contents to. @param handler A handler block to execute. - + @discussion There is a bug in `NSURLSessionTask` that causes requests to not send a `Content-Length` header when streaming contents from an HTTP body, which is notably problematic when interacting with the Amazon S3 webservice. As a workaround, this method takes a request constructed with `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:`, or any other request with an `HTTPBodyStream`, writes the contents to the specified file and returns a copy of the original request with the `HTTPBodyStream` property set to `nil`. From here, the file can either be passed to `AFURLSessionManager -uploadTaskWithRequest:fromFile:progress:completionHandler:`, or have its contents read into an `NSData` that's assigned to the `HTTPBody` property of the request. @see https://github.com/AFNetworking/AFNetworking/issues/1398 */ - (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request writingStreamContentsToFile:(NSURL *)fileURL - completionHandler:(void (^)(NSError *error))handler; + completionHandler:(nullable void (^)(NSError *error))handler; @end @@ -272,7 +289,7 @@ forHTTPHeaderField:(NSString *)field; */ - (BOOL)appendPartWithFileURL:(NSURL *)fileURL name:(NSString *)name - error:(NSError * __autoreleasing *)error; + error:(NSError * __nullable __autoreleasing *)error; /** Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. @@ -289,7 +306,7 @@ forHTTPHeaderField:(NSString *)field; name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType - error:(NSError * __autoreleasing *)error; + error:(NSError * __nullable __autoreleasing *)error; /** Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary. @@ -300,7 +317,7 @@ forHTTPHeaderField:(NSString *)field; @param length The length of the specified input stream in bytes. @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. */ -- (void)appendPartWithInputStream:(NSInputStream *)inputStream +- (void)appendPartWithInputStream:(nullable NSInputStream *)inputStream name:(NSString *)name fileName:(NSString *)fileName length:(int64_t)length @@ -334,9 +351,9 @@ forHTTPHeaderField:(NSString *)field; Appends HTTP headers, followed by the encoded data and the multipart form boundary. @param headers The HTTP headers to be appended to the form data. - @param body The data to be encoded and appended to the form data. + @param body The data to be encoded and appended to the form data. This parameter must not be `nil`. */ -- (void)appendPartWithHeaders:(NSDictionary *)headers +- (void)appendPartWithHeaders:(nullable NSDictionary *)headers body:(NSData *)body; /** @@ -354,6 +371,9 @@ forHTTPHeaderField:(NSString *)field; #pragma mark - +/** + `AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`. + */ @interface AFJSONRequestSerializer : AFHTTPRequestSerializer /** @@ -370,6 +390,11 @@ forHTTPHeaderField:(NSString *)field; @end +#pragma mark - + +/** + `AFPropertyListRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`. + */ @interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer /** @@ -387,7 +412,7 @@ forHTTPHeaderField:(NSString *)field; @param format The property list format. @param writeOptions The property list write options. - + @warning The `writeOptions` property is currently unused. */ + (instancetype)serializerWithFormat:(NSPropertyListFormat)format @@ -395,6 +420,8 @@ forHTTPHeaderField:(NSString *)field; @end +#pragma mark - + ///---------------- /// @name Constants ///---------------- @@ -418,7 +445,7 @@ extern NSString * const AFURLRequestSerializationErrorDomain; These keys may exist in the user info dictionary, in addition to those defined for NSError. - - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + - `NSString * const AFNetworkingOperationFailingURLRequestErrorKey` ### Constants @@ -442,3 +469,5 @@ extern NSString * const AFNetworkingOperationFailingURLRequestErrorKey; */ extern NSUInteger const kAFUploadStream3GSuggestedPacketSize; extern NSTimeInterval const kAFUploadStream3GSuggestedDelay; + +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.m b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m old mode 100755 new mode 100644 similarity index 81% rename from Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.m rename to Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m index 45df7a0..8431761 --- a/Ryff/Frameworks/AFNetworking/AFURLRequestSerialization.m +++ b/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m @@ -1,6 +1,5 @@ -// AFSerialization.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFURLRequestSerialization.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -31,7 +30,7 @@ NSString * const AFURLRequestSerializationErrorDomain = @"com.alamofire.error.serialization.request"; NSString * const AFNetworkingOperationFailingURLRequestErrorKey = @"com.alamofire.serialization.request.error.response"; -typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error); +typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id parameters, NSError *__autoreleasing *error); static NSString * AFBase64EncodedStringFromString(NSString *string) { NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; @@ -62,16 +61,26 @@ return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; } -static NSString * const kAFCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*"; +/** + Returns a percent-escaped string following RFC 3986 for a query string key or value. + RFC 3986 states that the following characters are "reserved" characters. + - General Delimiters: ":", "#", "[", "]", "@", "?", "/" + - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" -static NSString * AFPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { - static NSString * const kAFCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; + In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow + query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" + should be percent-escaped in the query string. + - parameter string: The string to be percent-escaped. + - returns: The percent-escaped string. + */ +static NSString * AFPercentEscapedStringFromString(NSString *string) { + static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4 + static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;="; - return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); -} + NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [allowedCharacterSet removeCharactersInString:[kAFCharactersGeneralDelimitersToEncode stringByAppendingString:kAFCharactersSubDelimitersToEncode]]; -static NSString * AFPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { - return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); + return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]; } #pragma mark - @@ -82,7 +91,7 @@ @interface AFQueryStringPair : NSObject - (id)initWithField:(id)field value:(id)value; -- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; +- (NSString *)URLEncodedStringValue; @end @implementation AFQueryStringPair @@ -99,11 +108,11 @@ - (id)initWithField:(id)field value:(id)value { return self; } -- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { +- (NSString *)URLEncodedStringValue { if (!self.value || [self.value isEqual:[NSNull null]]) { - return AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding); + return AFPercentEscapedStringFromString([self.field description]); } else { - return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding), AFPercentEscapedQueryStringValueFromStringWithEncoding([self.value description], stringEncoding)]; + return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])]; } } @@ -114,10 +123,10 @@ - (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding extern NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary); extern NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value); -static NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { +static NSString * AFQueryStringFromParameters(NSDictionary *parameters) { NSMutableArray *mutablePairs = [NSMutableArray array]; for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { - [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]]; + [mutablePairs addObject:[pair URLEncodedStringValue]]; } return [mutablePairs componentsJoinedByString:@"&"]; @@ -136,7 +145,7 @@ - (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding NSDictionary *dictionary = value; // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { - id nestedValue = [dictionary objectForKey:nestedKey]; + id nestedValue = dictionary[nestedKey]; if (nestedValue) { [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; } @@ -154,7 +163,7 @@ - (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding } else { [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; } - + return mutableQueryStringComponents; } @@ -169,7 +178,20 @@ - (NSMutableURLRequest *)requestByFinalizingMultipartFormData; #pragma mark - +static NSArray * AFHTTPRequestSerializerObservedKeyPaths() { + static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))]; + }); + + return _AFHTTPRequestSerializerObservedKeyPaths; +} + +static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext; + @interface AFHTTPRequestSerializer () +@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths; @property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders; @property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle; @property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization; @@ -188,12 +210,6 @@ - (instancetype)init { } self.stringEncoding = NSUTF8StringEncoding; - self.allowsCellularAccess = YES; - self.cachePolicy = NSURLRequestUseProtocolCachePolicy; - self.HTTPShouldHandleCookies = YES; - self.HTTPShouldUsePipelining = NO; - self.networkServiceType = NSURLNetworkServiceTypeDefault; - self.timeoutInterval = 60; self.mutableHTTPRequestHeaders = [NSMutableDictionary dictionary]; @@ -209,11 +225,14 @@ - (instancetype)init { NSString *userAgent = nil; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu" -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; +#elif TARGET_OS_WATCH // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 - userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], (__bridge id)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey) ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; watchOS %@; Scale/%0.2f)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[WKInterfaceDevice currentDevice] model], [[WKInterfaceDevice currentDevice] systemVersion], [[WKInterfaceDevice currentDevice] screenScale]]; #elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) - userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleExecutableKey] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleIdentifierKey], [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] ?: [[NSBundle mainBundle] infoDictionary][(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; #endif #pragma clang diagnostic pop if (userAgent) { @@ -229,20 +248,84 @@ - (instancetype)init { // HTTP Method Definitions; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil]; + self.mutableObservedChangedKeyPaths = [NSMutableSet set]; + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext]; + } + } + return self; } +- (void)dealloc { + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext]; + } + } +} + +#pragma mark - + +// Workarounds for crashing behavior using Key-Value Observing with XCTest +// See https://github.com/AFNetworking/AFNetworking/issues/2523 + +- (void)setAllowsCellularAccess:(BOOL)allowsCellularAccess { + [self willChangeValueForKey:NSStringFromSelector(@selector(allowsCellularAccess))]; + _allowsCellularAccess = allowsCellularAccess; + [self didChangeValueForKey:NSStringFromSelector(@selector(allowsCellularAccess))]; +} + +- (void)setCachePolicy:(NSURLRequestCachePolicy)cachePolicy { + [self willChangeValueForKey:NSStringFromSelector(@selector(cachePolicy))]; + _cachePolicy = cachePolicy; + [self didChangeValueForKey:NSStringFromSelector(@selector(cachePolicy))]; +} + +- (void)setHTTPShouldHandleCookies:(BOOL)HTTPShouldHandleCookies { + [self willChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldHandleCookies))]; + _HTTPShouldHandleCookies = HTTPShouldHandleCookies; + [self didChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldHandleCookies))]; +} + +- (void)setHTTPShouldUsePipelining:(BOOL)HTTPShouldUsePipelining { + [self willChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldUsePipelining))]; + _HTTPShouldUsePipelining = HTTPShouldUsePipelining; + [self didChangeValueForKey:NSStringFromSelector(@selector(HTTPShouldUsePipelining))]; +} + +- (void)setNetworkServiceType:(NSURLRequestNetworkServiceType)networkServiceType { + [self willChangeValueForKey:NSStringFromSelector(@selector(networkServiceType))]; + _networkServiceType = networkServiceType; + [self didChangeValueForKey:NSStringFromSelector(@selector(networkServiceType))]; +} + +- (void)setTimeoutInterval:(NSTimeInterval)timeoutInterval { + [self willChangeValueForKey:NSStringFromSelector(@selector(timeoutInterval))]; + _timeoutInterval = timeoutInterval; + [self didChangeValueForKey:NSStringFromSelector(@selector(timeoutInterval))]; +} + #pragma mark - - (NSDictionary *)HTTPRequestHeaders { return [NSDictionary dictionaryWithDictionary:self.mutableHTTPRequestHeaders]; } -- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field +{ [self.mutableHTTPRequestHeaders setValue:value forKey:field]; } -- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username password:(NSString *)password { +- (NSString *)valueForHTTPHeaderField:(NSString *)field { + return [self.mutableHTTPRequestHeaders valueForKey:field]; +} + +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password +{ NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", username, password]; [self setValue:[NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)] forHTTPHeaderField:@"Authorization"]; } @@ -262,7 +345,7 @@ - (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializat self.queryStringSerialization = nil; } -- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, NSDictionary *, NSError *__autoreleasing *))block { +- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, id, NSError *__autoreleasing *))block { self.queryStringSerialization = block; } @@ -289,12 +372,12 @@ - (NSMutableURLRequest *)requestWithMethod:(NSString *)method NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; mutableRequest.HTTPMethod = method; - mutableRequest.allowsCellularAccess = self.allowsCellularAccess; - mutableRequest.cachePolicy = self.cachePolicy; - mutableRequest.HTTPShouldHandleCookies = self.HTTPShouldHandleCookies; - mutableRequest.HTTPShouldUsePipelining = self.HTTPShouldUsePipelining; - mutableRequest.networkServiceType = self.networkServiceType; - mutableRequest.timeoutInterval = self.timeoutInterval; + + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) { + [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; + } + } mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy]; @@ -350,10 +433,7 @@ - (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request writingStreamContentsToFile:(NSURL *)fileURL completionHandler:(void (^)(NSError *error))handler { - if (!request.HTTPBodyStream) { - return [request mutableCopy]; - } - + NSParameterAssert(request.HTTPBodyStream); NSParameterAssert([fileURL isFileURL]); NSInputStream *inputStream = request.HTTPBodyStream; @@ -422,11 +502,20 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request if (parameters) { NSString *query = nil; if (self.queryStringSerialization) { - query = self.queryStringSerialization(request, parameters, error); + NSError *serializationError; + query = self.queryStringSerialization(request, parameters, &serializationError); + + if (serializationError) { + if (error) { + *error = serializationError; + } + + return nil; + } } else { switch (self.queryStringSerializationStyle) { case AFHTTPRequestQueryStringDefaultStyle: - query = AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding); + query = AFQueryStringFromParameters(parameters); break; } } @@ -435,8 +524,7 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]]; } else { if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { - NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding)); - [mutableRequest setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; } [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]; } @@ -445,7 +533,31 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request return mutableRequest; } -#pragma mark - NSecureCoding +#pragma mark - NSKeyValueObserving + ++ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { + if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) { + return NO; + } + + return [super automaticallyNotifiesObserversForKey:key]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(__unused id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (context == AFHTTPRequestSerializerObserverContext) { + if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { + [self.mutableObservedChangedKeyPaths removeObject:keyPath]; + } else { + [self.mutableObservedChangedKeyPaths addObject:keyPath]; + } + } +} + +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -475,7 +587,7 @@ - (id)copyWithZone:(NSZone *)zone { serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone]; serializer.queryStringSerializationStyle = self.queryStringSerializationStyle; serializer.queryStringSerialization = self.queryStringSerialization; - + return serializer; } @@ -620,17 +732,17 @@ - (BOOL)appendPartWithFileURL:(NSURL *)fileURL if (!fileAttributes) { return NO; } - + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; - + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; bodyPart.stringEncoding = self.stringEncoding; bodyPart.headers = mutableHeaders; bodyPart.boundary = self.boundary; bodyPart.body = fileURL; - bodyPart.bodyContentLength = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue]; + bodyPart.bodyContentLength = [fileAttributes[NSFileSize] unsignedLongLongValue]; [self.bodyStream appendHTTPBodyPart:bodyPart]; return YES; @@ -650,7 +762,6 @@ - (void)appendPartWithInputStream:(NSInputStream *)inputStream [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; - AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; bodyPart.stringEncoding = self.stringEncoding; bodyPart.headers = mutableHeaders; @@ -747,6 +858,9 @@ @interface AFMultipartBodyStream () @implementation AFMultipartBodyStream #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100) +@synthesize delegate; +#endif @synthesize streamStatus; @synthesize streamError; #pragma clang diagnostic pop @@ -771,7 +885,7 @@ - (void)setInitialAndFinalBoundaries { bodyPart.hasFinalBoundary = NO; } - [[self.HTTPBodyParts objectAtIndex:0] setHasInitialBoundary:YES]; + [[self.HTTPBodyParts firstObject] setHasInitialBoundary:YES]; [[self.HTTPBodyParts lastObject] setHasFinalBoundary:YES]; } } @@ -957,6 +1071,8 @@ - (NSInputStream *)inputStream { _inputStream = [NSInputStream inputStreamWithURL:self.body]; } else if ([self.body isKindOfClass:[NSInputStream class]]) { _inputStream = self.body; + } else { + _inputStream = [NSInputStream inputStreamWithData:[NSData data]]; } } @@ -1073,7 +1189,9 @@ - (NSInteger)readData:(NSData *)data - (BOOL)transitionToNextPhase { if (![[NSThread currentThread] isMainThread]) { - [self performSelectorOnMainThread:@selector(transitionToNextPhase) withObject:nil waitUntilDone:YES]; + dispatch_sync(dispatch_get_main_queue(), ^{ + [self transitionToNextPhase]; + }); return YES; } @@ -1107,13 +1225,13 @@ - (BOOL)transitionToNextPhase { - (id)copyWithZone:(NSZone *)zone { AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init]; - + bodyPart.stringEncoding = self.stringEncoding; bodyPart.headers = self.headers; bodyPart.bodyContentLength = self.bodyContentLength; bodyPart.body = self.body; bodyPart.boundary = self.boundary; - + return bodyPart; } @@ -1124,7 +1242,7 @@ - (id)copyWithZone:(NSZone *)zone { @implementation AFJSONRequestSerializer + (instancetype)serializer { - return [self serializerWithWritingOptions:0]; + return [self serializerWithWritingOptions:(NSJSONWritingOptions)0]; } + (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions @@ -1154,11 +1272,10 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request [mutableRequest setValue:value forHTTPHeaderField:field]; } }]; - + if (parameters) { if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { - NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); - [mutableRequest setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; } [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]]; @@ -1167,7 +1284,7 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request return mutableRequest; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; @@ -1237,8 +1354,7 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request if (parameters) { if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { - NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); - [mutableRequest setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; + [mutableRequest setValue:@"application/x-plist" forHTTPHeaderField:@"Content-Type"]; } [mutableRequest setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:self.format options:self.writeOptions error:error]]; @@ -1247,7 +1363,7 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request return mutableRequest; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; diff --git a/Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.h b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h old mode 100755 new mode 100644 similarity index 79% rename from Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.h rename to Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h index 36ed33e..e14dc8a --- a/Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.h +++ b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h @@ -1,6 +1,5 @@ -// AFSerialization.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFURLResponseSerialization.h +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,6 +22,8 @@ #import #import +NS_ASSUME_NONNULL_BEGIN + /** The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. @@ -39,9 +40,9 @@ @return The object decoded from the specified response data. */ -- (id)responseObjectForResponse:(NSURLResponse *)response - data:(NSData *)data - error:(NSError *__autoreleasing *)error; +- (nullable id)responseObjectForResponse:(nullable NSURLResponse *)response + data:(nullable NSData *)data + error:(NSError * __nullable __autoreleasing *)error; @end @@ -54,8 +55,10 @@ */ @interface AFHTTPResponseSerializer : NSObject +- (instancetype)init; + /** - The string encoding used to serialize parameters. + The string encoding used to serialize data received from the server, when no string encoding is specified by the response. `NSUTF8StringEncoding` by default. */ @property (nonatomic, assign) NSStringEncoding stringEncoding; @@ -73,12 +76,12 @@ See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html */ -@property (nonatomic, copy) NSIndexSet *acceptableStatusCodes; +@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes; /** The acceptable MIME types for responses. When non-`nil`, responses with a `Content-Type` with MIME types that do not intersect with the set will result in an error during validation. */ -@property (nonatomic, copy) NSSet *acceptableContentTypes; +@property (nonatomic, copy, nullable) NSSet *acceptableContentTypes; /** Validates the specified response and data. @@ -91,9 +94,9 @@ @return `YES` if the response is valid, otherwise `NO`. */ -- (BOOL)validateResponse:(NSHTTPURLResponse *)response - data:(NSData *)data - error:(NSError *__autoreleasing *)error; +- (BOOL)validateResponse:(nullable NSHTTPURLResponse *)response + data:(nullable NSData *)data + error:(NSError * __nullable __autoreleasing *)error; @end @@ -111,6 +114,8 @@ */ @interface AFJSONResponseSerializer : AFHTTPResponseSerializer +- (instancetype)init; + /** Options for reading the response JSON data and creating the Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. */ @@ -133,9 +138,9 @@ #pragma mark - /** - `AFXMLParserSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects. + `AFXMLParserResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects. - By default, `AFXMLParserSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + By default, `AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: - `application/xml` - `text/xml` @@ -149,15 +154,17 @@ #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED /** - `AFXMLDocumentSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + `AFXMLDocumentResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. - By default, `AFXMLDocumentSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: - `application/xml` - `text/xml` */ @interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer +- (instancetype)init; + /** Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. */ @@ -177,14 +184,16 @@ #pragma mark - /** - `AFPropertyListSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + `AFPropertyListResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. - By default, `AFPropertyListSerializer` accepts the following MIME types: + By default, `AFPropertyListResponseSerializer` accepts the following MIME types: - `application/x-plist` */ @interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer +- (instancetype)init; + /** The property list format. Possible values are described in "NSPropertyListFormat". */ @@ -209,9 +218,9 @@ #pragma mark - /** - `AFImageSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses. + `AFImageResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses. - By default, `AFImageSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: + By default, `AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: - `image/tiff` - `image/jpeg` @@ -285,10 +294,18 @@ extern NSString * const AFURLResponseSerializationErrorDomain; These keys may exist in the user info dictionary, in addition to those defined for NSError. - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + - `NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey` ### Constants `AFNetworkingOperationFailingURLResponseErrorKey` The corresponding value is an `NSURLResponse` containing the response of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + + `AFNetworkingOperationFailingURLResponseDataErrorKey` + The corresponding value is an `NSData` containing the original data of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. */ extern NSString * const AFNetworkingOperationFailingURLResponseErrorKey; + +extern NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey; + +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.m b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m old mode 100755 new mode 100644 similarity index 85% rename from Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.m rename to Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m index cc1e00b..f95834f --- a/Ryff/Frameworks/AFNetworking/AFURLResponseSerialization.m +++ b/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m @@ -1,6 +1,5 @@ -// AFSerialization.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// AFURLResponseSerialization.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -22,14 +21,17 @@ #import "AFURLResponseSerialization.h" -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS #import +#elif TARGET_OS_WATCH +#import #elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) #import #endif NSString * const AFURLResponseSerializationErrorDomain = @"com.alamofire.error.serialization.response"; NSString * const AFNetworkingOperationFailingURLResponseErrorKey = @"com.alamofire.serialization.response.error.response"; +NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey = @"com.alamofire.serialization.response.error.data"; static NSError * AFErrorWithUnderlyingError(NSError *error, NSError *underlyingError) { if (!error) { @@ -67,11 +69,11 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO } else if ([JSONObject isKindOfClass:[NSDictionary class]]) { NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject]; for (id key in [(NSDictionary *)JSONObject allKeys]) { - id value = [(NSDictionary *)JSONObject objectForKey:key]; + id value = (NSDictionary *)JSONObject[key]; if (!value || [value isEqual:[NSNull null]]) { [mutableDictionary removeObjectForKey:key]; } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) { - [mutableDictionary setObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions) forKey:key]; + mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions); } } @@ -112,27 +114,34 @@ - (BOOL)validateResponse:(NSHTTPURLResponse *)response if (response && [response isKindOfClass:[NSHTTPURLResponse class]]) { if (self.acceptableContentTypes && ![self.acceptableContentTypes containsObject:[response MIMEType]]) { - if ([data length] > 0) { - NSDictionary *userInfo = @{ - NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]], - NSURLErrorFailingURLErrorKey:[response URL], - AFNetworkingOperationFailingURLResponseErrorKey: response - }; + if ([data length] > 0 && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } - validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo], validationError); + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:mutableUserInfo], validationError); } responseIsValid = NO; } - if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode]) { - NSDictionary *userInfo = @{ - NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode], - NSURLErrorFailingURLErrorKey:[response URL], - AFNetworkingOperationFailingURLResponseErrorKey: response - }; + if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode] && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } - validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:userInfo], validationError); + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:mutableUserInfo], validationError); responseIsValid = NO; } @@ -156,7 +165,7 @@ - (id)responseObjectForResponse:(NSURLResponse *)response return data; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; @@ -196,7 +205,7 @@ - (id)copyWithZone:(NSZone *)zone { @implementation AFJSONResponseSerializer + (instancetype)serializer { - return [self serializerWithReadingOptions:0]; + return [self serializerWithReadingOptions:(NSJSONReadingOptions)0]; } + (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions { @@ -256,8 +265,8 @@ - (id)responseObjectForResponse:(NSURLResponse *)response } } else { NSDictionary *userInfo = @{ - NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", nil, @"AFNetworking"), - NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@", nil, @"AFNetworking"), responseString] + NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", @"AFNetworking", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@", @"AFNetworking", nil), responseString] }; serializationError = [NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; @@ -268,15 +277,15 @@ - (id)responseObjectForResponse:(NSURLResponse *)response if (self.removesKeysWithNullValues && responseObject) { responseObject = AFJSONObjectByRemovingKeysWithNullValues(responseObject, self.readingOptions); } - + if (error) { - *error = AFErrorWithUnderlyingError(serializationError, *error);; + *error = AFErrorWithUnderlyingError(serializationError, *error); } - + return responseObject; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; @@ -285,6 +294,7 @@ - (id)initWithCoder:(NSCoder *)decoder { } self.readingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readingOptions))] unsignedIntegerValue]; + self.removesKeysWithNullValues = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))] boolValue]; return self; } @@ -293,6 +303,7 @@ - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:@(self.readingOptions) forKey:NSStringFromSelector(@selector(readingOptions))]; + [coder encodeObject:@(self.removesKeysWithNullValues) forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))]; } #pragma mark - NSCopying @@ -300,6 +311,7 @@ - (void)encodeWithCoder:(NSCoder *)coder { - (id)copyWithZone:(NSZone *)zone { AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; serializer.readingOptions = self.readingOptions; + serializer.removesKeysWithNullValues = self.removesKeysWithNullValues; return serializer; } @@ -394,7 +406,7 @@ - (id)responseObjectForResponse:(NSURLResponse *)response return document; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; @@ -481,7 +493,7 @@ - (id)responseObjectForResponse:(NSURLResponse *)response return responseObject; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; @@ -519,9 +531,35 @@ - (id)copyWithZone:(NSZone *)zone { #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) #import -static UIImage * AFImageWithDataAtScale(NSData *data, CGFloat scale) { - UIImage *image = [[UIImage alloc] initWithData:data]; +@interface UIImage (AFNetworkingSafeImageLoading) ++ (UIImage *)af_safeImageWithData:(NSData *)data; +@end + +static NSLock* imageLock = nil; +@implementation UIImage (AFNetworkingSafeImageLoading) + ++ (UIImage *)af_safeImageWithData:(NSData *)data { + UIImage* image = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + imageLock = [[NSLock alloc] init]; + }); + + [imageLock lock]; + image = [UIImage imageWithData:data]; + [imageLock unlock]; + return image; +} + +@end + +static UIImage * AFImageWithDataAtScale(NSData *data, CGFloat scale) { + UIImage *image = [UIImage af_safeImageWithData:data]; + if (image.images) { + return image; + } + return [[UIImage alloc] initWithCGImage:[image CGImage] scale:scale orientation:image.imageOrientation]; } @@ -538,10 +576,11 @@ - (id)copyWithZone:(NSZone *)zone { } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); - // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so if so, fall back to AFImageWithDataAtScale if (imageRef) { CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(imageRef); CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(imageColorSpace); + + // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so fall back to AFImageWithDataAtScale if (imageColorSpaceModel == kCGColorSpaceModelCMYK) { CGImageRelease(imageRef); imageRef = NULL; @@ -573,13 +612,16 @@ - (id)copyWithZone:(NSZone *)zone { return image; } - size_t bytesPerRow = 0; // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate + // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate + size_t bytesPerRow = 0; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); if (colorSpaceModel == kCGColorSpaceModelRGB) { uint32_t alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wassign-enum" if (alpha == kCGImageAlphaNone) { bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaNoneSkipFirst; @@ -587,6 +629,7 @@ - (id)copyWithZone:(NSZone *)zone { bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaPremultipliedFirst; } +#pragma clang diagnostic pop } CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); @@ -608,7 +651,7 @@ - (id)copyWithZone:(NSZone *)zone { CGImageRelease(inflatedImageRef); CGImageRelease(imageRef); - + return inflatedImage; } #endif @@ -624,9 +667,12 @@ - (instancetype)init { self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#if TARGET_OS_IOS self.imageScale = [[UIScreen mainScreen] scale]; self.automaticallyInflatesResponseImage = YES; +#elif TARGET_OS_WATCH + self.imageScale = [[WKInterfaceDevice currentDevice] screenScale]; + self.automaticallyInflatesResponseImage = YES; #endif return self; @@ -662,7 +708,7 @@ - (id)responseObjectForResponse:(NSURLResponse *)response return nil; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; @@ -744,11 +790,11 @@ - (id)responseObjectForResponse:(NSURLResponse *)response return responseObject; } } - + return [super responseObjectForResponse:response data:data error:error]; } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding - (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; diff --git a/Ryff/Frameworks/AFNetworking/AFURLSessionManager.h b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h old mode 100755 new mode 100644 similarity index 82% rename from Ryff/Frameworks/AFNetworking/AFURLSessionManager.h rename to Pods/AFNetworking/AFNetworking/AFURLSessionManager.h index 6432027..1cdb516 --- a/Ryff/Frameworks/AFNetworking/AFURLSessionManager.h +++ b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h @@ -1,6 +1,5 @@ // AFURLSessionManager.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -25,62 +24,76 @@ #import "AFURLResponseSerialization.h" #import "AFURLRequestSerialization.h" #import "AFSecurityPolicy.h" +#if !TARGET_OS_WATCH #import "AFNetworkReachabilityManager.h" +#endif + +#ifndef NS_DESIGNATED_INITIALIZER +#if __has_attribute(objc_designated_initializer) +#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#else +#define NS_DESIGNATED_INITIALIZER +#endif +#endif /** `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. - + ## Subclassing Notes - + This is the base class for `AFHTTPSessionManager`, which adds functionality specific to making HTTP requests. If you are looking to extend `AFURLSessionManager` specifically for HTTP, consider subclassing `AFHTTPSessionManager` instead. - + ## NSURLSession & NSURLSessionTask Delegate Methods - + `AFURLSessionManager` implements the following delegate methods: - + ### `NSURLSessionDelegate` - + - `URLSession:didBecomeInvalidWithError:` - `URLSession:didReceiveChallenge:completionHandler:` + - `URLSessionDidFinishEventsForBackgroundURLSession:` ### `NSURLSessionTaskDelegate` - + - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:` - `URLSession:task:didReceiveChallenge:completionHandler:` - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:` - `URLSession:task:didCompleteWithError:` ### `NSURLSessionDataDelegate` - + - `URLSession:dataTask:didReceiveResponse:completionHandler:` - `URLSession:dataTask:didBecomeDownloadTask:` - `URLSession:dataTask:didReceiveData:` - `URLSession:dataTask:willCacheResponse:completionHandler:` - - `URLSessionDidFinishEventsForBackgroundURLSession:` ### `NSURLSessionDownloadDelegate` - `URLSession:downloadTask:didFinishDownloadingToURL:` - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:` - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:` - + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. - + ## Network Reachability Monitoring Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. - + ## NSCoding Caveats - + - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`. ## NSCopying Caveats - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original. - Operation copies do not include any delegate callback blocks, as they often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ session manager when copied. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. */ -#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) +NS_ASSUME_NONNULL_BEGIN + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || TARGET_OS_WATCH @interface AFURLSessionManager : NSObject @@ -110,6 +123,7 @@ */ @property (nonatomic, strong) AFSecurityPolicy *securityPolicy; +#if !TARGET_OS_WATCH ///-------------------------------------- /// @name Monitoring Network Reachability ///-------------------------------------- @@ -118,6 +132,7 @@ The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default. */ @property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; +#endif ///---------------------------- /// @name Getting Session Tasks @@ -150,12 +165,20 @@ /** The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. */ -@property (nonatomic, strong) dispatch_queue_t completionQueue; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; +#else +@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; +#endif /** The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. */ -@property (nonatomic, strong) dispatch_group_t completionGroup; +#if OS_OBJECT_HAVE_OBJC_SUPPORT +@property (nonatomic, strong, nullable) dispatch_group_t completionGroup; +#else +@property (nonatomic, assign, nullable) dispatch_group_t completionGroup; +#endif ///--------------------------------- /// @name Working Around System Bugs @@ -176,16 +199,16 @@ /** Creates and returns a manager for a session created with the specified configuration. This is the designated initializer. - + @param configuration The configuration used to create the managed session. - + @return A manager for a newly-created session. */ -- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration; +- (instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; /** Invalidates the managed session, optionally canceling pending tasks. - + @param cancelPendingTasks Whether or not to cancel pending tasks. */ - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks; @@ -201,7 +224,7 @@ @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. */ - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request - completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + completionHandler:(nullable void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; ///--------------------------- /// @name Running Upload Tasks @@ -214,13 +237,13 @@ @param fileURL A URL to the local file to be uploaded. @param progress A progress object monitoring the current upload progress. @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. - + @see `attemptsToRecreateUploadTasksForBackgroundSessions` */ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL - progress:(NSProgress * __autoreleasing *)progress - completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; /** Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body. @@ -231,9 +254,9 @@ @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. */ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request - fromData:(NSData *)bodyData - progress:(NSProgress * __autoreleasing *)progress - completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + fromData:(nullable NSData *)bodyData + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; /** Creates an `NSURLSessionUploadTask` with the specified streaming request. @@ -243,8 +266,8 @@ @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. */ - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request - progress:(NSProgress * __autoreleasing *)progress - completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + completionHandler:(nullable void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; ///----------------------------- /// @name Running Download Tasks @@ -257,13 +280,13 @@ @param progress A progress object monitoring the current download progress. @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. - + @warning If using a background `NSURLSessionConfiguration` on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use `-setDownloadTaskDidFinishDownloadingBlock:` to specify the URL for saving the downloaded file, rather than the destination block of this method. */ - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request - progress:(NSProgress * __autoreleasing *)progress - destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination - completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(nullable void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; /** Creates an `NSURLSessionDownloadTask` with the specified resume data. @@ -274,9 +297,9 @@ @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. */ - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData - progress:(NSProgress * __autoreleasing *)progress - destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination - completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + progress:(NSProgress * __nullable __autoreleasing * __nullable)progress + destination:(nullable NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(nullable void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; ///--------------------------------- /// @name Getting Progress for Tasks @@ -289,16 +312,16 @@ @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable. */ -- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask; +- (nullable NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask; /** Returns the download progress of the specified task. - + @param downloadTask The session download task. Must not be `nil`. - + @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable. */ -- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask; +- (nullable NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask; ///----------------------------------------- /// @name Setting Session Delegate Callbacks @@ -306,17 +329,17 @@ /** Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`. - + @param block A block object to be executed when the managed session becomes invalid. The block has no return value, and takes two arguments: the session, and the error related to the cause of invalidation. */ -- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block; +- (void)setSessionDidBecomeInvalidBlock:(nullable void (^)(NSURLSession *session, NSError *error))block; /** Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`. @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. */ -- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block; ///-------------------------------------- /// @name Setting Task Delegate Callbacks @@ -327,35 +350,35 @@ @param block A block object to be executed when a task requires a new request body stream. */ -- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block; +- (void)setTaskNeedNewBodyStreamBlock:(nullable NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block; /** Sets a block to be executed when an HTTP request is attempting to perform a redirection to a different URL, as handled by the `NSURLSessionTaskDelegate` method `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`. - + @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response. */ -- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; +- (void)setTaskWillPerformHTTPRedirectionBlock:(nullable NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; /** Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`. - + @param block A block object to be executed when a session task has received a request specific authentication challenge. The block returns the disposition of the authentication challenge, and takes four arguments: the session, the task, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. */ -- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(nullable NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __nullable __autoreleasing * __nullable credential))block; /** Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`. - + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes five arguments: the session, the task, the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. */ -- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block; +- (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block; /** Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`. - + @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task. */ -- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block; +- (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block; ///------------------------------------------- /// @name Setting Data Task Delegate Callbacks @@ -366,35 +389,35 @@ @param block A block object to be executed when a data task has received a response. The block returns the disposition of the session response, and takes three arguments: the session, the data task, and the received response. */ -- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block; +- (void)setDataTaskDidReceiveResponseBlock:(nullable NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block; /** Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`. - + @param block A block object to be executed when a data task has become a download task. The block has no return value, and takes three arguments: the session, the data task, and the download task it has become. */ -- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block; +- (void)setDataTaskDidBecomeDownloadTaskBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block; /** Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`. - + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the session, the data task, and the data received. This block may be called multiple times, and will execute on the session manager operation queue. */ -- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block; +- (void)setDataTaskDidReceiveDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block; /** Sets a block to be executed to determine the caching behavior of a data task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:willCacheResponse:completionHandler:`. - + @param block A block object to be executed to determine the caching behavior of a data task. The block returns the response to cache, and takes three arguments: the session, the data task, and the proposed cached URL response. */ -- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; +- (void)setDataTaskWillCacheResponseBlock:(nullable NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; /** Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. - + @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session. */ -- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block; +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(nullable void (^)(NSURLSession *session))block; ///----------------------------------------------- /// @name Setting Download Task Delegate Callbacks @@ -402,24 +425,24 @@ /** Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`. - + @param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error. */ -- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block; +- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block; /** Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`. - + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes five arguments: the session, the download task, the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the session manager operation queue. */ -- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block; +- (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block; /** Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`. - + @param block A block object to be executed when a download task has been resumed. The block has no return value and takes four arguments: the session, the download task, the file offset of the resumed download, and the total number of bytes expected to be downloaded. */ -- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block; +- (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block; @end @@ -431,7 +454,7 @@ /** Posted when a task begins executing. - + @deprecated Use `AFNetworkingTaskDidResumeNotification` instead. */ extern NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE; @@ -443,7 +466,7 @@ extern NSString * const AFNetworkingTaskDidResumeNotification; /** Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. - + @deprecated Use `AFNetworkingTaskDidCompleteNotification` instead. */ extern NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE; @@ -470,7 +493,7 @@ extern NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification; /** The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. - + @deprecated Use `AFNetworkingTaskDidCompleteResponseDataKey` instead. */ extern NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE; @@ -482,7 +505,7 @@ extern NSString * const AFNetworkingTaskDidCompleteResponseDataKey; /** The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. - + @deprecated Use `AFNetworkingTaskDidCompleteSerializedResponseKey` instead. */ extern NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE; @@ -494,7 +517,7 @@ extern NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey; /** The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. - + @deprecated Use `AFNetworkingTaskDidCompleteResponseSerializerKey` instead. */ extern NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE; @@ -506,7 +529,7 @@ extern NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey; /** The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. - + @deprecated Use `AFNetworkingTaskDidCompleteAssetPathKey` instead. */ extern NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE; @@ -518,7 +541,7 @@ extern NSString * const AFNetworkingTaskDidCompleteAssetPathKey; /** Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. - + @deprecated Use `AFNetworkingTaskDidCompleteErrorKey` instead. */ extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE; @@ -527,3 +550,5 @@ extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE; Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. */ extern NSString * const AFNetworkingTaskDidCompleteErrorKey; + +NS_ASSUME_NONNULL_END diff --git a/Ryff/Frameworks/AFNetworking/AFURLSessionManager.m b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m old mode 100755 new mode 100644 similarity index 77% rename from Ryff/Frameworks/AFNetworking/AFURLSessionManager.m rename to Pods/AFNetworking/AFNetworking/AFURLSessionManager.m index 194cdfa..a795a07 --- a/Ryff/Frameworks/AFNetworking/AFURLSessionManager.m +++ b/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m @@ -1,6 +1,5 @@ // AFURLSessionManager.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -8,10 +7,10 @@ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -21,9 +20,20 @@ // THE SOFTWARE. #import "AFURLSessionManager.h" +#import #if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) +static dispatch_queue_t url_session_manager_creation_queue() { + static dispatch_queue_t af_url_session_manager_creation_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL); + }); + + return af_url_session_manager_creation_queue; +} + static dispatch_queue_t url_session_manager_processing_queue() { static dispatch_queue_t af_url_session_manager_processing_queue; static dispatch_once_t onceToken; @@ -67,7 +77,7 @@ static dispatch_group_t url_session_manager_completion_group() { static NSString * const AFURLSessionManagerLockName = @"com.alamofire.networking.session.manager.lock"; -static NSUInteger const AFMaximumNumberOfToRecreateBackgroundSessionUploadTask = 3; +static NSUInteger const AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask = 3; static void * AFTaskStateChangedContext = &AFTaskStateChangedContext; @@ -76,6 +86,7 @@ static dispatch_group_t url_session_manager_completion_group() { typedef NSURLRequest * (^AFURLSessionTaskWillPerformHTTPRedirectionBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request); typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionTaskDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); +typedef void (^AFURLSessionDidFinishEventsForBackgroundURLSessionBlock)(NSURLSession *session); typedef NSInputStream * (^AFURLSessionTaskNeedNewBodyStreamBlock)(NSURLSession *session, NSURLSessionTask *task); typedef void (^AFURLSessionTaskDidSendBodyDataBlock)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend); @@ -85,7 +96,6 @@ static dispatch_group_t url_session_manager_completion_group() { typedef void (^AFURLSessionDataTaskDidBecomeDownloadTaskBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask); typedef void (^AFURLSessionDataTaskDidReceiveDataBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data); typedef NSCachedURLResponse * (^AFURLSessionDataTaskWillCacheResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse); -typedef void (^AFURLSessionDidFinishEventsForBackgroundURLSessionBlock)(NSURLSession *session); typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location); typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite); @@ -144,10 +154,18 @@ - (void)URLSession:(__unused NSURLSession *)session __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer; + //Performance Improvement from #2672 + NSData *data = nil; + if (self.mutableData) { + data = [self.mutableData copy]; + //We no longer need the reference, so nil it out to gain back some memory. + self.mutableData = nil; + } + if (self.downloadFileURL) { userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL; - } else if (self.mutableData) { - userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = [NSData dataWithData:self.mutableData]; + } else if (data) { + userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data; } if (error) { @@ -165,7 +183,7 @@ - (void)URLSession:(__unused NSURLSession *)session } else { dispatch_async(url_session_manager_processing_queue(), ^{ NSError *serializationError = nil; - responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:[NSData dataWithData:self.mutableData] error:&serializationError]; + responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError]; if (self.downloadFileURL) { responseObject = self.downloadFileURL; @@ -183,7 +201,7 @@ - (void)URLSession:(__unused NSURLSession *)session if (self.completionHandler) { self.completionHandler(task.response, responseObject, serializationError); } - + dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; }); @@ -245,14 +263,138 @@ - (void)URLSession:(__unused NSURLSession *)session #pragma mark - +/** + * A workaround for issues related to key-value observing the `state` of an `NSURLSessionTask`. + * + * See: + * - https://github.com/AFNetworking/AFNetworking/issues/1477 + * - https://github.com/AFNetworking/AFNetworking/issues/2638 + * - https://github.com/AFNetworking/AFNetworking/pull/2702 + */ + +static inline void af_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) { + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + method_exchangeImplementations(originalMethod, swizzledMethod); +} + +static inline BOOL af_addMethod(Class class, SEL selector, Method method) { + return class_addMethod(class, selector, method_getImplementation(method), method_getTypeEncoding(method)); +} + +static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume"; +static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend"; + +@interface _AFURLSessionTaskSwizzling : NSObject + +@end + +@implementation _AFURLSessionTaskSwizzling + ++ (void)load { + /** + WARNING: Trouble Ahead + https://github.com/AFNetworking/AFNetworking/pull/2702 + */ + + if (NSClassFromString(@"NSURLSessionTask")) { + /** + iOS 7 and iOS 8 differ in NSURLSessionTask implementation, which makes the next bit of code a bit tricky. + Many Unit Tests have been built to validate as much of this behavior has possible. + Here is what we know: + - NSURLSessionTasks are implemented with class clusters, meaning the class you request from the API isn't actually the type of class you will get back. + - Simply referencing `[NSURLSessionTask class]` will not work. You need to ask an `NSURLSession` to actually create an object, and grab the class from there. + - On iOS 7, `localDataTask` is a `__NSCFLocalDataTask`, which inherits from `__NSCFLocalSessionTask`, which inherits from `__NSCFURLSessionTask`. + - On iOS 8, `localDataTask` is a `__NSCFLocalDataTask`, which inherits from `__NSCFLocalSessionTask`, which inherits from `NSURLSessionTask`. + - On iOS 7, `__NSCFLocalSessionTask` and `__NSCFURLSessionTask` are the only two classes that have their own implementations of `resume` and `suspend`, and `__NSCFLocalSessionTask` DOES NOT CALL SUPER. This means both classes need to be swizzled. + - On iOS 8, `NSURLSessionTask` is the only class that implements `resume` and `suspend`. This means this is the only class that needs to be swizzled. + - Because `NSURLSessionTask` is not involved in the class hierarchy for every version of iOS, its easier to add the swizzled methods to a dummy class and manage them there. + + Some Assumptions: + - No implementations of `resume` or `suspend` call super. If this were to change in a future version of iOS, we'd need to handle it. + - No background task classes override `resume` or `suspend` + + The current solution: + 1) Grab an instance of `__NSCFLocalDataTask` by asking an instance of `NSURLSession` for a data task. + 2) Grab a pointer to the original implementation of `af_resume` + 3) Check to see if the current class has an implementation of resume. If so, continue to step 4. + 4) Grab the super class of the current class. + 5) Grab a pointer for the current class to the current implementation of `resume`. + 6) Grab a pointer for the super class to the current implementation of `resume`. + 7) If the current class implementation of `resume` is not equal to the super class implementation of `resume` AND the current implementation of `resume` is not equal to the original implementation of `af_resume`, THEN swizzle the methods + 8) Set the current class to the super class, and repeat steps 3-8 + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnonnull" + NSURLSessionDataTask *localDataTask = [[NSURLSession sessionWithConfiguration:nil] dataTaskWithURL:nil]; +#pragma clang diagnostic pop + IMP originalAFResumeIMP = method_getImplementation(class_getInstanceMethod([_AFURLSessionTaskSwizzling class], @selector(af_resume))); + Class currentClass = [localDataTask class]; + + while (class_getInstanceMethod(currentClass, @selector(resume))) { + Class superClass = [currentClass superclass]; + IMP classResumeIMP = method_getImplementation(class_getInstanceMethod(currentClass, @selector(resume))); + IMP superclassResumeIMP = method_getImplementation(class_getInstanceMethod(superClass, @selector(resume))); + if (classResumeIMP != superclassResumeIMP && + originalAFResumeIMP != classResumeIMP) { + [self swizzleResumeAndSuspendMethodForClass:currentClass]; + } + currentClass = [currentClass superclass]; + } + + [localDataTask cancel]; + } +} + ++ (void)swizzleResumeAndSuspendMethodForClass:(Class)class { + Method afResumeMethod = class_getInstanceMethod(self, @selector(af_resume)); + Method afSuspendMethod = class_getInstanceMethod(self, @selector(af_suspend)); + + af_addMethod(class, @selector(af_resume), afResumeMethod); + af_addMethod(class, @selector(af_suspend), afSuspendMethod); + + af_swizzleSelector(class, @selector(resume), @selector(af_resume)); + af_swizzleSelector(class, @selector(suspend), @selector(af_suspend)); +} + +- (NSURLSessionTaskState)state { + NSAssert(NO, @"State method should never be called in the actual dummy class"); + return NSURLSessionTaskStateCanceling; +} + +- (void)af_resume { + NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state"); + NSURLSessionTaskState state = [self state]; + [self af_resume]; + + if (state != NSURLSessionTaskStateRunning) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self]; + } +} + +- (void)af_suspend { + NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state"); + NSURLSessionTaskState state = [self state]; + [self af_suspend]; + + if (state != NSURLSessionTaskStateSuspended) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidSuspendNotification object:self]; + } +} +@end + +#pragma mark - + @interface AFURLSessionManager () @property (readwrite, nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration; @property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; @property (readwrite, nonatomic, strong) NSURLSession *session; @property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; +@property (readonly, nonatomic, copy) NSString *taskDescriptionForSessionTasks; @property (readwrite, nonatomic, strong) NSLock *lock; @property (readwrite, nonatomic, copy) AFURLSessionDidBecomeInvalidBlock sessionDidBecomeInvalid; @property (readwrite, nonatomic, copy) AFURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionDidFinishEventsForBackgroundURLSessionBlock didFinishEventsForBackgroundURLSession; @property (readwrite, nonatomic, copy) AFURLSessionTaskWillPerformHTTPRedirectionBlock taskWillPerformHTTPRedirection; @property (readwrite, nonatomic, copy) AFURLSessionTaskDidReceiveAuthenticationChallengeBlock taskDidReceiveAuthenticationChallenge; @property (readwrite, nonatomic, copy) AFURLSessionTaskNeedNewBodyStreamBlock taskNeedNewBodyStream; @@ -262,7 +404,6 @@ @interface AFURLSessionManager () @property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidBecomeDownloadTaskBlock dataTaskDidBecomeDownloadTask; @property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveDataBlock dataTaskDidReceiveData; @property (readwrite, nonatomic, copy) AFURLSessionDataTaskWillCacheResponseBlock dataTaskWillCacheResponse; -@property (readwrite, nonatomic, copy) AFURLSessionDidFinishEventsForBackgroundURLSessionBlock didFinishEventsForBackgroundURLSession; @property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; @property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidWriteDataBlock downloadTaskDidWriteData; @property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidResumeBlock downloadTaskDidResume; @@ -284,40 +425,78 @@ - (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)config configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; } - self.operationQueue = [[NSOperationQueue alloc] init]; - self.operationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + self.sessionConfiguration = configuration; - self.responseSerializer = [AFJSONResponseSerializer serializer]; + self.operationQueue = [[NSOperationQueue alloc] init]; + self.operationQueue.maxConcurrentOperationCount = 1; - self.sessionConfiguration = configuration; self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; - self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; self.securityPolicy = [AFSecurityPolicy defaultPolicy]; +#if !TARGET_OS_WATCH self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; +#endif + + self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init]; self.lock = [[NSLock alloc] init]; self.lock.name = AFURLSessionManagerLockName; - + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { for (NSURLSessionDataTask *task in dataTasks) { [self addDelegateForDataTask:task completionHandler:nil]; } - + for (NSURLSessionUploadTask *uploadTask in uploadTasks) { [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; } - + for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; } }]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:nil]; + return self; } +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - + +- (NSString *)taskDescriptionForSessionTasks { + return [NSString stringWithFormat:@"%p", self]; +} + +- (void)taskDidResume:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task respondsToSelector:@selector(taskDescription)]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidResumeNotification object:task]; + }); + } + } +} + +- (void)taskDidSuspend:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task respondsToSelector:@selector(taskDescription)]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidSuspendNotification object:task]; + }); + } + } +} + #pragma mark - - (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task { @@ -338,7 +517,6 @@ - (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate NSParameterAssert(delegate); [self.lock lock]; - [task addObserver:self forKeyPath:NSStringFromSelector(@selector(state)) options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew context:AFTaskStateChangedContext]; self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate; [self.lock unlock]; } @@ -350,6 +528,7 @@ - (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask delegate.manager = self; delegate.completionHandler = completionHandler; + dataTask.taskDescription = self.taskDescriptionForSessionTasks; [self setDelegate:delegate forTask:dataTask]; } @@ -365,11 +544,16 @@ - (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask if(totalUnitCount == NSURLSessionTransferSizeUnknown) { NSString *contentLength = [uploadTask.originalRequest valueForHTTPHeaderField:@"Content-Length"]; if(contentLength) { - totalUnitCount = (int64_t) [contentLength longLongValue]; + totalUnitCount = (int64_t)[contentLength longLongValue]; } } - delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; + if (delegate.progress) { + delegate.progress.totalUnitCount = totalUnitCount; + } else { + delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; + } + delegate.progress.pausingHandler = ^{ [uploadTask suspend]; }; @@ -381,6 +565,8 @@ - (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask *progress = delegate.progress; } + uploadTask.taskDescription = self.taskDescriptionForSessionTasks; + [self setDelegate:delegate forTask:uploadTask]; } @@ -393,18 +579,18 @@ - (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate.manager = self; delegate.completionHandler = completionHandler; - delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) { - if (destination) { + if (destination) { + delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) { return destination(location, task.response); - } - - return location; - }; + }; + } if (progress) { *progress = delegate.progress; } + downloadTask.taskDescription = self.taskDescriptionForSessionTasks; + [self setDelegate:delegate forTask:downloadTask]; } @@ -412,7 +598,6 @@ - (void)removeDelegateForTask:(NSURLSessionTask *)task { NSParameterAssert(task); [self.lock lock]; - [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(state)) context:AFTaskStateChangedContext]; [self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)]; [self.lock unlock]; } @@ -466,11 +651,13 @@ - (NSArray *)downloadTasks { #pragma mark - - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks { - if (cancelPendingTasks) { - [self.session invalidateAndCancel]; - } else { - [self.session finishTasksAndInvalidate]; - } + dispatch_async(dispatch_get_main_queue(), ^{ + if (cancelPendingTasks) { + [self.session invalidateAndCancel]; + } else { + [self.session finishTasksAndInvalidate]; + } + }); } #pragma mark - @@ -486,7 +673,10 @@ - (void)setResponseSerializer:(id )responseSerialize - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { - NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request]; + __block NSURLSessionDataTask *dataTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + dataTask = [self.session dataTaskWithRequest:request]; + }); [self addDelegateForDataTask:dataTask completionHandler:completionHandler]; @@ -500,9 +690,13 @@ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { - NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + }); + if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) { - for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfToRecreateBackgroundSessionUploadTask; attempts++) { + for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) { uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; } } @@ -517,7 +711,10 @@ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { - NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData]; + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData]; + }); [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; @@ -528,7 +725,10 @@ - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)reques progress:(NSProgress * __autoreleasing *)progress completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { - NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithStreamedRequest:request]; + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithStreamedRequest:request]; + }); [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; @@ -542,7 +742,10 @@ - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler { - NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithRequest:request]; + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithRequest:request]; + }); [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; @@ -554,7 +757,10 @@ - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler { - NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithResumeData:resumeData]; + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithResumeData:resumeData]; + }); [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; @@ -581,6 +787,10 @@ - (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChalle self.sessionDidReceiveAuthenticationChallenge = block; } +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block { + self.didFinishEventsForBackgroundURLSession = block; +} + #pragma mark - - (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block { @@ -621,10 +831,6 @@ - (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSessio self.dataTaskWillCacheResponse = block; } -- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block { - self.didFinishEventsForBackgroundURLSession = block; -} - #pragma mark - - (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block { @@ -659,42 +865,6 @@ - (BOOL)respondsToSelector:(SEL)selector { return [[self class] instancesRespondToSelector:selector]; } -#pragma mark - NSKeyValueObserving - -- (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context -{ - if (context == AFTaskStateChangedContext && [keyPath isEqualToString:@"state"]) { - if (change[NSKeyValueChangeOldKey] && change[NSKeyValueChangeNewKey] && [change[NSKeyValueChangeNewKey] isEqual:change[NSKeyValueChangeOldKey]]) { - return; - } - - NSString *notificationName = nil; - switch ([(NSURLSessionTask *)object state]) { - case NSURLSessionTaskStateRunning: - notificationName = AFNetworkingTaskDidResumeNotification; - break; - case NSURLSessionTaskStateSuspended: - notificationName = AFNetworkingTaskDidSuspendNotification; - break; - case NSURLSessionTaskStateCompleted: - // AFNetworkingTaskDidFinishNotification posted by task completion handlers - default: - break; - } - - if (notificationName) { - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:object]; - }); - } - } else { - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; - } -} - #pragma mark - NSURLSessionDelegate - (void)URLSession:(NSURLSession *)session @@ -704,15 +874,7 @@ - (void)URLSession:(NSURLSession *)session self.sessionDidBecomeInvalid(session, error); } - [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { - NSArray *tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"]; - for (NSURLSessionTask *task in tasks) { - [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(state)) context:AFTaskStateChangedContext]; - } - - [self removeAllDelegates]; - }]; - + [self removeAllDelegates]; [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session]; } @@ -799,7 +961,7 @@ - (void)URLSession:(NSURLSession *)session needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler { NSInputStream *inputStream = nil; - + if (self.taskNeedNewBodyStream) { inputStream = self.taskNeedNewBodyStream(session, task); } else if (task.originalRequest.HTTPBodyStream && [task.originalRequest.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) { @@ -817,7 +979,7 @@ - (void)URLSession:(NSURLSession *)session totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { - + int64_t totalUnitCount = totalBytesExpectedToSend; if(totalUnitCount == NSURLSessionTransferSizeUnknown) { NSString *contentLength = [task.originalRequest valueForHTTPHeaderField:@"Content-Length"]; @@ -825,7 +987,7 @@ - (void)URLSession:(NSURLSession *)session totalUnitCount = (int64_t) [contentLength longLongValue]; } } - + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; [delegate URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalUnitCount]; @@ -928,19 +1090,21 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; if (self.downloadTaskDidFinishDownloading) { NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); if (fileURL) { + delegate.downloadFileURL = fileURL; NSError *error = nil; [[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error]; if (error) { [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo]; } + return; } } - - AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + if (delegate) { [delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location]; } @@ -973,7 +1137,7 @@ - (void)URLSession:(NSURLSession *)session } } -#pragma mark - NSecureCoding +#pragma mark - NSSecureCoding + (BOOL)supportsSecureCoding { return YES; diff --git a/Pods/AFNetworking/LICENSE b/Pods/AFNetworking/LICENSE new file mode 100644 index 0000000..91f125b --- /dev/null +++ b/Pods/AFNetworking/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/AFNetworking/README.md b/Pods/AFNetworking/README.md new file mode 100644 index 0000000..f25efe0 --- /dev/null +++ b/Pods/AFNetworking/README.md @@ -0,0 +1,394 @@ +

+ AFNetworking +

+ +[![Build Status](https://travis-ci.org/AFNetworking/AFNetworking.svg)](https://travis-ci.org/AFNetworking/AFNetworking) + +AFNetworking is a delightful networking library for iOS and Mac OS X. It's built on top of the [Foundation URL Loading System](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html), extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use. + +Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac. + +Choose AFNetworking for your next project, or migrate over your existing projects—you'll be happy you did! + +## How To Get Started + +- [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps +- Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) +- Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking +- Read the [AFNetworking 2.0 Migration Guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide) for an overview of the architectural changes from 1.0. + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). (Tag 'afnetworking') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). +- If you **found a bug**, _and can provide steps to reliably reproduce it_, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like AFNetworking in your projects. See the ["Getting Started" guide for more information](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking). + +#### Podfile + +```ruby +platform :ios, '7.0' +pod "AFNetworking", "~> 2.0" +``` + +## Requirements + +| AFNetworking Version | Minimum iOS Target | Minimum OS X Target | Notes | +|:--------------------:|:---------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| +| 2.x | iOS 6 | OS X 10.8 | Xcode 5 is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | +| [1.x](https://github.com/AFNetworking/AFNetworking/tree/1.x) | iOS 5 | Mac OS X 10.7 | | +| [0.10.x](https://github.com/AFNetworking/AFNetworking/tree/0.10.x) | iOS 4 | Mac OS X 10.6 | | + +(OS X projects must support [64-bit with modern Cocoa runtime](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html)). + +> Programming in Swift? Try [Alamofire](https://github.com/Alamofire/Alamofire) for a more conventional set of APIs. + +## Architecture + +### NSURLConnection + +- `AFURLConnectionOperation` +- `AFHTTPRequestOperation` +- `AFHTTPRequestOperationManager` + +### NSURLSession _(iOS 7 / Mac OS X 10.9)_ + +- `AFURLSessionManager` +- `AFHTTPSessionManager` + +### Serialization + +* `` + - `AFHTTPRequestSerializer` + - `AFJSONRequestSerializer` + - `AFPropertyListRequestSerializer` +* `` + - `AFHTTPResponseSerializer` + - `AFJSONResponseSerializer` + - `AFXMLParserResponseSerializer` + - `AFXMLDocumentResponseSerializer` _(Mac OS X)_ + - `AFPropertyListResponseSerializer` + - `AFImageResponseSerializer` + - `AFCompoundResponseSerializer` + +### Additional Functionality + +- `AFSecurityPolicy` +- `AFNetworkReachabilityManager` + +## Usage + +### HTTP Request Operation Manager + +`AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + +#### `GET` Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` URL-Form-Encoded Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` Multi-Part Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:filePath name:@"image" error:nil]; +} success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"Success: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +--- + +### AFURLSessionManager + +`AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + +#### Creating a Download Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { + NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; + return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; +} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { + NSLog(@"File downloaded to: %@", filePath); +}]; +[downloadTask resume]; +``` + +#### Creating an Upload Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"Success: %@ %@", response, responseObject); + } +}]; +[uploadTask resume]; +``` + +#### Creating an Upload Task for a Multi-Part Request, with Progress + +```objective-c +NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; + } error:nil]; + +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +NSProgress *progress = nil; + +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; + +[uploadTask resume]; +``` + +#### Creating a Data Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; +[dataTask resume]; +``` + +--- + +### Request Serialization + +Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body. + +```objective-c +NSString *URLString = @"http://example.com"; +NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]}; +``` + +#### Query String Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil]; +``` + + GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### URL Form Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/x-www-form-urlencoded + + foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### JSON Parameter Encoding + +```objective-c +[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/json + + {"foo": "bar", "baz": [1,2,3]} + +--- + +### Network Reachability Manager + +`AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + +* Do not use Reachability to determine if the original request should be sent. + * You should try to send it. +* You can use Reachability to determine when a request should be automatically retried. + * Although it may still fail, a Reachability notification that the connectivity is available is a good time to retry something. +* Network reachability is a useful tool for determining why a request might have failed. + * After a network request has failed, telling the user they're offline is better than giving them a more technical but accurate error, such as "request timed out." + +See also [WWDC 2012 session 706, "Networking Best Practices."](https://developer.apple.com/videos/wwdc/2012/#706). + +#### Shared Network Reachability + +```objective-c +[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); +}]; + +[[AFNetworkReachabilityManager sharedManager] startMonitoring]; +``` + +#### HTTP Manager Reachability + +```objective-c +NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"]; +AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; + +NSOperationQueue *operationQueue = manager.operationQueue; +[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + [operationQueue setSuspended:NO]; + break; + case AFNetworkReachabilityStatusNotReachable: + default: + [operationQueue setSuspended:YES]; + break; + } +}]; + +[manager.reachabilityManager startMonitoring]; +``` + +--- + +### Security Policy + +`AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + +Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + +#### Allowing Invalid SSL Certificates + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production +``` + +--- + +### AFHTTPRequestOperation + +`AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + +Although `AFHTTPRequestOperationManager` is usually the best way to go about making requests, `AFHTTPRequestOperation` can be used by itself. + +#### `GET` with `AFHTTPRequestOperation` + +```objective-c +NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; +AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; +op.responseSerializer = [AFJSONResponseSerializer serializer]; +[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +[[NSOperationQueue mainQueue] addOperation:op]; +``` + +#### Batch of Operations + +```objective-c +NSMutableArray *mutableOperations = [NSMutableArray array]; +for (NSURL *fileURL in filesToUpload) { + NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil]; + }]; + + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + + [mutableOperations addObject:operation]; +} + +NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { + NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); +} completionBlock:^(NSArray *operations) { + NSLog(@"All operations in batch complete"); +}]; +[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; +``` + +## Unit Tests + +AFNetworking includes a suite of unit tests within the Tests subdirectory. In order to run the unit tests, you must install the testing dependencies via [CocoaPods](http://cocoapods.org/): + + $ cd Tests + $ pod install + +Once testing dependencies are installed, you can execute the test suite via the 'iOS Tests' and 'OS X Tests' schemes within Xcode. + +### Running Tests from the Command Line + +Tests can also be run from the command line or within a continuous integration environment. The [`xcpretty`](https://github.com/mneorr/xcpretty) utility needs to be installed before running the tests from the command line: + + $ gem install xcpretty + +Once `xcpretty` is installed, you can execute the suite via `rake test`. + +## Credits + +AFNetworking is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). + +AFNetworking was originally created by [Scott Raymond](https://github.com/sco/) and [Mattt Thompson](https://github.com/mattt/) in the development of [Gowalla for iPhone](http://en.wikipedia.org/wiki/Gowalla). + +AFNetworking's logo was designed by [Alan Defibaugh](http://www.alandefibaugh.com/). + +And most of all, thanks to AFNetworking's [growing list of contributors](https://github.com/AFNetworking/AFNetworking/contributors). + +### Security Disclosure + +If you believe you have identified a security vulnerability with AFNetworking, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. + +## License + +AFNetworking is released under the MIT license. See LICENSE for details. diff --git a/Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h old mode 100755 new mode 100644 similarity index 88% rename from Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h rename to Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h index 312d680..3c7649b --- a/Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h @@ -1,6 +1,5 @@ // AFNetworkActivityIndicatorManager.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + /** `AFNetworkActivityIndicatorManager` manages the state of the network activity indicator in the status bar. When enabled, it will listen for notifications indicating that a network request operation has started or finished, and start or stop animating the indicator accordingly. The number of active requests is incremented and decremented much like a stack or a semaphore, and the activity indicator will animate so long as that number is greater than zero. @@ -35,11 +36,12 @@ [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; - By setting `isNetworkActivityIndicatorVisible` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. + By setting `enabled` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. See the Apple Human Interface Guidelines section about the Network Activity Indicator for more information: http://developer.apple.com/library/iOS/#documentation/UserExperience/Conceptual/MobileHIG/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW44 */ +NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.") @interface AFNetworkActivityIndicatorManager : NSObject /** @@ -73,4 +75,6 @@ @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m old mode 100755 new mode 100644 similarity index 98% rename from Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m rename to Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m index c2d855a..cf13180 --- a/Ryff/Frameworks/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m @@ -1,6 +1,5 @@ // AFNetworkActivityIndicatorManager.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -121,7 +120,7 @@ - (void)setActivityCount:(NSInteger)activityCount { @synchronized(self) { _activityCount = activityCount; } - + dispatch_async(dispatch_get_main_queue(), ^{ [self updateNetworkActivityIndicatorVisibilityDelayed]; }); @@ -133,7 +132,7 @@ - (void)incrementActivityCount { _activityCount++; } [self didChangeValueForKey:@"activityCount"]; - + dispatch_async(dispatch_get_main_queue(), ^{ [self updateNetworkActivityIndicatorVisibilityDelayed]; }); @@ -148,7 +147,7 @@ - (void)decrementActivityCount { #pragma clang diagnostic pop } [self didChangeValueForKey:@"activityCount"]; - + dispatch_async(dispatch_get_main_queue(), ^{ [self updateNetworkActivityIndicatorVisibilityDelayed]; }); diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h old mode 100755 new mode 100644 similarity index 90% rename from Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h index 1c1f8dd..0c8f9b5 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -1,6 +1,5 @@ // UIActivityIndicatorView+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -45,7 +44,7 @@ @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. */ #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 -- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task; +- (void)setAnimatingWithStateOfTask:(nullable NSURLSessionTask *)task; #endif ///--------------------------------------- @@ -54,10 +53,10 @@ /** Binds the animating state to the execution state of the specified operation. - + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. */ -- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation; +- (void)setAnimatingWithStateOfOperation:(nullable AFURLConnectionOperation *)operation; @end diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m old mode 100755 new mode 100644 similarity index 51% rename from Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m index 6627dbb..dd362b0 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m @@ -1,6 +1,5 @@ // UIActivityIndicatorView+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -21,6 +20,7 @@ // THE SOFTWARE. #import "UIActivityIndicatorView+AFNetworking.h" +#import #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) @@ -30,8 +30,51 @@ #import "AFURLSessionManager.h" #endif +@interface AFActivityIndicatorViewNotificationObserver : NSObject +@property (readonly, nonatomic, weak) UIActivityIndicatorView *activityIndicatorView; +- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task; +#endif +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + @implementation UIActivityIndicatorView (AFNetworking) +- (AFActivityIndicatorViewNotificationObserver *)af_notificationObserver { + AFActivityIndicatorViewNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver)); + if (notificationObserver == nil) { + notificationObserver = [[AFActivityIndicatorViewNotificationObserver alloc] initWithActivityIndicatorView:self]; + objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return notificationObserver; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { + [[self af_notificationObserver] setAnimatingWithStateOfTask:task]; +} +#endif + +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { + [[self af_notificationObserver] setAnimatingWithStateOfOperation:operation]; +} + +@end + +@implementation AFActivityIndicatorViewNotificationObserver + +- (instancetype)initWithActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView +{ + self = [super init]; + if (self) { + _activityIndicatorView = activityIndicatorView; + } + return self; +} + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 - (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; @@ -39,14 +82,19 @@ - (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; - + if (task) { if (task.state != NSURLSessionTaskStateCompleted) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" if (task.state == NSURLSessionTaskStateRunning) { - [self startAnimating]; + [self.activityIndicatorView startAnimating]; } else { - [self stopAnimating]; + [self.activityIndicatorView stopAnimating]; } +#pragma clang diagnostic pop [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task]; @@ -66,11 +114,16 @@ - (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { if (operation) { if (![operation isFinished]) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" if ([operation isExecuting]) { - [self startAnimating]; + [self.activityIndicatorView startAnimating]; } else { - [self stopAnimating]; + [self.activityIndicatorView stopAnimating]; } +#pragma clang diagnostic pop [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingOperationDidStartNotification object:operation]; [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingOperationDidFinishNotification object:operation]; @@ -82,16 +135,37 @@ - (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { - (void)af_startAnimating { dispatch_async(dispatch_get_main_queue(), ^{ - [self startAnimating]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.activityIndicatorView startAnimating]; +#pragma clang diagnostic pop }); } - (void)af_stopAnimating { dispatch_async(dispatch_get_main_queue(), ^{ - [self stopAnimating]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.activityIndicatorView stopAnimating]; +#pragma clang diagnostic pop }); } +#pragma mark - + +- (void)dealloc { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; +#endif + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; +} + @end #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h old mode 100755 new mode 100644 similarity index 79% rename from Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h index b94f1cb..97f5622 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h @@ -1,6 +1,5 @@ // UIAlertView+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + @class AFURLConnectionOperation; /** @@ -41,18 +42,18 @@ /** Shows an alert view with the error of the specified session task, if any. - + @param task The session task. @param delegate The alert view delegate. */ #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task - delegate:(id)delegate; + delegate:(nullable id)delegate NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); #endif /** Shows an alert view with the error of the specified session task, if any, with a custom cancel button title and other button titles. - + @param task The session task. @param delegate The alert view delegate. @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. @@ -60,9 +61,9 @@ */ #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task - delegate:(id)delegate - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; + delegate:(nullable id)delegate + cancelButtonTitle:(nullable NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); #endif ///------------------------------------------ @@ -76,7 +77,7 @@ @param delegate The alert view delegate. */ + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation - delegate:(id)delegate; + delegate:(nullable id)delegate NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); /** Shows an alert view with the error of the specified request operation, if any, with a custom cancel button title and other button titles. @@ -87,10 +88,12 @@ @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. */ + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation - delegate:(id)delegate - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; + delegate:(nullable id)delegate + cancelButtonTitle:(nullable NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extensions."); @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m old mode 100755 new mode 100644 similarity index 65% rename from Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m index b7e2a26..0d1e9e7 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIAlertView+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m @@ -1,6 +1,5 @@ // UIAlertView+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -62,17 +61,32 @@ + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION { - __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingTaskDidCompleteNotification object:task queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + NSMutableArray *mutableOtherTitles = [NSMutableArray array]; + va_list otherButtonTitleList; + va_start(otherButtonTitleList, otherButtonTitles); + { + for (NSString *otherButtonTitle = otherButtonTitles; otherButtonTitle != nil; otherButtonTitle = va_arg(otherButtonTitleList, NSString *)) { + [mutableOtherTitles addObject:otherButtonTitle]; + } + } + va_end(otherButtonTitleList); + __block __weak id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingTaskDidCompleteNotification object:task queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { NSError *error = notification.userInfo[AFNetworkingTaskDidCompleteErrorKey]; if (error) { NSString *title, *message; AFGetAlertViewTitleAndMessageFromError(error, &title, &message); - [[[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil] show]; + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for (NSString *otherButtonTitle in mutableOtherTitles) { + [alertView addButtonWithTitle:otherButtonTitle]; + } + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; } - [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingTaskDidCompleteNotification object:notification.object]; + [[NSNotificationCenter defaultCenter] removeObserver:observer]; }]; } #endif @@ -82,7 +96,7 @@ + (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation delegate:(id)delegate { - [self showAlertViewForRequestOperationWithErrorOnCompletion:operation delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlert View Cancel Button Title") otherButtonTitles:nil, nil]; + [self showAlertViewForRequestOperationWithErrorOnCompletion:operation delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; } + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation @@ -90,7 +104,17 @@ + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOp cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION { - __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingOperationDidFinishNotification object:operation queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + NSMutableArray *mutableOtherTitles = [NSMutableArray array]; + va_list otherButtonTitleList; + va_start(otherButtonTitleList, otherButtonTitles); + { + for (NSString *otherButtonTitle = otherButtonTitles; otherButtonTitle != nil; otherButtonTitle = va_arg(otherButtonTitleList, NSString *)) { + [mutableOtherTitles addObject:otherButtonTitle]; + } + } + va_end(otherButtonTitleList); + + __block __weak id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingOperationDidFinishNotification object:operation queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { if (notification.object && [notification.object isKindOfClass:[AFURLConnectionOperation class]]) { NSError *error = [(AFURLConnectionOperation *)notification.object error]; @@ -98,11 +122,17 @@ + (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOp NSString *title, *message; AFGetAlertViewTitleAndMessageFromError(error, &title, &message); - [[[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil] show]; + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for (NSString *otherButtonTitle in mutableOtherTitles) { + [alertView addButtonWithTitle:otherButtonTitle]; + } + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; } } - [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingOperationDidFinishNotification object:notification.object]; + [[NSNotificationCenter defaultCenter] removeObserver:observer]; }]; } diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h old mode 100755 new mode 100644 similarity index 74% rename from Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h index fd89ecd..327bdab --- a/Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h @@ -1,6 +1,5 @@ // UIButton+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,20 +27,53 @@ #import +NS_ASSUME_NONNULL_BEGIN + +@protocol AFURLResponseSerialization, AFImageCache; + /** This category adds methods to the UIKit framework's `UIButton` class. The methods in this category provide support for loading remote images and background images asynchronously from a URL. + + @warning Compound values for control `state` (such as `UIControlStateHighlighted | UIControlStateDisabled`) are unsupported. */ @interface UIButton (AFNetworking) +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loading performance on scroll views. By default, `UIButton` will use the `sharedImageCache` of `UIImageView`. + */ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + ///-------------------- /// @name Setting Image ///-------------------- /** Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. - + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. - + @param state The control state. @param url The URL used for the image request. */ @@ -50,22 +82,22 @@ /** Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. - + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. - + @param state The control state. @param url The URL used for the image request. @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. */ - (void)setImageForState:(UIControlState)state withURL:(NSURL *)url - placeholderImage:(UIImage *)placeholderImage; + placeholderImage:(nullable UIImage *)placeholderImage; /** Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. - + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setImage:forState:` is applied. @param state The control state. @@ -76,9 +108,9 @@ */ - (void)setImageForState:(UIControlState)state withURLRequest:(NSURLRequest *)urlRequest - placeholderImage:(UIImage *)placeholderImage - success:(void (^)(NSHTTPURLResponse *response, UIImage *image))success - failure:(void (^)(NSError *error))failure; + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(nullable void (^)(NSError *error))failure; ///------------------------------- @@ -107,7 +139,7 @@ */ - (void)setBackgroundImageForState:(UIControlState)state withURL:(NSURL *)url - placeholderImage:(UIImage *)placeholderImage; + placeholderImage:(nullable UIImage *)placeholderImage; /** Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. @@ -122,9 +154,9 @@ */ - (void)setBackgroundImageForState:(UIControlState)state withURLRequest:(NSURLRequest *)urlRequest - placeholderImage:(UIImage *)placeholderImage - success:(void (^)(NSHTTPURLResponse *response, UIImage *image))success - failure:(void (^)(NSError *error))failure; + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(nullable void (^)(NSError *error))failure; ///------------------------------ @@ -132,15 +164,21 @@ ///------------------------------ /** - Cancels any executing image operation for the receiver, if one exists. + Cancels any executing image operation for the specified control state of the receiver, if one exists. + + @param state The control state. */ -- (void)cancelImageRequestOperation; +- (void)cancelImageRequestOperationForState:(UIControlState)state; /** - Cancels any executing background image operation for the receiver, if one exists. + Cancels any executing background image operation for the specified control state of the receiver, if one exists. + + @param state The control state. */ -- (void)cancelBackgroundImageRequestOperation; +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state; @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m new file mode 100644 index 0000000..f34631e --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m @@ -0,0 +1,293 @@ +// UIButton+AFNetworking.m +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIButton+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLResponseSerialization.h" +#import "AFHTTPRequestOperation.h" + +#import "UIImageView+AFNetworking.h" + +@interface UIButton (_AFNetworking) +@end + +@implementation UIButton (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +#pragma mark - + +static char AFImageRequestOperationNormal; +static char AFImageRequestOperationHighlighted; +static char AFImageRequestOperationSelected; +static char AFImageRequestOperationDisabled; + +static const char * af_imageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_imageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_imageRequestOperationKeyForState(state)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_imageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +static char AFBackgroundImageRequestOperationNormal; +static char AFBackgroundImageRequestOperationHighlighted; +static char AFBackgroundImageRequestOperationSelected; +static char AFBackgroundImageRequestOperationDisabled; + +static const char * af_backgroundImageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFBackgroundImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFBackgroundImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFBackgroundImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFBackgroundImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_backgroundImageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state)); +} + +- (void)af_setBackgroundImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIButton (AFNetworking) + ++ (id )sharedImageCache { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: [UIImageView sharedImageCache]; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setImage:cachedImage forState:state]; + } + + [self af_setImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setImageRequestOperation:imageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:imageRequestOperation]; + } +} + +#pragma mark - + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setBackgroundImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setBackgroundImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelBackgroundImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setBackgroundImage:cachedImage forState:state]; + } + + [self af_setBackgroundImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setBackgroundImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *backgroundImageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + backgroundImageRequestOperation.responseSerializer = self.imageResponseSerializer; + [backgroundImageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setBackgroundImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setBackgroundImageRequestOperation:backgroundImageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:backgroundImageRequestOperation]; + } +} + +#pragma mark - + +- (void)cancelImageRequestOperationForState:(UIControlState)state { + [[self af_imageRequestOperationForState:state] cancel]; + [self af_setImageRequestOperation:nil forState:state]; +} + +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state { + [[self af_backgroundImageRequestOperationForState:state] cancel]; + [self af_setBackgroundImageRequestOperation:nil forState:state]; +} + +@end + +#endif diff --git a/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h new file mode 100644 index 0000000..3292920 --- /dev/null +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h @@ -0,0 +1,35 @@ +// +// UIImage+AFNetworking.h +// +// +// Created by Paulo Ferreira on 08/07/15. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@interface UIImage (AFNetworking) + ++ (UIImage*) safeImageWithData:(NSData*)data; + +@end + +#endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h old mode 100755 new mode 100644 similarity index 85% rename from Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h index 40188c3..e33d8a0 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h @@ -1,6 +1,5 @@ // UIImageView+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + @protocol AFURLResponseSerialization, AFImageCache; /** @@ -35,20 +36,18 @@ */ @interface UIImageView (AFNetworking) -+ (void)clearImageCacheForURL:(NSURL *)url; - ///---------------------------- /// @name Accessing Image Cache ///---------------------------- /** - The image cache used to improve image loadiing performance on scroll views. By default, this is an `NSCache` subclass conforming to the `AFImageCache` protocol, which listens for notification warnings and evicts objects accordingly. + The image cache used to improve image loading performance on scroll views. By default, this is an `NSCache` subclass conforming to the `AFImageCache` protocol, which listens for notification warnings and evicts objects accordingly. */ + (id )sharedImageCache; /** Set the cache used for image loading. - + @param imageCache The image cache. */ + (void)setSharedImageCache:(id )imageCache; @@ -59,7 +58,7 @@ /** The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. - + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer */ @property (nonatomic, strong) id imageResponseSerializer; @@ -69,8 +68,8 @@ ///-------------------- /** - Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. - + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` @@ -80,8 +79,8 @@ - (void)setImageWithURL:(NSURL *)url; /** - Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. - + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` @@ -90,24 +89,24 @@ @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. */ - (void)setImageWithURL:(NSURL *)url - placeholderImage:(UIImage *)placeholderImage; + placeholderImage:(nullable UIImage *)placeholderImage; /** - Asynchronously downloads an image from the specified URL request, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. - + Asynchronously downloads an image from the specified URL request, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. - + If a success block is specified, it is the responsibility of the block to set the image of the image view before returning. If no success block is specified, the default behavior of setting the image with `self.image = image` is applied. @param urlRequest The URL request used for the image request. @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. - @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the request and response parameters will be `nil`. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the response parameter will be `nil`. @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error object describing the network or parsing error that occurred. */ - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest - placeholderImage:(UIImage *)placeholderImage - success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success - failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; + placeholderImage:(nullable UIImage *)placeholderImage + success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; /** Cancels any executing image operation for the receiver, if one exists. @@ -121,22 +120,20 @@ /** The `AFImageCache` protocol is adopted by an object used to cache images loaded by the AFNetworking category on `UIImageView`. */ -@protocol AFImageCache - -- (void)clearCachedRequest:(NSURLRequest *)request; +@protocol AFImageCache /** - Returns a cached image for the specififed request, if available. - + Returns a cached image for the specified request, if available. + @param request The image request. - + @return The cached image. */ -- (UIImage *)cachedImageForRequest:(NSURLRequest *)request; +- (nullable UIImage *)cachedImageForRequest:(NSURLRequest *)request; /** Caches a particular image for the specified request. - + @param image The image to cache. @param request The request to be used as a cache key. */ @@ -144,4 +141,6 @@ forRequest:(NSURLRequest *)request; @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m old mode 100755 new mode 100644 similarity index 91% rename from Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m index f815e69..c1b0e1b --- a/Ryff/Frameworks/UIKit+AFNetworking/UIImageView+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m @@ -1,6 +1,5 @@ // UIImageView+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -63,17 +62,6 @@ - (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperat #pragma mark - @implementation UIImageView (AFNetworking) - -+ (void)clearImageCacheForURL:(NSURL *)url { - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; - - UIImage *cachedImage = [[self sharedImageCache] cachedImageForRequest:request]; - if (cachedImage) { - [[self sharedImageCache] clearCachedRequest:request]; - } -} - @dynamic imageResponseSerializer; + (id )sharedImageCache { @@ -93,10 +81,12 @@ + (void)clearImageCacheForURL:(NSURL *)url { #pragma clang diagnostic pop } -+ (void)setSharedImageCache:(id)imageCache { ++ (void)setSharedImageCache:(id )imageCache { objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } +#pragma mark - + - (id )imageResponseSerializer { static id _af_defaultImageResponseSerializer = nil; static dispatch_once_t onceToken; @@ -139,7 +129,7 @@ - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; if (cachedImage) { if (success) { - success(nil, nil, cachedImage); + success(urlRequest, nil, cachedImage); } else { self.image = cachedImage; } @@ -149,7 +139,7 @@ - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest if (placeholderImage) { self.image = placeholderImage; } - + __weak __typeof(self)weakSelf = self; self.af_imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; self.af_imageRequestOperation.responseSerializer = self.imageResponseSerializer; @@ -200,12 +190,6 @@ - (void)cancelImageRequestOperation { @implementation AFImageCache -- (void)clearCachedRequest:(NSURLRequest *)request { - if (request) { - [self removeObjectForKey:AFImageCacheKeyFromURLRequest(request)]; - } -} - - (UIImage *)cachedImageForRequest:(NSURLRequest *)request { switch ([request cachePolicy]) { case NSURLRequestReloadIgnoringCacheData: diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIKit+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h old mode 100755 new mode 100644 similarity index 97% rename from Ryff/Frameworks/UIKit+AFNetworking/UIKit+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h index 94082f6..49850ed --- a/Ryff/Frameworks/UIKit+AFNetworking/UIKit+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h @@ -20,6 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +#if TARGET_OS_IOS #import #ifndef _UIKIT_AFNETWORKING_ @@ -31,8 +32,8 @@ #import "UIAlertView+AFNetworking.h" #import "UIButton+AFNetworking.h" #import "UIImageView+AFNetworking.h" - #import "UIKit+AFNetworking.h" #import "UIProgressView+AFNetworking.h" #import "UIRefreshControl+AFNetworking.h" #import "UIWebView+AFNetworking.h" #endif /* _UIKIT_AFNETWORKING_ */ +#endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h old mode 100755 new mode 100644 similarity index 96% rename from Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h index 3f1bc08..5c00d6d --- a/Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h @@ -1,6 +1,5 @@ // UIProgressView+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,6 +27,8 @@ #import +NS_ASSUME_NONNULL_BEGIN + @class AFURLConnectionOperation; /** @@ -41,7 +42,7 @@ /** Binds the progress to the upload progress of the specified session task. - + @param task The session task. @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. */ @@ -85,4 +86,6 @@ @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m old mode 100755 new mode 100644 similarity index 93% rename from Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m index 7281149..ad2c280 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIProgressView+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m @@ -1,6 +1,5 @@ // UIProgressView+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -77,8 +76,8 @@ - (void)af_setDownloadProgressAnimated:(BOOL)animated { - (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task animated:(BOOL)animated { - [task addObserver:self forKeyPath:@"state" options:0 context:AFTaskCountOfBytesSentContext]; - [task addObserver:self forKeyPath:@"countOfBytesSent" options:0 context:AFTaskCountOfBytesSentContext]; + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + [task addObserver:self forKeyPath:@"countOfBytesSent" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; [self af_setUploadProgressAnimated:animated]; } @@ -86,8 +85,8 @@ - (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task - (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task animated:(BOOL)animated { - [task addObserver:self forKeyPath:@"state" options:0 context:AFTaskCountOfBytesReceivedContext]; - [task addObserver:self forKeyPath:@"countOfBytesReceived" options:0 context:AFTaskCountOfBytesReceivedContext]; + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + [task addObserver:self forKeyPath:@"countOfBytesReceived" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; [self af_setDownloadProgressAnimated:animated]; } diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h old mode 100755 new mode 100644 similarity index 91% rename from Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h index 37ce772..a65e390 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h @@ -28,10 +28,12 @@ #import +NS_ASSUME_NONNULL_BEGIN + @class AFURLConnectionOperation; /** - This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically begining and ending refreshing depending on the loading state of a request operation or session task. + This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically beginning and ending refreshing depending on the loading state of a request operation or session task. */ @interface UIRefreshControl (AFNetworking) @@ -42,7 +44,7 @@ /** Binds the refreshing state to the state of the specified task. - @param task The task. If `nil`, automatic updating from any previously specified operation will be diabled. + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. */ #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; @@ -61,4 +63,6 @@ @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m old mode 100755 new mode 100644 similarity index 51% rename from Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m index ba28157..4c19245 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m @@ -21,6 +21,7 @@ // THE SOFTWARE. #import "UIRefreshControl+AFNetworking.h" +#import #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) @@ -30,8 +31,51 @@ #import "AFURLSessionManager.h" #endif +@interface AFRefreshControlNotificationObserver : NSObject +@property (readonly, nonatomic, weak) UIRefreshControl *refreshControl; +- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; +#endif +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + @implementation UIRefreshControl (AFNetworking) +- (AFRefreshControlNotificationObserver *)af_notificationObserver { + AFRefreshControlNotificationObserver *notificationObserver = objc_getAssociatedObject(self, @selector(af_notificationObserver)); + if (notificationObserver == nil) { + notificationObserver = [[AFRefreshControlNotificationObserver alloc] initWithActivityRefreshControl:self]; + objc_setAssociatedObject(self, @selector(af_notificationObserver), notificationObserver, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return notificationObserver; +} + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { + [[self af_notificationObserver] setRefreshingWithStateOfTask:task]; +} +#endif + +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation { + [[self af_notificationObserver] setRefreshingWithStateOfOperation:operation]; +} + +@end + +@implementation AFRefreshControlNotificationObserver + +- (instancetype)initWithActivityRefreshControl:(UIRefreshControl *)refreshControl +{ + self = [super init]; + if (self) { + _refreshControl = refreshControl; + } + return self; +} + #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; @@ -41,17 +85,19 @@ - (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; if (task) { - if (task.state != NSURLSessionTaskStateCompleted) { - if (task.state == NSURLSessionTaskStateRunning) { - [self beginRefreshing]; - } else { - [self endRefreshing]; - } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" + if (task.state == NSURLSessionTaskStateRunning) { + [self.refreshControl beginRefreshing]; [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task]; [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task]; [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task]; + } else { + [self.refreshControl endRefreshing]; } +#pragma clang diagnostic pop } } #endif @@ -63,16 +109,20 @@ - (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; if (operation) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" +#pragma clang diagnostic ignored "-Warc-repeated-use-of-weak" if (![operation isFinished]) { if ([operation isExecuting]) { - [self beginRefreshing]; + [self.refreshControl beginRefreshing]; } else { - [self endRefreshing]; + [self.refreshControl endRefreshing]; } [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingOperationDidStartNotification object:operation]; [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingOperationDidFinishNotification object:operation]; } +#pragma clang diagnostic pop } } @@ -80,16 +130,37 @@ - (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation - (void)af_beginRefreshing { dispatch_async(dispatch_get_main_queue(), ^{ - [self beginRefreshing]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.refreshControl beginRefreshing]; +#pragma clang diagnostic pop }); } - (void)af_endRefreshing { dispatch_async(dispatch_get_main_queue(), ^{ - [self endRefreshing]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreceiver-is-weak" + [self.refreshControl endRefreshing]; +#pragma clang diagnostic pop }); } +#pragma mark - + +- (void)dealloc { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; +#endif + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; +} + @end #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.h b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h old mode 100755 new mode 100644 similarity index 86% rename from Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.h rename to Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h index 202e8f4..5d61d6a --- a/Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.h +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h @@ -1,6 +1,5 @@ // UIWebView+AFNetworking.h -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -28,12 +27,14 @@ #import +NS_ASSUME_NONNULL_BEGIN + @class AFHTTPRequestSerializer, AFHTTPResponseSerializer; @protocol AFURLRequestSerialization, AFURLResponseSerialization; /** This category adds methods to the UIKit framework's `UIWebView` class. The methods in this category provide increased control over the request cycle, including progress monitoring and success / failure handling. - + @discussion When using these category methods, make sure to assign `delegate` for the web view, which implements `–webView:shouldStartLoadWithRequest:navigationType:` appropriately. This allows for tapped links to be loaded through AFNetworking, and can ensure that `canGoBack` & `canGoForward` update their values correctly. */ @interface UIWebView (AFNetworking) @@ -50,16 +51,16 @@ /** Asynchronously loads the specified request. - + @param request A URL request identifying the location of the content to load. This must not be `nil`. @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. @param success A block object to be executed when the request finishes loading successfully. This block returns the HTML string to be loaded by the web view, and takes two arguments: the response, and the response string. @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. */ - (void)loadRequest:(NSURLRequest *)request - progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress - success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success - failure:(void (^)(NSError *error))failure; + progress:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(nullable NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(nullable void (^)(NSError *error))failure; /** Asynchronously loads the data associated with a particular request with a specified MIME type and text encoding. @@ -72,12 +73,14 @@ @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. */ - (void)loadRequest:(NSURLRequest *)request - MIMEType:(NSString *)MIMEType - textEncodingName:(NSString *)textEncodingName - progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress - success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success - failure:(void (^)(NSError *error))failure; + MIMEType:(nullable NSString *)MIMEType + textEncodingName:(nullable NSString *)textEncodingName + progress:(nullable void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(nullable NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(nullable void (^)(NSError *error))failure; @end +NS_ASSUME_NONNULL_END + #endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.m b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m old mode 100755 new mode 100644 similarity index 94% rename from Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.m rename to Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m index 525d02a..93eacaa --- a/Ryff/Frameworks/UIKit+AFNetworking/UIWebView+AFNetworking.m +++ b/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m @@ -1,6 +1,5 @@ // UIWebView+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -136,6 +135,11 @@ - (void)loadRequest:(NSURLRequest *)request #pragma clang diagnostic ignored "-Wgnu" __strong __typeof(weakSelf) strongSelf = weakSelf; [strongSelf loadData:data MIMEType:(MIMEType ?: [operation.response MIMEType]) textEncodingName:(textEncodingName ?: [operation.response textEncodingName]) baseURL:[operation.response URL]]; + + if ([strongSelf.delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) { + [strongSelf.delegate webViewDidFinishLoad:strongSelf]; + } + #pragma clang diagnostic pop } failure:^(AFHTTPRequestOperation * __unused operation, NSError *error) { if (failure) { @@ -144,6 +148,10 @@ - (void)loadRequest:(NSURLRequest *)request }]; [self.af_HTTPRequestOperation start]; + + if ([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) { + [self.delegate webViewDidStartLoad:self]; + } } @end diff --git a/Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h b/Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h old mode 100755 new mode 100644 similarity index 86% rename from Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h rename to Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h index 3380f97..4788aed --- a/Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h +++ b/Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h @@ -55,6 +55,21 @@ extern NSString *const CHTCollectionElementKindSectionFooter; - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; @optional +/** + * Asks the delegate for the column count in a section + * + * @param collectionView + * The collection view object displaying the waterfall layout. + * @param collectionViewLayout + * The layout object requesting the information. + * @param section + * The section. + * + * @return + * The original column count for that section. Must be greater than 0. + */ +- (NSInteger)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout columnCountForSection:(NSInteger)section; + /** * Asks the delegate for the height of the header view in the specified section. * @@ -171,6 +186,25 @@ extern NSString *const CHTCollectionElementKindSectionFooter; */ - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section; +/** + * Asks the delegate for the minimum spacing between colums in a secified section. If this method is not implemented, the + * minimumColumnSpacing property is used for all sections. + * + * @param collectionView + * The collection view object displaying the waterfall layout. + * @param collectionViewLayout + * The layout object requesting the information. + * @param section + * The index of the section whose minimum interitem spacing is being requested. + * + * @discussion + * If you do not implement this method, the waterfall layout uses the value in its minimumColumnSpacing property to determine the amount of space between columns in each section. + * + * @return + * The minimum spacing between each column. + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumColumnSpacingForSectionAtIndex:(NSInteger)section; + @end #pragma mark - CHTCollectionViewWaterfallLayout @@ -272,6 +306,15 @@ extern NSString *const CHTCollectionElementKindSectionFooter; */ @property (nonatomic, assign) CHTCollectionViewWaterfallLayoutItemRenderDirection itemRenderDirection; +/** + * @brief The minimum height of the collection view's content. + * @discussion + * The minimum height of the collection view's content. This could be used to allow hidden headers with no content. + * + * Default: 0.f + */ +@property (nonatomic, assign) CGFloat minimumContentHeight; + /** * @brief The calculated width of an item in the specified section. * @discussion diff --git a/Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m b/Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m old mode 100755 new mode 100644 similarity index 73% rename from Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m rename to Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m index 9e4cb19..86f442c --- a/Ryff/Frameworks/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m +++ b/Pods/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.m @@ -6,6 +6,7 @@ // #import "CHTCollectionViewWaterfallLayout.h" +#import "tgmath.h" NSString *const CHTCollectionElementKindSectionHeader = @"CHTCollectionElementKindSectionHeader"; NSString *const CHTCollectionElementKindSectionFooter = @"CHTCollectionElementKindSectionFooter"; @@ -30,7 +31,12 @@ @interface CHTCollectionViewWaterfallLayout () @implementation CHTCollectionViewWaterfallLayout /// How many items to be union into a single rectangle -const NSInteger unionSize = 20; +static const NSInteger unionSize = 20; + +static CGFloat CHTFloorCGFloat(CGFloat value) { + CGFloat scale = [UIScreen mainScreen].scale; + return floor(value * scale) / scale; +} #pragma mark - Public Accessors - (void)setColumnCount:(NSInteger)columnCount { @@ -68,7 +74,7 @@ - (void)setFooterHeight:(CGFloat)footerHeight { } } -- (void)setHeaderInset:(UIEdgeInsets)headerInset{ +- (void)setHeaderInset:(UIEdgeInsets)headerInset { if (!UIEdgeInsetsEqualToEdgeInsets(_headerInset, headerInset)) { _headerInset = headerInset; [self invalidateLayout]; @@ -96,6 +102,14 @@ - (void)setItemRenderDirection:(CHTCollectionViewWaterfallLayoutItemRenderDirect } } +- (NSInteger)columnCountForSection:(NSInteger)section { + if ([self.delegate respondsToSelector:@selector(collectionView:layout:columnCountForSection:)]) { + return [self.delegate collectionView:self.collectionView layout:self columnCountForSection:section]; + } else { + return self.columnCount; + } +} + - (CGFloat)itemWidthInSectionAtIndex:(NSInteger)section { UIEdgeInsets sectionInset; if ([self.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)]) { @@ -103,8 +117,15 @@ - (CGFloat)itemWidthInSectionAtIndex:(NSInteger)section { } else { sectionInset = self.sectionInset; } - CGFloat width = self.collectionView.frame.size.width - sectionInset.left - sectionInset.right; - return floorf((width - (self.columnCount - 1) * self.minimumColumnSpacing) / self.columnCount); + CGFloat width = self.collectionView.bounds.size.width - sectionInset.left - sectionInset.right; + NSInteger columnCount = [self columnCountForSection:section]; + + CGFloat columnSpacing = self.minimumColumnSpacing; + if ([self.delegate respondsToSelector:@selector(collectionView:layout:minimumColumnSpacingForSectionAtIndex:)]) { + columnSpacing = [self.delegate collectionView:self.collectionView layout:self minimumColumnSpacingForSectionAtIndex:section]; + } + + return CHTFloorCGFloat((width - (columnCount - 1) * columnSpacing) / columnCount); } #pragma mark - Private Accessors @@ -150,8 +171,8 @@ - (NSMutableArray *)sectionItemAttributes { return _sectionItemAttributes; } -- (id)delegate { - return (id)self.collectionView.delegate; +- (id )delegate { + return (id )self.collectionView.delegate; } #pragma mark - Init @@ -185,28 +206,32 @@ - (id)initWithCoder:(NSCoder *)aDecoder { - (void)prepareLayout { [super prepareLayout]; + [self.headersAttribute removeAllObjects]; + [self.footersAttribute removeAllObjects]; + [self.unionRects removeAllObjects]; + [self.columnHeights removeAllObjects]; + [self.allItemAttributes removeAllObjects]; + [self.sectionItemAttributes removeAllObjects]; + NSInteger numberOfSections = [self.collectionView numberOfSections]; if (numberOfSections == 0) { return; } NSAssert([self.delegate conformsToProtocol:@protocol(CHTCollectionViewDelegateWaterfallLayout)], @"UICollectionView's delegate should conform to CHTCollectionViewDelegateWaterfallLayout protocol"); - NSAssert(self.columnCount > 0, @"UICollectionViewWaterfallLayout's columnCount should be greater than 0"); + NSAssert(self.columnCount > 0 || [self.delegate respondsToSelector:@selector(collectionView:layout:columnCountForSection:)], @"UICollectionViewWaterfallLayout's columnCount should be greater than 0, or delegate must implement columnCountForSection:"); // Initialize variables NSInteger idx = 0; - [self.headersAttribute removeAllObjects]; - [self.footersAttribute removeAllObjects]; - [self.unionRects removeAllObjects]; - [self.columnHeights removeAllObjects]; - [self.allItemAttributes removeAllObjects]; - [self.sectionItemAttributes removeAllObjects]; - - for (idx = 0; idx < self.columnCount; idx++) { - [self.columnHeights addObject:@(0)]; + for (NSInteger section = 0; section < numberOfSections; section++) { + NSInteger columnCount = [self columnCountForSection:section]; + NSMutableArray *sectionColumnHeights = [NSMutableArray arrayWithCapacity:columnCount]; + for (idx = 0; idx < columnCount; idx++) { + [sectionColumnHeights addObject:@(0)]; + } + [self.columnHeights addObject:sectionColumnHeights]; } - // Create attributes CGFloat top = 0; UICollectionViewLayoutAttributes *attributes; @@ -222,6 +247,11 @@ - (void)prepareLayout { minimumInteritemSpacing = self.minimumInteritemSpacing; } + CGFloat columnSpacing = self.minimumColumnSpacing; + if ([self.delegate respondsToSelector:@selector(collectionView:layout:minimumColumnSpacingForSectionAtIndex:)]) { + columnSpacing = [self.delegate collectionView:self.collectionView layout:self minimumColumnSpacingForSectionAtIndex:section]; + } + UIEdgeInsets sectionInset; if ([self.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)]) { sectionInset = [self.delegate collectionView:self.collectionView layout:self insetForSectionAtIndex:section]; @@ -229,8 +259,9 @@ - (void)prepareLayout { sectionInset = self.sectionInset; } - CGFloat width = self.collectionView.frame.size.width - sectionInset.left - sectionInset.right; - CGFloat itemWidth = floorf((width - (self.columnCount - 1) * self.minimumColumnSpacing) / self.columnCount); + CGFloat width = self.collectionView.bounds.size.width - sectionInset.left - sectionInset.right; + NSInteger columnCount = [self columnCountForSection:section]; + CGFloat itemWidth = CHTFloorCGFloat((width - (columnCount - 1) * columnSpacing) / columnCount); /* * 2. Section header @@ -241,21 +272,21 @@ - (void)prepareLayout { } else { headerHeight = self.headerHeight; } - + UIEdgeInsets headerInset; if ([self.delegate respondsToSelector:@selector(collectionView:layout:insetForHeaderInSection:)]) { headerInset = [self.delegate collectionView:self.collectionView layout:self insetForHeaderInSection:section]; } else { headerInset = self.headerInset; } - + top += headerInset.top; if (headerHeight > 0) { attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:CHTCollectionElementKindSectionHeader withIndexPath:[NSIndexPath indexPathForItem:0 inSection:section]]; attributes.frame = CGRectMake(headerInset.left, top, - self.collectionView.frame.size.width - (headerInset.left + headerInset.right), + self.collectionView.bounds.size.width - (headerInset.left + headerInset.right), headerHeight); self.headersAttribute[@(section)] = attributes; @@ -265,8 +296,8 @@ - (void)prepareLayout { } top += sectionInset.top; - for (idx = 0; idx < self.columnCount; idx++) { - self.columnHeights[idx] = @(top); + for (idx = 0; idx < columnCount; idx++) { + self.columnHeights[section][idx] = @(top); } /* @@ -278,20 +309,20 @@ - (void)prepareLayout { // Item will be put into shortest column. for (idx = 0; idx < itemCount; idx++) { NSIndexPath *indexPath = [NSIndexPath indexPathForItem:idx inSection:section]; - NSUInteger columnIndex = [self nextColumnIndexForItem:idx]; - CGFloat xOffset = sectionInset.left + (itemWidth + self.minimumColumnSpacing) * columnIndex; - CGFloat yOffset = [self.columnHeights[columnIndex] floatValue]; + NSUInteger columnIndex = [self nextColumnIndexForItem:idx inSection:section]; + CGFloat xOffset = sectionInset.left + (itemWidth + columnSpacing) * columnIndex; + CGFloat yOffset = [self.columnHeights[section][columnIndex] floatValue]; CGSize itemSize = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath]; CGFloat itemHeight = 0; if (itemSize.height > 0 && itemSize.width > 0) { - itemHeight = floorf(itemSize.height * itemWidth / itemSize.width); + itemHeight = CHTFloorCGFloat(itemSize.height * itemWidth / itemSize.width); } attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; attributes.frame = CGRectMake(xOffset, yOffset, itemWidth, itemHeight); [itemAttributes addObject:attributes]; [self.allItemAttributes addObject:attributes]; - self.columnHeights[columnIndex] = @(CGRectGetMaxY(attributes.frame) + minimumInteritemSpacing); + self.columnHeights[section][columnIndex] = @(CGRectGetMaxY(attributes.frame) + minimumInteritemSpacing); } [self.sectionItemAttributes addObject:itemAttributes]; @@ -300,29 +331,29 @@ - (void)prepareLayout { * 4. Section footer */ CGFloat footerHeight; - NSUInteger columnIndex = [self longestColumnIndex]; - top = [self.columnHeights[columnIndex] floatValue] - minimumInteritemSpacing + sectionInset.bottom; + NSUInteger columnIndex = [self longestColumnIndexInSection:section]; + top = [self.columnHeights[section][columnIndex] floatValue] - minimumInteritemSpacing + sectionInset.bottom; if ([self.delegate respondsToSelector:@selector(collectionView:layout:heightForFooterInSection:)]) { footerHeight = [self.delegate collectionView:self.collectionView layout:self heightForFooterInSection:section]; } else { footerHeight = self.footerHeight; } - + UIEdgeInsets footerInset; if ([self.delegate respondsToSelector:@selector(collectionView:layout:insetForFooterInSection:)]) { footerInset = [self.delegate collectionView:self.collectionView layout:self insetForFooterInSection:section]; } else { footerInset = self.footerInset; } - + top += footerInset.top; if (footerHeight > 0) { attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:CHTCollectionElementKindSectionFooter withIndexPath:[NSIndexPath indexPathForItem:0 inSection:section]]; attributes.frame = CGRectMake(footerInset.left, top, - self.collectionView.frame.size.width - (footerInset.left + footerInset.right), + self.collectionView.bounds.size.width - (footerInset.left + footerInset.right), footerHeight); self.footersAttribute[@(section)] = attributes; @@ -331,8 +362,8 @@ - (void)prepareLayout { top = CGRectGetMaxY(attributes.frame) + footerInset.bottom; } - for (idx = 0; idx < self.columnCount; idx++) { - self.columnHeights[idx] = @(top); + for (idx = 0; idx < columnCount; idx++) { + self.columnHeights[section][idx] = @(top); } } // end of for (NSInteger section = 0; section < numberOfSections; ++section) @@ -340,11 +371,16 @@ - (void)prepareLayout { idx = 0; NSInteger itemCounts = [self.allItemAttributes count]; while (idx < itemCounts) { - CGRect rect1 = ((UICollectionViewLayoutAttributes *)self.allItemAttributes[idx]).frame; - idx = MIN(idx + unionSize, itemCounts) - 1; - CGRect rect2 = ((UICollectionViewLayoutAttributes *)self.allItemAttributes[idx]).frame; - [self.unionRects addObject:[NSValue valueWithCGRect:CGRectUnion(rect1, rect2)]]; - idx++; + CGRect unionRect = ((UICollectionViewLayoutAttributes *)self.allItemAttributes[idx]).frame; + NSInteger rectEndIndex = MIN(idx + unionSize, itemCounts); + + for (NSInteger i = idx + 1; i < rectEndIndex; i++) { + unionRect = CGRectUnion(unionRect, ((UICollectionViewLayoutAttributes *)self.allItemAttributes[i]).frame); + } + + idx = rectEndIndex; + + [self.unionRects addObject:[NSValue valueWithCGRect:unionRect]]; } } @@ -355,7 +391,11 @@ - (CGSize)collectionViewContentSize { } CGSize contentSize = self.collectionView.bounds.size; - contentSize.height = [self.columnHeights[0] floatValue]; + contentSize.height = [[[self.columnHeights lastObject] firstObject] floatValue]; + + if (contentSize.height < self.minimumContentHeight) { + contentSize.height = self.minimumContentHeight; + } return contentSize; } @@ -422,11 +462,11 @@ - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { * * @return index for the shortest column */ -- (NSUInteger)shortestColumnIndex { +- (NSUInteger)shortestColumnIndexInSection:(NSInteger)section { __block NSUInteger index = 0; __block CGFloat shortestHeight = MAXFLOAT; - [self.columnHeights enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [self.columnHeights[section] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CGFloat height = [obj floatValue]; if (height < shortestHeight) { shortestHeight = height; @@ -442,11 +482,11 @@ - (NSUInteger)shortestColumnIndex { * * @return index for the longest column */ -- (NSUInteger)longestColumnIndex { +- (NSUInteger)longestColumnIndexInSection:(NSInteger)section { __block NSUInteger index = 0; __block CGFloat longestHeight = 0; - [self.columnHeights enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [self.columnHeights[section] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CGFloat height = [obj floatValue]; if (height > longestHeight) { longestHeight = height; @@ -462,23 +502,24 @@ - (NSUInteger)longestColumnIndex { * * @return index for the next column */ -- (NSUInteger)nextColumnIndexForItem:(NSInteger)item { +- (NSUInteger)nextColumnIndexForItem:(NSInteger)item inSection:(NSInteger)section { NSUInteger index = 0; + NSInteger columnCount = [self columnCountForSection:section]; switch (self.itemRenderDirection) { case CHTCollectionViewWaterfallLayoutItemRenderDirectionShortestFirst: - index = [self shortestColumnIndex]; + index = [self shortestColumnIndexInSection:section]; break; case CHTCollectionViewWaterfallLayoutItemRenderDirectionLeftToRight: - index = (item % self.columnCount); + index = (item % columnCount); break; case CHTCollectionViewWaterfallLayoutItemRenderDirectionRightToLeft: - index = (self.columnCount - 1) - (item % self.columnCount); + index = (columnCount - 1) - (item % columnCount); break; default: - index = [self shortestColumnIndex]; + index = [self shortestColumnIndexInSection:section]; break; } return index; diff --git a/Pods/CHTCollectionViewWaterfallLayout/LICENSE b/Pods/CHTCollectionViewWaterfallLayout/LICENSE new file mode 100644 index 0000000..9bd6b8d --- /dev/null +++ b/Pods/CHTCollectionViewWaterfallLayout/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Nelson Tai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/CHTCollectionViewWaterfallLayout/README.md b/Pods/CHTCollectionViewWaterfallLayout/README.md new file mode 100644 index 0000000..66d2d5e --- /dev/null +++ b/Pods/CHTCollectionViewWaterfallLayout/README.md @@ -0,0 +1,99 @@ +CHTCollectionViewWaterfallLayout +=============================== + +[![Version](https://cocoapod-badges.herokuapp.com/v/CHTCollectionViewWaterfallLayout/badge.png)](http://cocoadocs.org/docsets/CHTCollectionViewWaterfallLayout) +[![Platform](https://cocoapod-badges.herokuapp.com/p/CHTCollectionViewWaterfallLayout/badge.png)](http://cocoadocs.org/docsets/CHTCollectionViewWaterfallLayout) +[![Build Status](https://travis-ci.org/chiahsien/CHTCollectionViewWaterfallLayout.svg?branch=develop)](https://travis-ci.org/chiahsien/CHTCollectionViewWaterfallLayout) + +**CHTCollectionViewWaterfallLayout** is a subclass of [UICollectionViewLayout], and it trys to imitate [UICollectionViewFlowLayout]'s usage as much as possible. + +This layout is inspired by [Pinterest]. It also is compatible with [PSTCollectionView]. + +Screen Shots +------------ +![2 columns](https://cloud.githubusercontent.com/assets/474/3419095/25b4de9e-fe56-11e3-9b98-690319d736ce.png) + +Features +-------- +* Easy to use, it trys to imitate [UICollectionViewFlowLayout]'s usage as much as possible. +* Highly customizable. +* Outstanding performance, try 10,000+ items and see the smoothness for yourself. +* Support header and footer views. +* Different column counts in different sections. + +Prerequisite +------------ +* ARC +* Xcode 4.4+, which supports literals syntax. +* iOS 6+, or +* iOS 4.x/5.x, with [PSTCollectionView]. + +How to install +-------------- +* [CocoaPods] + Add `pod 'CHTCollectionViewWaterfallLayout'` to your podfile. +* Manual + Copy `CHTCollectionViewWaterfallLayout.h/m` to your project. + +How to Use +---------- +Read the demo codes and `CHTCollectionViewWaterfallLayout.h` header file for more information. + +#### Step 1 +Below lists the properties for you to customize the layout. Although they have default values, I strongly recommand you to set up at least the `columnCount` property to suit your needs. +The `itemRenderDirection` property is an enum which decides the order in which your items will be rendered in subsequent rows. For eg. Left-Right | Right-Left | Shortest column filling up first. + +``` objc +@property (nonatomic, assign) NSInteger columnCount; +@property (nonatomic, assign) CGFloat minimumColumnSpacing; +@property (nonatomic, assign) CGFloat minimumInteritemSpacing; +@property (nonatomic, assign) CGFloat headerHeight; +@property (nonatomic, assign) CGFloat footerHeight; +@property (nonatomic, assign) UIEdgeInsets sectionInset; +@property (nonatomic, assign) ItemRenderDirection itemRenderDirection; +``` + +#### Step 2 +Your collection view's delegate (which often is your view controller) must conforms to `CHTCollectionViewDelegateWaterfallLayout` protocol and implements the required method, all you need to do is return the original size of the item: + +``` objc +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; +``` + +#### Step 3 (Optional) +If you need to support iOS 4.x/5.x and you have installed [PSTCollectionView], then you **NEED** to modify some codes. + +Quoted from [PSTCollectionView] README file: +> **If you want to have PSTCollectionView on iOS4.3/5.x and UICollectionView on iOS6, use PSUICollectionView (basically add PS on any UICollectionView* class to get auto-support for older iOS versions)** +> If you always want to use PSTCollectionView, use PSTCollectionView as class names. (replace the UI with PST) + +Limitation +---------- +* Only vertical scrolling is supported. +* No decoration view. + +Who is using it +--------------- +Please let me know if your app is using this library. I'm glad to put your app on the list :-) + +* [F3PiX](https://itunes.apple.com/us/app/samenwerken-f3pix/id897714553?mt=8) +F3PiX is a series of apps which gives you a concise, curated collection of pictures by professional (Dutch) photographers according to a specific theme. You can use the pictures freely for your own work. +* [GroupMe for iOS](https://itunes.apple.com/us/app/groupme/id392796698?mt=8) +GroupMe - A Home for All the Groups in Your Life. +* [Flickr](https://itunes.apple.com/us/app/id328407587) +Access and organize your photos from anywhere. + +License +------- +CHTCollectionViewWaterfallLayout is available under the MIT license. See the LICENSE file for more info. + +Changelog +--------- +Refer to the [Releases page](https://github.com/chiahsien/CHTCollectionViewWaterfallLayout/releases). + +[UICollectionViewLayout]: http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewLayout_class/Reference/Reference.html +[UICollectionViewFlowLayout]: https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewFlowLayout_class/Reference/Reference.html +[Pinterest]: http://pinterest.com/ +[PSTCollectionView]: https://github.com/steipete/PSTCollectionView +[CocoaPods]: http://cocoapods.org/ + diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 0000000..ac762c8 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 0000000..9dcc623 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h b/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 0000000..56feb9f --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h b/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..67519d9 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h b/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 0000000..68fc774 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFNetworking.h b/Pods/Headers/Private/AFNetworking/AFNetworking.h new file mode 120000 index 0000000..a5a38da --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h b/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 0000000..fd1322d --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h b/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 0000000..d9b35fb --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h b/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 0000000..ca8209b --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h b/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 0000000..e36a765 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h b/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h new file mode 120000 index 0000000..835101d --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 0000000..c534ebf --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 0000000..f992813 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 0000000..8f2e221 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h new file mode 120000 index 0000000..74f6649 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIImage+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImage+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 0000000..a95d673 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 0000000..95017cc --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 0000000..730b167 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 0000000..8efd826 --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h b/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 0000000..c8df6ef --- /dev/null +++ b/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/Pods/Headers/Private/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h b/Pods/Headers/Private/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h new file mode 120000 index 0000000..d70aede --- /dev/null +++ b/Pods/Headers/Private/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h @@ -0,0 +1 @@ +../../../CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.h b/Pods/Headers/Private/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.h new file mode 120000 index 0000000..e4c30ea --- /dev/null +++ b/Pods/Headers/Private/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.h @@ -0,0 +1 @@ +../../../KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/MBProgressHUD/MBProgressHUD.h b/Pods/Headers/Private/MBProgressHUD/MBProgressHUD.h new file mode 120000 index 0000000..19ed4db --- /dev/null +++ b/Pods/Headers/Private/MBProgressHUD/MBProgressHUD.h @@ -0,0 +1 @@ +../../../MBProgressHUD/MBProgressHUD.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h b/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h new file mode 120000 index 0000000..8457498 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/NSData+ImageContentType.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDImageCache.h b/Pods/Headers/Private/SDWebImage/SDImageCache.h new file mode 120000 index 0000000..0040b06 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDImageCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDImageCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h b/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h new file mode 120000 index 0000000..6ca2478 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageCompat.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageDecoder.h b/Pods/Headers/Private/SDWebImage/SDWebImageDecoder.h new file mode 120000 index 0000000..a2f3a68 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageDecoder.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDecoder.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h b/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h new file mode 120000 index 0000000..303b03b --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDownloader.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h new file mode 120000 index 0000000..99441c4 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageManager.h b/Pods/Headers/Private/SDWebImage/SDWebImageManager.h new file mode 120000 index 0000000..1b81848 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageManager.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h b/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h new file mode 120000 index 0000000..20e5b89 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h b/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h new file mode 120000 index 0000000..50585c6 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImagePrefetcher.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h b/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h new file mode 120000 index 0000000..19d2d8e --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIButton+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImage+GIF.h b/Pods/Headers/Private/SDWebImage/UIImage+GIF.h new file mode 120000 index 0000000..14d5aad --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIImage+GIF.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImage+GIF.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h b/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h new file mode 120000 index 0000000..1fb9650 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImage+MultiFormat.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h new file mode 120000 index 0000000..fd4dea4 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h b/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h new file mode 120000 index 0000000..0c53a47 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImageView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h b/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h new file mode 120000 index 0000000..f9890c4 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIView+WebCacheOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SSKeychain/SSKeychain.h b/Pods/Headers/Private/SSKeychain/SSKeychain.h new file mode 120000 index 0000000..9b8e916 --- /dev/null +++ b/Pods/Headers/Private/SSKeychain/SSKeychain.h @@ -0,0 +1 @@ +../../../SSKeychain/SSKeychain/SSKeychain.h \ No newline at end of file diff --git a/Pods/Headers/Private/SSKeychain/SSKeychainQuery.h b/Pods/Headers/Private/SSKeychain/SSKeychainQuery.h new file mode 120000 index 0000000..05b89a8 --- /dev/null +++ b/Pods/Headers/Private/SSKeychain/SSKeychainQuery.h @@ -0,0 +1 @@ +../../../SSKeychain/SSKeychain/SSKeychainQuery.h \ No newline at end of file diff --git a/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.h b/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.h new file mode 100644 index 0000000..3f397f5 --- /dev/null +++ b/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.h @@ -0,0 +1,144 @@ +// Copyright (c) 2014 Kevin Lundberg. + +@import UIKit; + +NS_ASSUME_NONNULL_BEGIN + +@protocol KRLCollectionViewDelegateGridLayout + +@optional +/** + Asks the delegate for the margins to apply to content in the specified section. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose insets are needed. + + @return The margins to apply to items in the section. + + @discussion The return value of this method is applied to it's desired section in the same way as UICollectionViewFlowLayout uses it (applies it to section items only, not headers and footers). + */ +- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section; + +/** + Asks the delegate for the amount of spacing between lines that the given section should have. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose line spacing is needed. + + @return The line spacing the layout should use between lines of cells in the section at the given index. + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout lineSpacingForSectionAtIndex:(NSInteger)section; + +/** + Asks the delegate for the amount of spacing between cells on the sanme line that the given section should have. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose inter-item spacing is needed. + + @return The inter-item spacing the layout should use between cells on the same line in the section at the given index + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout interitemSpacingForSectionAtIndex:(NSInteger)section; + +/** + Asks the delegate for the number of columns the given section should have. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose column count is needed + + @return The number of columns the layout should use for the section at the given index. + */ + +- (NSInteger)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout numberItemsPerLineForSectionAtIndex:(NSInteger)section; + +/** + Asks the delegate for the aspect ratio that items in the given section should have + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose item aspect ratio is needed + + @return The aspect ratio the layout should use for items in the section at the given index. + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout aspectRatioForItemsInSectionAtIndex:(NSInteger)section; + +/** + Asks the delegate for the length of the header in the given section. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose header length is needed. + + @return The length of the header for the section at the given index. A length of 0 prevents the header from being created. + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceLengthForHeaderInSection:(NSInteger)section; + +/** + Asks the delegate for the length of the footer in the given section. + + @param collectionView The collection view object displaying the grid layout. + @param collectionViewLayout The layout object requesting the information. + @param section The index number of the section whose footer length is needed. + + @return The length of the footer for the section at the given index. A length of 0 prevents the header from being created. + */ +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceLengthForFooterInSection:(NSInteger)section; + +@end + +/** + A layout that positions and sizes cells based on the numberOfItemsPerLine and aspectRatio properties. + */ +@interface KRLCollectionViewGridLayout : UICollectionViewLayout + +/** + Controls whether or not the user scrolls vertically or horizontally. + If vertical, cells lay out left to right and new lines lay out below. + If horizontal, cells lay out top to bottom and new lines lay out to the right. + Defaults to vertical. + */ +@property (nonatomic, assign) IBInspectable UICollectionViewScrollDirection scrollDirection; +/** + If specified, each section will have a border around it defined by these insets. + Defaults to UIEdgeInsetsZero. + */ +@property (nonatomic, assign) IBInspectable UIEdgeInsets sectionInset; +/** + How much space the layout should place between items on the same line. + Defaults to 10. + */ +@property (nonatomic, assign) IBInspectable CGFloat interitemSpacing; +/** + How much space the layout should place between lines. + Defaults to 10. + */ +@property (nonatomic, assign) IBInspectable CGFloat lineSpacing; +/** + How many items the layout should place on a single line. + Defaults to 10. + */ +@property (nonatomic, assign) IBInspectable NSInteger numberOfItemsPerLine; +/** + The ratio of every item's width to its height (regardless of scroll direction). + Defaults to 1 (square). + */ +@property (nonatomic, assign) IBInspectable CGFloat aspectRatio; +/** + The length of a header for all sections. Defaults to 0. + If scrollDirection is vertical, this length represents the height. If scrollDirection is horizontal, this length represents the width. + If the length is zero, no header is created. + */ +@property (nonatomic, assign) IBInspectable CGFloat headerReferenceLength; +/** + The length of a footer for all sections. Defaults to 0. + If scrollDirection is vertical, this length represents the height. If scrollDirection is horizontal, this length represents the width. + If the length is zero, no footer is created. + */ +@property (nonatomic, assign) IBInspectable CGFloat footerReferenceLength; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.m b/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.m new file mode 100644 index 0000000..f5a8d93 --- /dev/null +++ b/Pods/KRLCollectionViewGridLayout/Classes/KRLCollectionViewGridLayout.m @@ -0,0 +1,446 @@ +// Copyright (c) 2014 Kevin Lundberg. + +#import "KRLCollectionViewGridLayout.h" + +@interface KRLCollectionViewGridLayout () +/** dictionary keyed by supplementary attribute kind (header and footer), with values as dictionaries keyed by indexpath containing the attributes. */ +@property (nonatomic, strong) NSMutableDictionary *supplementaryAttributes; + +/** 2d array, outer array keyed by section, inner arrays keyed by row. */ +@property (nonatomic, strong) NSMutableArray *cellAttributesBySection; +@property (nonatomic, assign, readwrite) CGFloat collectionViewContentLength; +@end + +@implementation KRLCollectionViewGridLayout + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self sharedInit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self sharedInit]; + } + return self; +} + +- (void)sharedInit +{ + _numberOfItemsPerLine = 1; + _aspectRatio = 1; + _sectionInset = UIEdgeInsetsZero; + _interitemSpacing = 10; + _lineSpacing = 10; + _scrollDirection = UICollectionViewScrollDirectionVertical; + _headerReferenceLength = 0; + _footerReferenceLength = 0; +} + +- (void)prepareLayout +{ + [self calculateContentSize]; + [self calculateLayoutAttributes]; +} + +- (CGSize)collectionViewContentSize +{ + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + return CGSizeMake(self.collectionView.bounds.size.width, self.collectionViewContentLength); + } else { + return CGSizeMake(self.collectionViewContentLength, self.collectionView.bounds.size.height); + } +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect +{ + NSMutableArray *visibleAttributes = [NSMutableArray array]; + for (NSArray *sectionAttributes in self.cellAttributesBySection) { + for (UICollectionViewLayoutAttributes *attributes in sectionAttributes) { + if (CGRectIntersectsRect(rect, attributes.frame)) { + [visibleAttributes addObject:attributes]; + } + } + } + + [self.supplementaryAttributes enumerateKeysAndObjectsUsingBlock:^(NSString *kindKey, NSDictionary *attributesDict, BOOL *stop) { + [attributesDict enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *pathKey, UICollectionViewLayoutAttributes *attributes, BOOL *stop) { + if (CGRectIntersectsRect(rect, attributes.frame)) { + [visibleAttributes addObject:attributes]; + } + }]; + }]; + + return [visibleAttributes copy]; +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath +{ + return self.cellAttributesBySection[indexPath.section][indexPath.item]; +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath +{ + return self.supplementaryAttributes[elementKind][indexPath]; +} + +- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds +{ + return !CGSizeEqualToSize(newBounds.size, self.collectionView.bounds.size); +} + +- (void)calculateContentSize +{ + CGFloat contentLength = 0; + + NSInteger sections = [self.collectionView numberOfSections]; + for (NSInteger section = 0; section < sections; section++) { + contentLength += [self contentLengthForSection:section]; + } + + self.collectionViewContentLength = contentLength; +} + +- (CGFloat)contentLengthForSection:(NSInteger)section +{ + NSInteger rowsInSection = [self rowsInSection:section]; + + CGFloat contentLength = (rowsInSection - 1) * [self lineSpacingForSection:section]; + contentLength += [self lengthwiseInsetLengthInSection:section]; + + CGSize cellSize = [self cellSizeInSection:section]; + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + contentLength += rowsInSection * cellSize.height; + } else { + contentLength += rowsInSection * cellSize.width; + } + + + contentLength += [self headerLengthForSection:section]; + contentLength += [self footerLengthForSection:section]; + + return contentLength; +} + +- (NSInteger)rowsInSection:(NSInteger)section +{ + NSInteger itemsInSection = [self.collectionView numberOfItemsInSection:section]; + NSInteger numberOfItemsPerLine = [self numberOfItemsPerLineForSection:section]; + NSInteger rowsInSection = itemsInSection / numberOfItemsPerLine + (itemsInSection % numberOfItemsPerLine > 0 ? 1 : 0); + return rowsInSection; +} + +- (CGFloat)lengthwiseInsetLengthInSection:(NSInteger)section +{ + UIEdgeInsets sectionInset = [self sectionInsetForSection:section]; + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + return sectionInset.top + sectionInset.bottom; + } else { + return sectionInset.left + sectionInset.right; + } +} + +- (void)calculateLayoutAttributes +{ + self.cellAttributesBySection = [NSMutableArray array]; + + self.supplementaryAttributes = [NSMutableDictionary dictionary]; + self.supplementaryAttributes[UICollectionElementKindSectionHeader] = [NSMutableDictionary dictionary]; + self.supplementaryAttributes[UICollectionElementKindSectionFooter] = [NSMutableDictionary dictionary]; + + for (NSInteger section = 0; section < [self.collectionView numberOfSections]; section++) { + NSIndexPath *headerFooterPath = [NSIndexPath indexPathForItem:0 inSection:section]; + UICollectionViewLayoutAttributes *headerAttributes = [self headerAttributesForIndexPath:headerFooterPath]; + if (headerAttributes) { + self.supplementaryAttributes[UICollectionElementKindSectionHeader][headerFooterPath] = headerAttributes; + } + + [self.cellAttributesBySection addObject:[self layoutAttributesForItemsInSection:section]]; + + UICollectionViewLayoutAttributes *footerAttributes = [self footerAttributesForIndexPath:headerFooterPath]; + if (footerAttributes) { + self.supplementaryAttributes[UICollectionElementKindSectionFooter][headerFooterPath] = footerAttributes; + } + } +} + +- (UICollectionViewLayoutAttributes *)headerAttributesForIndexPath:(NSIndexPath *)path +{ + CGFloat headerReferenceLength = [self headerLengthForSection:path.section]; + if (headerReferenceLength == 0) { + return nil; + } + + UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader withIndexPath:path]; + + CGRect frame = CGRectZero; + + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + frame.size.width = self.collectionViewContentSize.width; + frame.size.height = headerReferenceLength; + frame.origin.x = 0; + frame.origin.y = [self startOfSection:path.section]; + } else { + frame.size.width = headerReferenceLength; + frame.size.height = self.collectionViewContentSize.height; + frame.origin.x = [self startOfSection:path.section]; + frame.origin.y = 0; + } + + attributes.frame = frame; + + return attributes; +} + +- (UICollectionViewLayoutAttributes *)footerAttributesForIndexPath:(NSIndexPath *)path +{ + CGFloat footerReferenceLength = [self footerLengthForSection:path.section]; + if (footerReferenceLength == 0) { + return nil; + } + + UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter withIndexPath:path]; + + CGRect frame = CGRectZero; + + CGFloat sectionStart = [self startOfSection:path.section]; + CGFloat sectionLength = [self contentLengthForSection:path.section]; + + CGFloat footerStart = sectionStart + sectionLength; + if (footerReferenceLength > 0) { + footerStart = footerStart - footerReferenceLength; + } + + + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + frame.size.width = self.collectionViewContentSize.width; + frame.size.height = footerReferenceLength; + frame.origin.x = 0; + frame.origin.y = footerStart; + } else { + frame.size.width = footerReferenceLength; + frame.size.height = self.collectionViewContentSize.height; + frame.origin.x = footerStart; + frame.origin.y = 0; + } + + attributes.frame = frame; + + return attributes; +} + +- (NSArray *)layoutAttributesForItemsInSection:(NSInteger)section +{ + NSMutableArray *attributes = [NSMutableArray array]; + for (NSInteger item = 0; item < [self.collectionView numberOfItemsInSection:section]; item++) { + [attributes addObject:[self layoutAttributesForCellAtIndexPath:[NSIndexPath indexPathForItem:item inSection:section]]]; + } + return attributes; +} + +- (UIEdgeInsets)sectionInsetForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self insetForSectionAtIndex:section]; + } else { + return self.sectionInset; + } +} + +- (CGFloat)lineSpacingForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:lineSpacingForSectionAtIndex:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self lineSpacingForSectionAtIndex:section]; + } else { + return self.lineSpacing; + } +} + +- (CGFloat)interitemSpacingForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:interitemSpacingForSectionAtIndex:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self interitemSpacingForSectionAtIndex:section]; + } else { + return self.interitemSpacing; + } +} + +- (CGFloat)headerLengthForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:referenceLengthForHeaderInSection:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self referenceLengthForHeaderInSection:section]; + } else { + return self.headerReferenceLength; + } +} + +- (CGFloat)footerLengthForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:referenceLengthForFooterInSection:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self referenceLengthForFooterInSection:section]; + } else { + return self.footerReferenceLength; + } +} + +- (NSInteger)numberOfItemsPerLineForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:numberItemsPerLineForSectionAtIndex:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self numberItemsPerLineForSectionAtIndex:section]; + } else { + return self.numberOfItemsPerLine; + } +} + +- (CGFloat)aspectRatioForSection:(NSInteger)section +{ + if ([self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:aspectRatioForItemsInSectionAtIndex:)]) { + return [(id)self.collectionView.delegate collectionView:self.collectionView layout:self aspectRatioForItemsInSectionAtIndex:section]; + } else { + return self.aspectRatio; + } +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForCellAtIndexPath:(NSIndexPath *)indexPath +{ + UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; + + attributes.frame = [self frameForItemAtIndexPath:indexPath]; + + return attributes; +} + +- (CGRect)frameForItemAtIndexPath:(NSIndexPath *)indexPath +{ + CGSize cellSize = [self cellSizeInSection:indexPath.section]; + NSInteger numberOfItemsPerLine = [self numberOfItemsPerLineForSection:indexPath.section]; + NSInteger rowOfItem = indexPath.item / numberOfItemsPerLine; + NSInteger locationInRowOfItem = indexPath.item % numberOfItemsPerLine; + + CGRect frame = CGRectZero; + + CGFloat sectionStart = [self startOfSection:indexPath.section]; + CGFloat headerReferenceLength = [self headerLengthForSection:indexPath.section]; + if (headerReferenceLength > 0) { + sectionStart += headerReferenceLength; + } + + UIEdgeInsets sectionInset = [self sectionInsetForSection:indexPath.section]; + CGFloat lineSpacing = [self lineSpacingForSection:indexPath.section]; + CGFloat interitemSpacing = [self interitemSpacingForSection:indexPath.section]; + + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + frame.origin.x = sectionInset.left + (locationInRowOfItem * cellSize.width) + (interitemSpacing * locationInRowOfItem); + frame.origin.y = sectionStart + sectionInset.top + (rowOfItem * cellSize.height) + (lineSpacing * rowOfItem); + } else { + frame.origin.x = sectionStart + sectionInset.left + (rowOfItem * cellSize.width) + (lineSpacing * rowOfItem); + frame.origin.y = sectionInset.top + (locationInRowOfItem * cellSize.height) + (interitemSpacing * locationInRowOfItem); + } + frame.size = cellSize; + + return frame; +} + +- (CGFloat)startOfSection:(NSInteger)section +{ + CGFloat startOfSection = 0; + for (NSInteger currentSection = 0; currentSection < section; currentSection++) { + startOfSection += [self contentLengthForSection:currentSection]; + } + return startOfSection; +} + +- (CGSize)cellSizeInSection:(NSInteger)section +{ + CGFloat usableSpace = [self usableSpaceInSection:section]; + CGFloat cellLength = usableSpace / [self numberOfItemsPerLineForSection:section]; + CGFloat aspectRatio = [self aspectRatioForSection:section]; + + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + return CGSizeMake(cellLength, + cellLength * (1.0 / aspectRatio)); + } else { + return CGSizeMake(cellLength * aspectRatio, + cellLength); + } +} + +- (CGFloat)usableSpaceInSection:(NSInteger)section +{ + UIEdgeInsets sectionInset = [self sectionInsetForSection:section]; + CGFloat interitemSpacing = [self interitemSpacingForSection:section]; + NSInteger numberOfItemsPerLine = [self numberOfItemsPerLineForSection:section]; + + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + return (self.collectionViewContentSize.width + - sectionInset.left + - sectionInset.right + - ((numberOfItemsPerLine - 1) * interitemSpacing)); + } else { + return (self.collectionViewContentSize.height + - sectionInset.top + - sectionInset.bottom + - ((numberOfItemsPerLine - 1) * interitemSpacing)); + } +} + +- (void)setNumberOfItemsPerLine:(NSInteger)numberOfItemsPerLine +{ + if (_numberOfItemsPerLine != numberOfItemsPerLine) { + _numberOfItemsPerLine = numberOfItemsPerLine; + + [self invalidateLayout]; + } +} + +- (void)setInteritemSpacing:(CGFloat)interitemSpacing { + if (_interitemSpacing != interitemSpacing) { + _interitemSpacing = interitemSpacing; + + [self invalidateLayout]; + } +} + +- (void)setLineSpacing:(CGFloat)lineSpacing +{ + if (_lineSpacing != lineSpacing) { + _lineSpacing = lineSpacing; + + [self invalidateLayout]; + } +} + +- (void)setSectionInset:(UIEdgeInsets)sectionInset +{ + if (!UIEdgeInsetsEqualToEdgeInsets(_sectionInset, sectionInset)) { + _sectionInset = sectionInset; + + [self invalidateLayout]; + } +} + +- (void)setAspectRatio:(CGFloat)aspectRatio +{ + if (_aspectRatio != aspectRatio) { + _aspectRatio = aspectRatio; + + [self invalidateLayout]; + } +} + +- (void)setScrollDirection:(UICollectionViewScrollDirection)scrollDirection +{ + if (_scrollDirection != scrollDirection) { + _scrollDirection = scrollDirection; + + [self invalidateLayout]; + } +} + +@end diff --git a/Pods/KRLCollectionViewGridLayout/LICENSE b/Pods/KRLCollectionViewGridLayout/LICENSE new file mode 100644 index 0000000..1d0ffe3 --- /dev/null +++ b/Pods/KRLCollectionViewGridLayout/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Kevin Lundberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/KRLCollectionViewGridLayout/README.md b/Pods/KRLCollectionViewGridLayout/README.md new file mode 100644 index 0000000..9f9ed1f --- /dev/null +++ b/Pods/KRLCollectionViewGridLayout/README.md @@ -0,0 +1,62 @@ +# KRLCollectionViewGridLayout + +[![Build Status](http://img.shields.io/travis/klundberg/KRLCollectionViewGridLayout/master.svg?style=flat)](https://travis-ci.org/klundberg/KRLCollectionViewGridLayout) +[![Version](https://img.shields.io/cocoapods/v/KRLCollectionViewGridLayout.svg?style=flat)](http://cocoadocs.org/docsets/KRLCollectionViewGridLayout) +[![License](https://img.shields.io/cocoapods/l/KRLCollectionViewGridLayout.svg?style=flat)](http://cocoadocs.org/docsets/KRLCollectionViewGridLayout) +[![Platform](https://img.shields.io/cocoapods/p/KRLCollectionViewGridLayout.svg?style=flat)](http://cocoadocs.org/docsets/KRLCollectionViewGridLayout) + +This layout is an alternative to UICollectionViewFlowLayout that positions and sizes items using a defined number of columns and an aspect ratio property which force the size of cells, rather than the cells' size telling the layout how to position them (in the way UICollectionViewFlowLayout behaves). By default, this will always show the same number of items in a row no matter how large or small the collection view is. + +You can specify the number of items per line and the desired aspect ratio of all items (which is always width / height, regardless of scroll direction): + + layout.numberOfItemsPerLine = 5; + layout.aspectRatio = 16.0/9.0; + +You can specify metrics similar to UICollectionViewFlowLayout, like so: + + layout.sectionInset = UIEdgeInsetsMake(10,20,30,40); + layout.interitemSpacing = 15; + layout.lineSpacing = 5; + layout.scrollDirection = UICollectionViewScrollDirectionVertical; + +You can also add headers and footers to each section similar to UICollectionViewFlowLayout: + + layout.headerReferenceLength = 44; + layout.footerReferenceLength = 100; + +In vertical scrolling mode, length is the height of the header/footer. In horizontal scrolling mode, length is the width of the header/footer. +A length of 0 in these dimensions will not try to create a view. + +All of the above properties (except for `scrollDirection`) can be configured on a per-section basis using `KRLCollectionViewDelegateFlowLayout`. Have your view controller or other object that implements the regular UICollectionViewDelegate also implement this protocol to make these per-section variances on these properties. + +## Usage + +To run the example project, clone the repo, and run `pod install` from the Example directory first. +You can either run unit tests on the library itself, or run the sample project for a visual demonstration. + +## Requirements + +iOS 6.0 or greater, and ARC. + +Example project requires Xcode 6.3, can only run in iOS 8.0+. + +## Installation + +KRLCollectionViewGridLayout is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + + pod "KRLCollectionViewGridLayout" + +## Author + +Kevin Lundberg, kevin at klundberg dot com + +## Contributions + +Pull requests are welcome! Please include unit tests for any bugfixes or new features. + +## License + +KRLCollectionViewGridLayout is available under the MIT license. See the LICENSE file for more info. + + diff --git a/Pods/MBProgressHUD/LICENSE b/Pods/MBProgressHUD/LICENSE new file mode 100644 index 0000000..0e357d1 --- /dev/null +++ b/Pods/MBProgressHUD/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2009-2015 Matej Bukovinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.h b/Pods/MBProgressHUD/MBProgressHUD.h old mode 100755 new mode 100644 similarity index 99% rename from Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.h rename to Pods/MBProgressHUD/MBProgressHUD.h index 1caa3ca..c535ea5 --- a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.h +++ b/Pods/MBProgressHUD/MBProgressHUD.h @@ -1,12 +1,12 @@ // // MBProgressHUD.h -// Version 0.9 +// Version 0.9.1 // Created by Matej Bukovinski on 2.4.09. // // This code is distributed under the terms and conditions of the MIT license. -// Copyright (c) 2013 Matej Bukovinski +// Copyright (c) 2009-2015 Matej Bukovinski // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -33,7 +33,7 @@ @protocol MBProgressHUDDelegate; -typedef enum { +typedef NS_ENUM(NSInteger, MBProgressHUDMode) { /** Progress is shown using an UIActivityIndicatorView. This is the default. */ MBProgressHUDModeIndeterminate, /** Progress is shown using a round, pie-chart like, progress view. */ @@ -46,16 +46,16 @@ typedef enum { MBProgressHUDModeCustomView, /** Shows only labels */ MBProgressHUDModeText -} MBProgressHUDMode; +}; -typedef enum { +typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) { /** Opacity animation */ MBProgressHUDAnimationFade, /** Opacity + scale animation */ MBProgressHUDAnimationZoom, MBProgressHUDAnimationZoomOut = MBProgressHUDAnimationZoom, MBProgressHUDAnimationZoomIn -} MBProgressHUDAnimation; +}; #ifndef MB_INSTANCETYPE diff --git a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.m b/Pods/MBProgressHUD/MBProgressHUD.m old mode 100755 new mode 100644 similarity index 96% rename from Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.m rename to Pods/MBProgressHUD/MBProgressHUD.m index e312c5e..ab086c6 --- a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD.m +++ b/Pods/MBProgressHUD/MBProgressHUD.m @@ -1,6 +1,6 @@ // // MBProgressHUD.m -// Version 0.9 +// Version 0.9.1 // Created by Matej Bukovinski on 2.4.09. // @@ -70,7 +70,6 @@ @interface MBProgressHUD () { @property (atomic, MB_STRONG) NSTimer *minShowTimer; @property (atomic, MB_STRONG) NSDate *showStarted; - @end @@ -172,10 +171,10 @@ - (id)initWithFrame:(CGRect)frame { self.labelText = nil; self.detailsLabelText = nil; self.opacity = 0.8f; - self.color = [UIColor colorWithWhite:0.25 alpha:0.95f]; - self.labelFont = [UIFont fontWithName:kBoldFont size:kLabelFontSize]; + self.color = nil; + self.labelFont = [UIFont boldSystemFontOfSize:kLabelFontSize]; self.labelColor = [UIColor whiteColor]; - self.detailsLabelFont = [UIFont fontWithName:kRegularFont size:kDetailsLabelFontSize]; + self.detailsLabelFont = [UIFont boldSystemFontOfSize:kDetailsLabelFontSize]; self.detailsLabelColor = [UIColor whiteColor]; self.activityIndicatorColor = [UIColor whiteColor]; self.xOffset = 0.0f; @@ -254,7 +253,6 @@ - (void)show:(BOOL)animated { } // ... otherwise show the HUD imediately else { - [self setNeedsDisplay]; [self showUsingAnimation:useAnimation]; } } @@ -288,7 +286,6 @@ - (void)hideDelayed:(NSNumber *)animated { - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running if (taskInProgress) { - [self setNeedsDisplay]; [self showUsingAnimation:useAnimation]; } } @@ -299,21 +296,17 @@ - (void)handleMinShowTimer:(NSTimer *)theTimer { #pragma mark - View Hierrarchy -- (BOOL)shouldPerformOrientationTransform { - BOOL isPreiOS8 = NSFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_8_0; - // prior to iOS8 code needs to take care of rotation if it is being added to the window - return isPreiOS8 && [self.superview isKindOfClass:[UIWindow class]]; -} - - (void)didMoveToSuperview { - if ([self shouldPerformOrientationTransform]) { - [self setTransformForCurrentOrientation:NO]; - } + [self updateForCurrentOrientationAnimated:NO]; } #pragma mark - Internal show & hide operations - (void)showUsingAnimation:(BOOL)animated { + // Cancel any scheduled hideDelayed: calls + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [self setNeedsDisplay]; + if (animated && animationType == MBProgressHUDAnimationZoomIn) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { @@ -734,21 +727,25 @@ - (void)statusBarOrientationDidChange:(NSNotification *)notification { UIView *superview = self.superview; if (!superview) { return; - } else if ([self shouldPerformOrientationTransform]) { - [self setTransformForCurrentOrientation:YES]; } else { - self.frame = self.superview.bounds; - [self setNeedsDisplay]; + [self updateForCurrentOrientationAnimated:YES]; } } -- (void)setTransformForCurrentOrientation:(BOOL)animated { - // Stay in sync with the superview - if (self.superview) { - self.bounds = self.superview.bounds; - [self setNeedsDisplay]; - } - +- (void)updateForCurrentOrientationAnimated:(BOOL)animated { + // Stay in sync with the superview in any case + if (self.superview) { + self.bounds = self.superview.bounds; + [self setNeedsDisplay]; + } + + // Not needed on iOS 8+, compile out when the deployment target allows, + // to avoid sharedApplication problems on extension targets +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 + // Only needed pre iOS 7 when added to a window + BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; + if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGFloat radians = 0; if (UIInterfaceOrientationIsLandscape(orientation)) { @@ -770,6 +767,7 @@ - (void)setTransformForCurrentOrientation:(BOOL)animated { if (animated) { [UIView commitAnimations]; } +#endif } @end @@ -816,7 +814,7 @@ - (void)drawRect:(CGRect)rect { if (_annular) { // Draw background - BOOL isPreiOS7 = NSFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; + BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; processBackgroundPath.lineWidth = lineWidth; @@ -848,7 +846,7 @@ - (void)drawRect:(CGRect)rect { CGFloat radius = (allRect.size.width - 4) / 2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; - CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); // white + [_progressTintColor setFill]; CGContextMoveToPoint(context, center.x, center.y); CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); CGContextClosePath(context); diff --git a/Pods/MBProgressHUD/README.mdown b/Pods/MBProgressHUD/README.mdown new file mode 100644 index 0000000..29d76ce --- /dev/null +++ b/Pods/MBProgressHUD/README.mdown @@ -0,0 +1,101 @@ +# MBProgressHUD [![Build Status](https://travis-ci.org/matej/MBProgressHUD.svg?branch=master)](https://travis-ci.org/matej/MBProgressHUD) + +MBProgressHUD is an iOS drop-in class that displays a translucent HUD with an indicator and/or labels while work is being done in a background thread. The HUD is meant as a replacement for the undocumented, private UIKit UIProgressHUD with some additional features. + +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/1-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/1.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/2-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/2.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/3-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/3.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/4-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/4.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/5-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/5.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/6-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/6.png) +[![](http://dl.dropbox.com/u/378729/MBProgressHUD/7-thumb.png)](http://dl.dropbox.com/u/378729/MBProgressHUD/7.png) + +## Requirements + +MBProgressHUD works on any iOS version and is compatible with both ARC and non-ARC projects. It depends on the following Apple frameworks, which should already be included with most Xcode templates: + +* Foundation.framework +* UIKit.framework +* CoreGraphics.framework + +You will need the latest developer tools in order to build MBProgressHUD. Old Xcode versions might work, but compatibility will not be explicitly maintained. + +## Adding MBProgressHUD to your project + +### Cocoapods + +[CocoaPods](http://cocoapods.org) is the recommended way to add MBProgressHUD to your project. + +1. Add a pod entry for MBProgressHUD to your Podfile `pod 'MBProgressHUD', '~> 0.9.1'` +2. Install the pod(s) by running `pod install`. +3. Include MBProgressHUD wherever you need it with `#import "MBProgressHUD.h"`. + +### Source files + +Alternatively you can directly add the `MBProgressHUD.h` and `MBProgressHUD.m` source files to your project. + +1. Download the [latest code version](https://github.com/matej/MBProgressHUD/archive/master.zip) or add the repository as a git submodule to your git-tracked project. +2. Open your project in Xcode, then drag and drop `MBProgressHUD.h` and `MBProgressHUD.m` onto your project (use the "Product Navigator view"). Make sure to select Copy items when asked if you extracted the code archive outside of your project. +3. Include MBProgressHUD wherever you need it with `#import "MBProgressHUD.h"`. + +### Static library + +You can also add MBProgressHUD as a static library to your project or workspace. + +1. Download the [latest code version](https://github.com/matej/MBProgressHUD/downloads) or add the repository as a git submodule to your git-tracked project. +2. Open your project in Xcode, then drag and drop `MBProgressHUD.xcodeproj` onto your project or workspace (use the "Product Navigator view"). +3. Select your target and go to the Build phases tab. In the Link Binary With Libraries section select the add button. On the sheet find and add `libMBProgressHUD.a`. You might also need to add `MBProgressHUD` to the Target Dependencies list. +4. Include MBProgressHUD wherever you need it with `#import `. + +## Usage + +The main guideline you need to follow when dealing with MBProgressHUD while running long-running tasks is keeping the main thread work-free, so the UI can be updated promptly. The recommended way of using MBProgressHUD is therefore to set it up on the main thread and then spinning the task, that you want to perform, off onto a new thread. + +```objective-c +[MBProgressHUD showHUDAddedTo:self.view animated:YES]; +dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ + // Do something... + dispatch_async(dispatch_get_main_queue(), ^{ + [MBProgressHUD hideHUDForView:self.view animated:YES]; + }); +}); +``` + +If you need to configure the HUD you can do this by using the MBProgressHUD reference that showHUDAddedTo:animated: returns. + +```objective-c +MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; +hud.mode = MBProgressHUDModeAnnularDeterminate; +hud.labelText = @"Loading"; +[self doSomethingInBackgroundWithProgressCallback:^(float progress) { + hud.progress = progress; +} completionCallback:^{ + [hud hide:YES]; +}]; +``` + +UI updates should always be done on the main thread. Some MBProgressHUD setters are however considered "thread safe" and can be called from background threads. Those also include `setMode:`, `setCustomView:`, `setLabelText:`, `setLabelFont:`, `setDetailsLabelText:`, `setDetailsLabelFont:` and `setProgress:`. + +If you need to run your long-running task in the main thread, you should perform it with a slight delay, so UIKit will have enough time to update the UI (i.e., draw the HUD) before you block the main thread with your task. + +```objective-c +[MBProgressHUD showHUDAddedTo:self.view animated:YES]; +dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC); +dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + // Do something... + [MBProgressHUD hideHUDForView:self.view animated:YES]; +}); +``` + +You should be aware that any HUD updates issued inside the above block won't be displayed until the block completes. + +For more examples, including how to use MBProgressHUD with asynchronous operations such as NSURLConnection, take a look at the bundled demo project. Extensive API documentation is provided in the header file (MBProgressHUD.h). + + +## License + +This code is distributed under the terms and conditions of the [MIT license](LICENSE). + +## Change-log + +A brief summary of each MBProgressHUD release can be found on the [wiki](https://github.com/matej/MBProgressHUD/wiki/Change-log). diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..243801b --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,47 @@ +PODS: + - AFNetworking (2.6.0): + - AFNetworking/NSURLConnection (= 2.6.0) + - AFNetworking/NSURLSession (= 2.6.0) + - AFNetworking/Reachability (= 2.6.0) + - AFNetworking/Security (= 2.6.0) + - AFNetworking/Serialization (= 2.6.0) + - AFNetworking/UIKit (= 2.6.0) + - AFNetworking/NSURLConnection (2.6.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.6.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.6.0) + - AFNetworking/Security (2.6.0) + - AFNetworking/Serialization (2.6.0) + - AFNetworking/UIKit (2.6.0): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - CHTCollectionViewWaterfallLayout (0.9.2) + - KRLCollectionViewGridLayout (0.4.0) + - MBProgressHUD (0.9.1) + - SDWebImage (3.7.3): + - SDWebImage/Core (= 3.7.3) + - SDWebImage/Core (3.7.3) + - SSKeychain (1.2.3) + +DEPENDENCIES: + - AFNetworking (~> 2.0) + - CHTCollectionViewWaterfallLayout + - KRLCollectionViewGridLayout (~> 0.4) + - MBProgressHUD (~> 0.9.1) + - SDWebImage (~> 3.7) + - SSKeychain + +SPEC CHECKSUMS: + AFNetworking: 79f7eb1a0fcfa7beb409332b2ca49afe9ce53b05 + CHTCollectionViewWaterfallLayout: 43232febcb3e4d3985cd758718cbe499b21b822f + KRLCollectionViewGridLayout: e805613ef7ba82c2b226faec87c1c16e1ebf07e4 + MBProgressHUD: c47f2c166c126cf2ce36498d80f33e754d4e93ad + SDWebImage: 1d2b1a1efda1ade1b00b6f8498865f8ddedc8a84 + SSKeychain: 3f42991739c6c60a9cf1bbd4dff6c0d3694bcf3d + +COCOAPODS: 0.38.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1058576 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1882 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00A5C06D70A19916A3AA16B56A6B06DE /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 065352E6AEDDBF7E5A7A30AFEC26570D /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 00D64D8D069226AA544C9B2BE414B310 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = F584ACAC1E6734C0CD383937E8FA1616 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 02CEB4C761522684904801EA689BA480 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C4580DDF6D03E725E7B3A907484D7FA5 /* AFURLConnectionOperation.m */; }; + 0D294FC8161890785F2EE7845018C06E /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = A94BDA597E1ADA29938165998A47AD09 /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 0DFEEC44263FBCBAC890D12ADB7A5AB8 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 63207122068F629D33DDB7EB25FCB21C /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 0ECC9807A32F60FB56E7CA5F914E8D0F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + 0F2798FA91027554045C7478CEB91C83 /* KRLCollectionViewGridLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FBE463CCCB4F5B857722F15376DF1C8 /* KRLCollectionViewGridLayout.m */; }; + 1357F26CC2D63D643A3BA38F9AB090FD /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CF481D7A598D18A79EDF3B0AF9B0F4 /* UIImageView+AFNetworking.m */; }; + 13CA33948C7BDA9E65C680551E1E919A /* MBProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AD40C2BCE7300E734CF2AFDF7B1BA14 /* MBProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14B1D5628D86026B80A02E77ECD9B00A /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F8827310B2FE42170810CE4AFF9D473 /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 16A1E3B079AC96623BD2A172487AC9D4 /* Pods-RyffTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 91A054E90A5417EC5BABCA194ADD6DB0 /* Pods-RyffTests-dummy.m */; }; + 1AD954E9D363C6D9CB634BC604DDB22A /* SSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = C5CB810F4DCB2E48814F054A23B05007 /* SSKeychain.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 1F48DD1C2F4A9628558E2FF8A35DF216 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 591001B2946F9C950A2C08AEA73BCDFB /* AFHTTPRequestOperation.m */; }; + 211A2E1E71DB396002E53C3E952A8A63 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = DF3E13D718420ECAD78C68C4208FD9E1 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2285FC98B68173BE0EAC5A516464AB5E /* SSKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = F72491D572DFE618CD091F20C22D5511 /* SSKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 241BBDAFDCD5BDE21BEC3953A470E7AC /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C8E2388FD120DAAFABA67B4EB1358BC6 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24F1DABB787B064225C362F166757332 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A7AB7DC18FECAFDD160962C085AC41E /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 261B4E9A06A3A1D388F757EF58D78A1A /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AFCF03A0BE0B8BE55CF87C8D392AFFCE /* AFHTTPRequestOperationManager.m */; }; + 27501010323D44134110117667A58821 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E565EAB874E0326DAF1E5958673C7D8E /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 28812A5C5F5A20E6DF51920F3CDFF701 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = AF4AC8FE21C01A522E6081F787113829 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 2F7473CFFAE15009345F603836928B7A /* CHTCollectionViewWaterfallLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 06FF87713A9671AA978663D19968E96C /* CHTCollectionViewWaterfallLayout-dummy.m */; }; + 30BEFFAA33BB6FEC8E3E9DD82D5B7136 /* SSKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 405DAD33079CE3CE214EF60AE0A2AF08 /* SSKeychainQuery.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 35DAEFCFD582A5B69C93BDC5C717C3B1 /* SSKeychainQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 7842E81B89DB03AEC44D01F5CDB4615D /* SSKeychainQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36A3561BFAF840764C05F9500D87323F /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A233317F8104BC27DD073EBFB8C57EEC /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 3AB839A1A07432CFF78644D201C9843C /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FD02F2A7C7CFDDC0B359686E4CDAAA91 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BA0E7F7756387D45AAC8B03DF002815 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 190634E95E803CFC51AF5E97D7D402D5 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 3DA2D42C8F9D1751CBEC933D34375330 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BB85E059F7161FF0014729F57DD04403 /* AFHTTPSessionManager.m */; }; + 40633E1155521D903331A83EC49A9C44 /* CHTCollectionViewWaterfallLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = AB5BB98F7A3F26BEA35419DA57E72D45 /* CHTCollectionViewWaterfallLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 40CA03B1CF60C19AE2A9F479E0CD71CC /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 45DD483C3945A87AB4D192E8FCA42E32 /* AFURLRequestSerialization.m */; }; + 427A778E1CB6D71128A78D58DAC6F1A8 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = AC5146F912626755A73BE198CBA7E54C /* AFURLResponseSerialization.m */; }; + 43411424976E89634A60C11162CE94B8 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E346C825522F31683C4EFC424D82722 /* AFNetworking-dummy.m */; }; + 456B9D58898E4D5CB0CD9CD33E961691 /* SSKeychain-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FDC5EB2DCE96D0D88865B0772C9CB82 /* SSKeychain-dummy.m */; }; + 45777A03ADD721AEB2ADAAB8B1E2EB6F /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 0099C626AF30EC52BB2A29B99176C2FB /* UIButton+AFNetworking.m */; }; + 459884A00851413B2B51475DB2426237 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + 4E51960B56F4DB69552A9A76A3C75BF4 /* AFHTTPRequestOperationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D56737A3C70E62CE1C65CBD9ACA396E8 /* AFHTTPRequestOperationManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F0F50DAED05967755CB80590169895F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + 50B1E1FB5A25496065BD9AB641A60C49 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85E22319FB65CC3422D0CC6E7D8BBE0 /* CoreGraphics.framework */; }; + 50B5C323D893DDA2DFF62DFAB7F5A86C /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ED9E4D7280AD4122656B1508BC28D54 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 515D24EF41F4D6953D574B393084AB4A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97759F43444EF9B6C4D2A6DBA8862117 /* Security.framework */; }; + 535837724A1BDB4073189EC54508E5F5 /* CHTCollectionViewWaterfallLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1F11685F922EF377D71BD8A9C18B0D /* CHTCollectionViewWaterfallLayout.m */; }; + 5654AEE6228ED8E59D716B59A086B638 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0D800F22CA0E020B76C9FA413D0F081 /* ImageIO.framework */; }; + 569A785A2BDF85BF692E19E0DC83D250 /* Pods-RyffTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 92F3CA31F9EA4A7D79B49B1202BEDF20 /* Pods-RyffTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5725D951B0142B7870F91BAA87B0E5BC /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 172D4C3C7BC43A2B91AAFF8B0A8B31B8 /* AFSecurityPolicy.m */; }; + 584D2B8790B0525E7B36DE31DCD55BD5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + 58E3614287C3DDC2251B53FF8E2F0686 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 164F10F771B605E17352DED2CA35EA0E /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E2784A3B9C7733A87F29FF89961C6C8 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 50D5153F825E59E39BBF9940B1F3058F /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 60F53E2C1F5F5492A6D6E9F8777B6E02 /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8AAABEF5EF0996EA146A29BEAE3A4C3 /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 67266B31FF6088E00ABD04BD2EA82A13 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B4E571A83C7139215C766DF64FCFC5 /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 68B2FBC16592EE6FDC405FD974AADFDF /* AFURLConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AECB629B9A39EBAF3D48527C5BAB9132 /* AFURLConnectionOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E75A67C82FFA77F48FE1B687A175335 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1CFFC7D00C8033DD4F1B26FD0C07EB /* UIRefreshControl+AFNetworking.m */; }; + 70FF81AAB9F5AA6BEEB0EB6410D55823 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F6EA380D1D4171B11C973D86A9C8D8BA /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 710B5BFC6E76A29F70884841FAA0D5A0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85E22319FB65CC3422D0CC6E7D8BBE0 /* CoreGraphics.framework */; }; + 71D03085C8FD0F6507EEEF130646F0E7 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 63D8AF70BF0337074F240803CFD505E4 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71E05D8631A381BF07151BDB21BA3BF6 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97759F43444EF9B6C4D2A6DBA8862117 /* Security.framework */; }; + 768EFC7B405E2AB4FFA98439BF4FF50D /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EDA1012AC3F49F68F48CA3E570B3A1E /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78E22F8726832F30519EEBB0E423733E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + 8197E1EF4D2114D8076C293EBACE80C3 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = AC9C3498B40210B7AD11A75EB9870604 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8397444E32521D2FFF6DEEA7406074E6 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 955C4D7CF225183C84AA3D2F3E010CB5 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86EECC0414A64A89566784C1BBA02EE4 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E43659F5F95E0DFC4738B7F958E252 /* AFURLSessionManager.m */; }; + 8A456EFC298191CBBFF7D85604CEA7E9 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = FD60E72F56E14EB8B3DB0F33B68B5510 /* MBProgressHUD.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 8C1301CCB38A010C5E77AE3870FB366F /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1244CADDF20771D037E1454D14AD41AE /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8CFEF461CF837247C4E7941E983B6D17 /* CHTCollectionViewWaterfallLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6777EFED8FF4E2B375842272CC8EFB7D /* CHTCollectionViewWaterfallLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 91838473483586AEE79A3CE5A8A0F760 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EB8F84003EAC8D25AAA335FB4891742 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 918925E758B9CF1EB782014504385933 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A5E11473DD802A45E5F8554929B8738 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9531D255DFCEAD5AEBB69526351CDF10 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 992625925D1C9BA1A0BA2261E561937B /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 99011BA6886A006C1B66466E555B7021 /* UIAlertView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = E324DF51380D38386B8EAF5E83F86A7F /* UIAlertView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B54EB4CD91228093E76FD2D76A712FE /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A6CC08341C3AF9B651D215198A9378C3 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9ECCE004E4E1455858103FA6769E89A9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + A235FFC5F1AAF0937C9407B9D5D71F2D /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6A14414AEF261F477715DB0B67B4D7 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5DE53190BE217689F5BE109FEC20A1A /* SSKeychain-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 872B1E46287B99926422E44640962F59 /* SSKeychain-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A911D66CF6E80A517A1EE92B1BCD220A /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = D330BE5ED2C117C3AC793BC848889EC7 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + A9431C5205302B6E93954A4F489A4639 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B23A47CEF1D20A36FBD55EE05202579 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AAA138F0836AAFE699EDD6B15E439F74 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = BAF07AF20E0D1E0FA491D86DF646E111 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AAEAA5B71E35B6307573AF99BCEA65A4 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FDA1A6D82E82A89AC02165E2DE7469A /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ABC5DE6E9261B08CC53136872745D5D2 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F557D3AA40B7DE218541E2385B99EB73 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC71E006E2DF344B050FB25A4E553501 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EE9991FA5B1ACA0F845C51DA13E7CDB /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5D4A3EFED42C133F2B03B3543699B29 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D1315F8E69E96936F1473CC109C173 /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + B940804524126D6424E37AFEDDC44B23 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BD2ED8D65823991044F8F6B6A1F75DF /* AFNetworkActivityIndicatorManager.m */; }; + C01E67B25AF4C0DEF5977B8BF61400B7 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF0755A4302A26224235AFF270647DE /* UIProgressView+AFNetworking.m */; }; + C5E4F516535B7F4C8490FE652FB29B9B /* Pods-Ryff-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 04BDFF5CD68CA516F2D1289EEA772EA0 /* Pods-Ryff-dummy.m */; }; + C6198EF2577E02DEC1992D817721A49A /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 3016012A25D077C7474078197720D23C /* UIWebView+AFNetworking.m */; }; + C7C2A233E54E544AEB3C1E6D4612D20A /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E243AEBB52CDAB037C96F2DC1FE70D /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + CAB3A3683CEE61562D6A807834A8F319 /* UIAlertView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C146E8FDD433656BCED9366C9443F6A /* UIAlertView+AFNetworking.m */; }; + CE196452DEBD306AEF0C6CA952AA74F3 /* KRLCollectionViewGridLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 05FE6216540F2DD58D59104D40801FD0 /* KRLCollectionViewGridLayout-dummy.m */; }; + CE65CF46A4E8BA8DC56202221ED6A214 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A22AE8B8B8CF29A866032716A722E64 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D1320CBA4D58B961A25E27B3C197D571 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = F77D18DA42F04FF675FEB773EE99C26C /* UIActivityIndicatorView+AFNetworking.m */; }; + D1376A9522BA91238282A6FA7D7341D0 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B34BA00ACA50E43DA227AEB0563865EE /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D362FAD26768847748A61A7E58BD69A2 /* Pods-Ryff-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 722FCCF2BACB502D671F4357FC107B0F /* Pods-Ryff-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D66DB1043BFB18AB2D7CF58D57B67A0E /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5395176661F6AB61E7819354BA95631D /* MBProgressHUD-dummy.m */; }; + DB580210012243B347B8A79D25577F89 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F12C64A1CC3A23C1B3D9995C3BBED8E /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC6E0EA6614CA015BDDCF53BAE604D85 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A7747B74D9EE7ADAE844D664C3980197 /* AFNetworkReachabilityManager.m */; }; + DD46128C384E304744F73980026D6921 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1611459F3D3441C53E6C1D35FB40F518 /* SystemConfiguration.framework */; }; + DE13B71A1C823DFD2CD8CDFCA3280FC2 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 66848B793C8F96D9D9956D4C6E50B31C /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E085821F65F1A32318CBFA840744FC69 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FEF7F2015C0ACCC5A06F88736F7D83D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E8FFBEEF2CDFBA2F0260B45FDE92A489 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = E30FBCC8EA678E0E7540A01BBFE19FB9 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EAEB59DFA3BE09196DB2A4863D86AD2B /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 199314128ABD1E7069E5D03640B37FD6 /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBB2598081C4F2442C1C8C885412F5A2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; + EC945F5BF9040A6635A6CBAC726A6096 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 95B066C3073F61164D226DF56C7D705D /* SDWebImage-dummy.m */; }; + EE100E537E66C1060BE585901CCF89EA /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 31585A9399288301ACA227290D428045 /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF046D15D0289AF048FFFF05235EFA8B /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5896583D78CF567DFA1B07FBB1247F58 /* MobileCoreServices.framework */; }; + EF20481E3F608C296BA47762FA58AFB5 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = DBAA2BF1E25B19C8383E7365A90E20E9 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF42FBE937D524003A2B96FD1B3956C2 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = DEFF865B36632B0869C126B057703031 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F4BB263BE90575F39E6F90621B8BF43A /* KRLCollectionViewGridLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 085B558EAB1B0579E3662F941DDE1BC4 /* KRLCollectionViewGridLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F560DE4BE9B5140C952194BAEDDEB1EE /* AFHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 497C9FF86881772C6EB450E184D623B6 /* AFHTTPRequestOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F63EA8AE45984DB1C7B34A64A1FB00D5 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 35B078AE5EC4F5270B4A374144E32639 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F64247D0BFC08D7FDB86D1C4F22CBDDD /* KRLCollectionViewGridLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7056C673F5763003884B08ADC19FC04D /* KRLCollectionViewGridLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F956B1FD90989021518437DB2D4D6EA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 06BDCA59DAC9056E6A9D67874DB93C61 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = D7B8FEA8CF7F5F6473FA000DAA7C17FD; + remoteInfo = KRLCollectionViewGridLayout; + }; + 2E262B946B6481ACEC661C717144EA44 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C2814CF121DAF0BC8208C621CC869657; + remoteInfo = SSKeychain; + }; + 3BB836AB7F67D4733326220540391438 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9666688CB41B38A9914616144C9C7A3E; + remoteInfo = SDWebImage; + }; + 3FC4DB1039E4E9315F4234A7885A596E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E2C7547D2DD7E86D2C40276BA99E896B; + remoteInfo = CHTCollectionViewWaterfallLayout; + }; + 58C399F8BB60737868CF1CAB59107813 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C2814CF121DAF0BC8208C621CC869657; + remoteInfo = SSKeychain; + }; + 803E0AB89D59702AB2CA8B3EE68BD241 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = D7B8FEA8CF7F5F6473FA000DAA7C17FD; + remoteInfo = KRLCollectionViewGridLayout; + }; + 8B9BAE0BF47548D7AB69916FE665387A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 12D9723DA6FC9334CE1435F1F069EE49; + remoteInfo = AFNetworking; + }; + 8CB285FE6BDDE89E742A3C959FF06C54 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E2C7547D2DD7E86D2C40276BA99E896B; + remoteInfo = CHTCollectionViewWaterfallLayout; + }; + A04D5739982D023AAA10343223A145F0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF7B2FC32BB12986BA0BF6C4CB51BFEE; + remoteInfo = MBProgressHUD; + }; + D5282EC02A1490B25309404138F289F5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 12D9723DA6FC9334CE1435F1F069EE49; + remoteInfo = AFNetworking; + }; + DCC19B32287F890756B074A46704BDBD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF7B2FC32BB12986BA0BF6C4CB51BFEE; + remoteInfo = MBProgressHUD; + }; + E08FAAAD8ED53105BEF98ADAFE74AABB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9666688CB41B38A9914616144C9C7A3E; + remoteInfo = SDWebImage; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0099C626AF30EC52BB2A29B99176C2FB /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + 03B4E571A83C7139215C766DF64FCFC5 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = ""; }; + 0476DDA38E56E573B0F83C7B07125DCD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04BDFF5CD68CA516F2D1289EEA772EA0 /* Pods-Ryff-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Ryff-dummy.m"; sourceTree = ""; }; + 059B25ADAE64C558ACDB35973B79EC6B /* Pods-RyffTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RyffTests-resources.sh"; sourceTree = ""; }; + 05FE6216540F2DD58D59104D40801FD0 /* KRLCollectionViewGridLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KRLCollectionViewGridLayout-dummy.m"; sourceTree = ""; }; + 065352E6AEDDBF7E5A7A30AFEC26570D /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + 06FF87713A9671AA978663D19968E96C /* CHTCollectionViewWaterfallLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CHTCollectionViewWaterfallLayout-dummy.m"; sourceTree = ""; }; + 085B558EAB1B0579E3662F941DDE1BC4 /* KRLCollectionViewGridLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KRLCollectionViewGridLayout-umbrella.h"; sourceTree = ""; }; + 0A22AE8B8B8CF29A866032716A722E64 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; + 0D6194FE4276423AE43107355B22D1BF /* Pods-Ryff.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Ryff.debug.xcconfig"; sourceTree = ""; }; + 0EB8F84003EAC8D25AAA335FB4891742 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; + 0EDA1012AC3F49F68F48CA3E570B3A1E /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + 0FD11B540690F943D73758AF58040714 /* KRLCollectionViewGridLayout-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "KRLCollectionViewGridLayout-Private.xcconfig"; sourceTree = ""; }; + 10F28CCFBB5E36AEEFCFF818E13B4778 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 1244CADDF20771D037E1454D14AD41AE /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + 1611459F3D3441C53E6C1D35FB40F518 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 164F10F771B605E17352DED2CA35EA0E /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + 172D4C3C7BC43A2B91AAFF8B0A8B31B8 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + 190634E95E803CFC51AF5E97D7D402D5 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + 199314128ABD1E7069E5D03640B37FD6 /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; + 1A1F11685F922EF377D71BD8A9C18B0D /* CHTCollectionViewWaterfallLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = CHTCollectionViewWaterfallLayout.m; sourceTree = ""; }; + 1A9FBA2A42AEA90E3C3DC795DDFBD288 /* SSKeychain-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSKeychain-prefix.pch"; sourceTree = ""; }; + 1FDA1A6D82E82A89AC02165E2DE7469A /* MBProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; + 282A5C812590F7B349B7D5532434DC97 /* Pods-RyffTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-RyffTests-acknowledgements.markdown"; sourceTree = ""; }; + 2880D6EF966902E7B5D5E4C9CAC63732 /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; + 2AD40C2BCE7300E734CF2AFDF7B1BA14 /* MBProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-umbrella.h"; sourceTree = ""; }; + 2AF0755A4302A26224235AFF270647DE /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + 2B23A47CEF1D20A36FBD55EE05202579 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + 2BA5F1DBF0E5B68AD7B49B112CFFF41B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E55A4429F063A37A9B01D65C08EDB37 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2F8827310B2FE42170810CE4AFF9D473 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 2FDEA0A7653DAB09CEDA4AA567334D9B /* SSKeychain.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSKeychain.xcconfig; sourceTree = ""; }; + 3016012A25D077C7474078197720D23C /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; + 31585A9399288301ACA227290D428045 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = ""; }; + 3176CD3F2E81F1C0272B55F008622FC3 /* Pods-Ryff-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Ryff-acknowledgements.plist"; sourceTree = ""; }; + 355E4C292EFDB17D5EABE71377282139 /* Pods-RyffTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RyffTests-frameworks.sh"; sourceTree = ""; }; + 35B078AE5EC4F5270B4A374144E32639 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 36D1315F8E69E96936F1473CC109C173 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 38138E55564D749D4112D6779D7A031A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 38D721F0F350AD41362303E040D8AC3A /* KRLCollectionViewGridLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KRLCollectionViewGridLayout-prefix.pch"; sourceTree = ""; }; + 3A7AB7DC18FECAFDD160962C085AC41E /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + 405DAD33079CE3CE214EF60AE0A2AF08 /* SSKeychainQuery.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SSKeychainQuery.m; path = SSKeychain/SSKeychainQuery.m; sourceTree = ""; }; + 44510ADC7D6F5BF9C659467F042C34E8 /* KRLCollectionViewGridLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KRLCollectionViewGridLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45DD483C3945A87AB4D192E8FCA42E32 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + 4812895C615630B7D36F1DA7EFDF6549 /* Pods-RyffTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-RyffTests.modulemap"; sourceTree = ""; }; + 48DFB03630976ADB6605A0CC016E9670 /* CHTCollectionViewWaterfallLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = CHTCollectionViewWaterfallLayout.modulemap; sourceTree = ""; }; + 497C9FF86881772C6EB450E184D623B6 /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperation.h; path = AFNetworking/AFHTTPRequestOperation.h; sourceTree = ""; }; + 4A280CF3EB2B037A4082FAC5F526F93E /* SSKeychain-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SSKeychain-Private.xcconfig"; sourceTree = ""; }; + 4F12C64A1CC3A23C1B3D9995C3BBED8E /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + 4FEF7F2015C0ACCC5A06F88736F7D83D /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + 50D5153F825E59E39BBF9940B1F3058F /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + 5395176661F6AB61E7819354BA95631D /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = ""; }; + 5896583D78CF567DFA1B07FBB1247F58 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 591001B2946F9C950A2C08AEA73BCDFB /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperation.m; path = AFNetworking/AFHTTPRequestOperation.m; sourceTree = ""; }; + 5C146E8FDD433656BCED9366C9443F6A /* UIAlertView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+AFNetworking.m"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.m"; sourceTree = ""; }; + 5E346C825522F31683C4EFC424D82722 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; + 5ED9E4D7280AD4122656B1508BC28D54 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + 5EE9991FA5B1ACA0F845C51DA13E7CDB /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + 5F4D3BF1FE8958790FA65150F134E8FF /* SSKeychain.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SSKeychain.modulemap; sourceTree = ""; }; + 6118ADAA57387FF9F72ABB9272036B46 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SDWebImage.modulemap; sourceTree = ""; }; + 63207122068F629D33DDB7EB25FCB21C /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 63D8AF70BF0337074F240803CFD505E4 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + 64635ECCDCD4F7C95F98B3C9A0EF6715 /* CHTCollectionViewWaterfallLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CHTCollectionViewWaterfallLayout.xcconfig; sourceTree = ""; }; + 66848B793C8F96D9D9956D4C6E50B31C /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + 6777EFED8FF4E2B375842272CC8EFB7D /* CHTCollectionViewWaterfallLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CHTCollectionViewWaterfallLayout-umbrella.h"; sourceTree = ""; }; + 67D0B176A1FA045CD1980740AE42A68C /* MBProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MBProgressHUD.modulemap; sourceTree = ""; }; + 7056C673F5763003884B08ADC19FC04D /* KRLCollectionViewGridLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KRLCollectionViewGridLayout.h; path = Classes/KRLCollectionViewGridLayout.h; sourceTree = ""; }; + 70C21498B40E92CBC82F9A5EDB2C6471 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 722FCCF2BACB502D671F4357FC107B0F /* Pods-Ryff-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Ryff-umbrella.h"; sourceTree = ""; }; + 742385D617846ECC2941F0F912C01C0B /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7842E81B89DB03AEC44D01F5CDB4615D /* SSKeychainQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SSKeychainQuery.h; path = SSKeychain/SSKeychainQuery.h; sourceTree = ""; }; + 7A5E11473DD802A45E5F8554929B8738 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + 7BD2ED8D65823991044F8F6B6A1F75DF /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + 7FBE463CCCB4F5B857722F15376DF1C8 /* KRLCollectionViewGridLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KRLCollectionViewGridLayout.m; path = Classes/KRLCollectionViewGridLayout.m; sourceTree = ""; }; + 82CF481D7A598D18A79EDF3B0AF9B0F4 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + 84D8A5462333033560CF7C5C72464DA7 /* MBProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.xcconfig; sourceTree = ""; }; + 872B1E46287B99926422E44640962F59 /* SSKeychain-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSKeychain-umbrella.h"; sourceTree = ""; }; + 890CB5D352C5511747D249D512E64349 /* Pods_Ryff.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Ryff.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8AD3E4D58DA37F6886DFAA846ACAE5B0 /* Pods-RyffTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RyffTests.debug.xcconfig"; sourceTree = ""; }; + 9199ECD1C2A95515DD3F582E8B453185 /* Pods-Ryff-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Ryff-acknowledgements.markdown"; sourceTree = ""; }; + 91A054E90A5417EC5BABCA194ADD6DB0 /* Pods-RyffTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-RyffTests-dummy.m"; sourceTree = ""; }; + 92F3CA31F9EA4A7D79B49B1202BEDF20 /* Pods-RyffTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-RyffTests-umbrella.h"; sourceTree = ""; }; + 955C4D7CF225183C84AA3D2F3E010CB5 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + 95B066C3073F61164D226DF56C7D705D /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + 97759F43444EF9B6C4D2A6DBA8862117 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 97847F96F58903692DF36F98C0FF8E84 /* KRLCollectionViewGridLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = KRLCollectionViewGridLayout.modulemap; sourceTree = ""; }; + 979BE1B20A85556B7E68092EF68F0CD4 /* CHTCollectionViewWaterfallLayout-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "CHTCollectionViewWaterfallLayout-Private.xcconfig"; sourceTree = ""; }; + 981E8E5CE606C1CB4F23A5658AEFD04C /* SDWebImage-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SDWebImage-Private.xcconfig"; sourceTree = ""; }; + 992625925D1C9BA1A0BA2261E561937B /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; + 9F278B87A19B803DA5CECBE21A57D0AF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9FDC5EB2DCE96D0D88865B0772C9CB82 /* SSKeychain-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SSKeychain-dummy.m"; sourceTree = ""; }; + A20703C3817C4F979C6584BA1E8505DC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A233317F8104BC27DD073EBFB8C57EEC /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + A6CC08341C3AF9B651D215198A9378C3 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + A7747B74D9EE7ADAE844D664C3980197 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + A8DD7AFDF69A01A9CFAB0DB5495015DC /* Pods-RyffTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RyffTests-acknowledgements.plist"; sourceTree = ""; }; + A94BDA597E1ADA29938165998A47AD09 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; + AA6A14414AEF261F477715DB0B67B4D7 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + AB5BB98F7A3F26BEA35419DA57E72D45 /* CHTCollectionViewWaterfallLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = CHTCollectionViewWaterfallLayout.h; sourceTree = ""; }; + AC5146F912626755A73BE198CBA7E54C /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + AC6B85737682A75C20B2F45FF99FDC8A /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = AFNetworking.modulemap; sourceTree = ""; }; + AC9C3498B40210B7AD11A75EB9870604 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + AECB629B9A39EBAF3D48527C5BAB9132 /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLConnectionOperation.h; path = AFNetworking/AFURLConnectionOperation.h; sourceTree = ""; }; + AF4AC8FE21C01A522E6081F787113829 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; + AFCF03A0BE0B8BE55CF87C8D392AFFCE /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperationManager.m; path = AFNetworking/AFHTTPRequestOperationManager.m; sourceTree = ""; }; + B07AA3467F8CE289818649DFE931FD8D /* Pods-RyffTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RyffTests.release.xcconfig"; sourceTree = ""; }; + B0FAAFFC957CA08FEC72F8619587969F /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B34BA00ACA50E43DA227AEB0563865EE /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + B5840EFD1459121C6D3A5AF321FCAB63 /* CHTCollectionViewWaterfallLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CHTCollectionViewWaterfallLayout-prefix.pch"; sourceTree = ""; }; + B6BE7A3FC3B0FE93835063561AE3FB12 /* MBProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-prefix.pch"; sourceTree = ""; }; + B8AAABEF5EF0996EA146A29BEAE3A4C3 /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BAF07AF20E0D1E0FA491D86DF646E111 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + BB85E059F7161FF0014729F57DD04403 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + BC3D26F3B472685D055945F953593ABB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C164655AD11306C05891984EDABDF3A3 /* Pods-Ryff-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Ryff-resources.sh"; sourceTree = ""; }; + C3489A09D0A73AD1CA6018E9BAFD7582 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + C4580DDF6D03E725E7B3A907484D7FA5 /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLConnectionOperation.m; path = AFNetworking/AFURLConnectionOperation.m; sourceTree = ""; }; + C5CB810F4DCB2E48814F054A23B05007 /* SSKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SSKeychain.m; path = SSKeychain/SSKeychain.m; sourceTree = ""; }; + C5E378C0115E30CFE1AFF2AD39FC93F9 /* CHTCollectionViewWaterfallLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CHTCollectionViewWaterfallLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C85E22319FB65CC3422D0CC6E7D8BBE0 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + C8E2388FD120DAAFABA67B4EB1358BC6 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + C9E43659F5F95E0DFC4738B7F958E252 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + D330BE5ED2C117C3AC793BC848889EC7 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + D56737A3C70E62CE1C65CBD9ACA396E8 /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperationManager.h; path = AFNetworking/AFHTTPRequestOperationManager.h; sourceTree = ""; }; + DBAA2BF1E25B19C8383E7365A90E20E9 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + DEDC47454762C960F6DF6CD45898E0E7 /* SSKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SSKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DEFF865B36632B0869C126B057703031 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + DF3E13D718420ECAD78C68C4208FD9E1 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; + E0A3482E4AEB5DD2BC6DAC9D1EBA2CA9 /* KRLCollectionViewGridLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KRLCollectionViewGridLayout.xcconfig; sourceTree = ""; }; + E0D800F22CA0E020B76C9FA413D0F081 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + E30FBCC8EA678E0E7540A01BBFE19FB9 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + E324DF51380D38386B8EAF5E83F86A7F /* UIAlertView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+AFNetworking.h"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.h"; sourceTree = ""; }; + E3E46F281D005906EAC9ADD534A08F1A /* AFNetworking-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AFNetworking-Private.xcconfig"; sourceTree = ""; }; + E565EAB874E0326DAF1E5958673C7D8E /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + E8E243AEBB52CDAB037C96F2DC1FE70D /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + E9A9B594ABAF22E020DEB8838148341A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E9C3DA5137532E6A3DD7C448A1B208B7 /* Pods-Ryff-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Ryff-frameworks.sh"; sourceTree = ""; }; + ED9674F556FD4C97376EEC8CE7AF4AD3 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; + F557D3AA40B7DE218541E2385B99EB73 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + F584ACAC1E6734C0CD383937E8FA1616 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + F63ACC2DF7087060CB707D29F580E447 /* Pods_RyffTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RyffTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F6EA380D1D4171B11C973D86A9C8D8BA /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + F72491D572DFE618CD091F20C22D5511 /* SSKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SSKeychain.h; path = SSKeychain/SSKeychain.h; sourceTree = ""; }; + F77D18DA42F04FF675FEB773EE99C26C /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + FAD0EFAC7D1D87DB12BFC04FC6393D0C /* MBProgressHUD-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "MBProgressHUD-Private.xcconfig"; sourceTree = ""; }; + FBE66132E4D8A106F76CE1E02AD5FF3F /* Pods-Ryff.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Ryff.release.xcconfig"; sourceTree = ""; }; + FC1CFFC7D00C8033DD4F1B26FD0C07EB /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + FD02F2A7C7CFDDC0B359686E4CDAAA91 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + FD60E72F56E14EB8B3DB0F33B68B5510 /* MBProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; + FEFE78AD67C100D0C0E1A4658529443E /* Pods-Ryff.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Ryff.modulemap"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13C4C79A2DC058D94813CFBA529E9F47 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 50B1E1FB5A25496065BD9AB641A60C49 /* CoreGraphics.framework in Frameworks */, + 9ECCE004E4E1455858103FA6769E89A9 /* Foundation.framework in Frameworks */, + EF046D15D0289AF048FFFF05235EFA8B /* MobileCoreServices.framework in Frameworks */, + 71E05D8631A381BF07151BDB21BA3BF6 /* Security.framework in Frameworks */, + DD46128C384E304744F73980026D6921 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1ABF50DD0E18F537F34FA3C39D023FCE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 584D2B8790B0525E7B36DE31DCD55BD5 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2F2055C68510DDA4EB370FA722330DF6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F956B1FD90989021518437DB2D4D6EA3 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7CA248BD50CEFBA7AEDE7CB02F422719 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78E22F8726832F30519EEBB0E423733E /* Foundation.framework in Frameworks */, + 515D24EF41F4D6953D574B393084AB4A /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8B40DED2ACFED6795082DE9878853B9F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 459884A00851413B2B51475DB2426237 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A4A233BDFF06C50E48093555087F43EC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EBB2598081C4F2442C1C8C885412F5A2 /* Foundation.framework in Frameworks */, + 5654AEE6228ED8E59D716B59A086B638 /* ImageIO.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B568F885AD9B73677ACD6AD643BC6720 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0ECC9807A32F60FB56E7CA5F914E8D0F /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BA6D69F0A49585443C9633EE2E43D75D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 710B5BFC6E76A29F70884841FAA0D5A0 /* CoreGraphics.framework in Frameworks */, + 4F0F50DAED05967755CB80590169895F /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0F75DF6C7C5F002280EC53F48E80B587 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 999792CF8282488E81EFA3F843572F37 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 12CB5372B5E230C0A4D91C150BD48393 /* Support Files */ = { + isa = PBXGroup; + children = ( + 48DFB03630976ADB6605A0CC016E9670 /* CHTCollectionViewWaterfallLayout.modulemap */, + 64635ECCDCD4F7C95F98B3C9A0EF6715 /* CHTCollectionViewWaterfallLayout.xcconfig */, + 979BE1B20A85556B7E68092EF68F0CD4 /* CHTCollectionViewWaterfallLayout-Private.xcconfig */, + 06FF87713A9671AA978663D19968E96C /* CHTCollectionViewWaterfallLayout-dummy.m */, + B5840EFD1459121C6D3A5AF321FCAB63 /* CHTCollectionViewWaterfallLayout-prefix.pch */, + 6777EFED8FF4E2B375842272CC8EFB7D /* CHTCollectionViewWaterfallLayout-umbrella.h */, + BC3D26F3B472685D055945F953593ABB /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/CHTCollectionViewWaterfallLayout"; + sourceTree = ""; + }; + 1DF3F8C759E6362DAAB2B87063692939 /* Reachability */ = { + isa = PBXGroup; + children = ( + FD02F2A7C7CFDDC0B359686E4CDAAA91 /* AFNetworkReachabilityManager.h */, + A7747B74D9EE7ADAE844D664C3980197 /* AFNetworkReachabilityManager.m */, + ); + name = Reachability; + sourceTree = ""; + }; + 2FBCB7C01514DDEDA9E0790618E9EE9F /* NSURLConnection */ = { + isa = PBXGroup; + children = ( + 497C9FF86881772C6EB450E184D623B6 /* AFHTTPRequestOperation.h */, + 591001B2946F9C950A2C08AEA73BCDFB /* AFHTTPRequestOperation.m */, + D56737A3C70E62CE1C65CBD9ACA396E8 /* AFHTTPRequestOperationManager.h */, + AFCF03A0BE0B8BE55CF87C8D392AFFCE /* AFHTTPRequestOperationManager.m */, + AECB629B9A39EBAF3D48527C5BAB9132 /* AFURLConnectionOperation.h */, + C4580DDF6D03E725E7B3A907484D7FA5 /* AFURLConnectionOperation.m */, + ); + name = NSURLConnection; + sourceTree = ""; + }; + 3315F79580365F4440DFEA5F4D39D367 /* CHTCollectionViewWaterfallLayout */ = { + isa = PBXGroup; + children = ( + AB5BB98F7A3F26BEA35419DA57E72D45 /* CHTCollectionViewWaterfallLayout.h */, + 1A1F11685F922EF377D71BD8A9C18B0D /* CHTCollectionViewWaterfallLayout.m */, + 12CB5372B5E230C0A4D91C150BD48393 /* Support Files */, + ); + path = CHTCollectionViewWaterfallLayout; + sourceTree = ""; + }; + 4A9127D59337DB5BEA1EC1C591B6DEF4 /* Support Files */ = { + isa = PBXGroup; + children = ( + 70C21498B40E92CBC82F9A5EDB2C6471 /* Info.plist */, + 67D0B176A1FA045CD1980740AE42A68C /* MBProgressHUD.modulemap */, + 84D8A5462333033560CF7C5C72464DA7 /* MBProgressHUD.xcconfig */, + FAD0EFAC7D1D87DB12BFC04FC6393D0C /* MBProgressHUD-Private.xcconfig */, + 5395176661F6AB61E7819354BA95631D /* MBProgressHUD-dummy.m */, + B6BE7A3FC3B0FE93835063561AE3FB12 /* MBProgressHUD-prefix.pch */, + 2AD40C2BCE7300E734CF2AFDF7B1BA14 /* MBProgressHUD-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/MBProgressHUD"; + sourceTree = ""; + }; + 4D546357BCC6360106DDBEE03F9F75B7 /* Security */ = { + isa = PBXGroup; + children = ( + 3A7AB7DC18FECAFDD160962C085AC41E /* AFSecurityPolicy.h */, + 172D4C3C7BC43A2B91AAFF8B0A8B31B8 /* AFSecurityPolicy.m */, + ); + name = Security; + sourceTree = ""; + }; + 5709003FA3D9172B9FEDBE412A2B73F6 /* Support Files */ = { + isa = PBXGroup; + children = ( + AC6B85737682A75C20B2F45FF99FDC8A /* AFNetworking.modulemap */, + 2880D6EF966902E7B5D5E4C9CAC63732 /* AFNetworking.xcconfig */, + E3E46F281D005906EAC9ADD534A08F1A /* AFNetworking-Private.xcconfig */, + 5E346C825522F31683C4EFC424D82722 /* AFNetworking-dummy.m */, + ED9674F556FD4C97376EEC8CE7AF4AD3 /* AFNetworking-prefix.pch */, + B8AAABEF5EF0996EA146A29BEAE3A4C3 /* AFNetworking-umbrella.h */, + 38138E55564D749D4112D6779D7A031A /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/AFNetworking"; + sourceTree = ""; + }; + 68A597BCCFB262D16839020E55B1A20C /* Pods */ = { + isa = PBXGroup; + children = ( + D962A180817FE138FA15ED094323A1E8 /* AFNetworking */, + 3315F79580365F4440DFEA5F4D39D367 /* CHTCollectionViewWaterfallLayout */, + 6FCF10A6570C4610A9EA3BC18222AA31 /* KRLCollectionViewGridLayout */, + DFEB8CB9BD8AD3795D5E7E8DAAFC6CE4 /* MBProgressHUD */, + B0E7E074AA903BF8BE69059AD2FDDCC2 /* SDWebImage */, + AA02A5EA89A8BB46FAFA8C56CC86DA52 /* SSKeychain */, + ); + name = Pods; + sourceTree = ""; + }; + 6D9FBD76CBEBAE2E2B483D9B3141EA53 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2BA5F1DBF0E5B68AD7B49B112CFFF41B /* Info.plist */, + 5F4D3BF1FE8958790FA65150F134E8FF /* SSKeychain.modulemap */, + 2FDEA0A7653DAB09CEDA4AA567334D9B /* SSKeychain.xcconfig */, + 4A280CF3EB2B037A4082FAC5F526F93E /* SSKeychain-Private.xcconfig */, + 9FDC5EB2DCE96D0D88865B0772C9CB82 /* SSKeychain-dummy.m */, + 1A9FBA2A42AEA90E3C3DC795DDFBD288 /* SSKeychain-prefix.pch */, + 872B1E46287B99926422E44640962F59 /* SSKeychain-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SSKeychain"; + sourceTree = ""; + }; + 6FCF10A6570C4610A9EA3BC18222AA31 /* KRLCollectionViewGridLayout */ = { + isa = PBXGroup; + children = ( + 7056C673F5763003884B08ADC19FC04D /* KRLCollectionViewGridLayout.h */, + 7FBE463CCCB4F5B857722F15376DF1C8 /* KRLCollectionViewGridLayout.m */, + 7F14FC0C9DEFE20B96D6F65F0DFD8C41 /* Support Files */, + ); + path = KRLCollectionViewGridLayout; + sourceTree = ""; + }; + 73FBC8BD7502CFE61BA1DD5514204589 /* Core */ = { + isa = PBXGroup; + children = ( + BAF07AF20E0D1E0FA491D86DF646E111 /* NSData+ImageContentType.h */, + A94BDA597E1ADA29938165998A47AD09 /* NSData+ImageContentType.m */, + B34BA00ACA50E43DA227AEB0563865EE /* SDImageCache.h */, + 0EB8F84003EAC8D25AAA335FB4891742 /* SDImageCache.m */, + 4FEF7F2015C0ACCC5A06F88736F7D83D /* SDWebImageCompat.h */, + 63207122068F629D33DDB7EB25FCB21C /* SDWebImageCompat.m */, + 31585A9399288301ACA227290D428045 /* SDWebImageDecoder.h */, + 03B4E571A83C7139215C766DF64FCFC5 /* SDWebImageDecoder.m */, + 7A5E11473DD802A45E5F8554929B8738 /* SDWebImageDownloader.h */, + 992625925D1C9BA1A0BA2261E561937B /* SDWebImageDownloader.m */, + 5ED9E4D7280AD4122656B1508BC28D54 /* SDWebImageDownloaderOperation.h */, + E565EAB874E0326DAF1E5958673C7D8E /* SDWebImageDownloaderOperation.m */, + 065352E6AEDDBF7E5A7A30AFEC26570D /* SDWebImageManager.h */, + A233317F8104BC27DD073EBFB8C57EEC /* SDWebImageManager.m */, + C8E2388FD120DAAFABA67B4EB1358BC6 /* SDWebImageOperation.h */, + AC9C3498B40210B7AD11A75EB9870604 /* SDWebImagePrefetcher.h */, + AF4AC8FE21C01A522E6081F787113829 /* SDWebImagePrefetcher.m */, + DBAA2BF1E25B19C8383E7365A90E20E9 /* UIButton+WebCache.h */, + E8E243AEBB52CDAB037C96F2DC1FE70D /* UIButton+WebCache.m */, + F584ACAC1E6734C0CD383937E8FA1616 /* UIImage+GIF.h */, + D330BE5ED2C117C3AC793BC848889EC7 /* UIImage+GIF.m */, + 66848B793C8F96D9D9956D4C6E50B31C /* UIImage+MultiFormat.h */, + DEFF865B36632B0869C126B057703031 /* UIImage+MultiFormat.m */, + 35B078AE5EC4F5270B4A374144E32639 /* UIImageView+HighlightedWebCache.h */, + 190634E95E803CFC51AF5E97D7D402D5 /* UIImageView+HighlightedWebCache.m */, + 1244CADDF20771D037E1454D14AD41AE /* UIImageView+WebCache.h */, + 36D1315F8E69E96936F1473CC109C173 /* UIImageView+WebCache.m */, + 4F12C64A1CC3A23C1B3D9995C3BBED8E /* UIView+WebCacheOperation.h */, + 2F8827310B2FE42170810CE4AFF9D473 /* UIView+WebCacheOperation.m */, + ); + name = Core; + sourceTree = ""; + }; + 79411CB5A3E849E1D2DC22E1E61AE60D /* Pods-Ryff */ = { + isa = PBXGroup; + children = ( + E9A9B594ABAF22E020DEB8838148341A /* Info.plist */, + FEFE78AD67C100D0C0E1A4658529443E /* Pods-Ryff.modulemap */, + 9199ECD1C2A95515DD3F582E8B453185 /* Pods-Ryff-acknowledgements.markdown */, + 3176CD3F2E81F1C0272B55F008622FC3 /* Pods-Ryff-acknowledgements.plist */, + 04BDFF5CD68CA516F2D1289EEA772EA0 /* Pods-Ryff-dummy.m */, + E9C3DA5137532E6A3DD7C448A1B208B7 /* Pods-Ryff-frameworks.sh */, + C164655AD11306C05891984EDABDF3A3 /* Pods-Ryff-resources.sh */, + 722FCCF2BACB502D671F4357FC107B0F /* Pods-Ryff-umbrella.h */, + 0D6194FE4276423AE43107355B22D1BF /* Pods-Ryff.debug.xcconfig */, + FBE66132E4D8A106F76CE1E02AD5FF3F /* Pods-Ryff.release.xcconfig */, + ); + name = "Pods-Ryff"; + path = "Target Support Files/Pods-Ryff"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + 0F75DF6C7C5F002280EC53F48E80B587 /* Frameworks */, + 68A597BCCFB262D16839020E55B1A20C /* Pods */, + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, + BF5F541569FB48364F3ACC3F37848AD0 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 7F14FC0C9DEFE20B96D6F65F0DFD8C41 /* Support Files */ = { + isa = PBXGroup; + children = ( + 9F278B87A19B803DA5CECBE21A57D0AF /* Info.plist */, + 97847F96F58903692DF36F98C0FF8E84 /* KRLCollectionViewGridLayout.modulemap */, + E0A3482E4AEB5DD2BC6DAC9D1EBA2CA9 /* KRLCollectionViewGridLayout.xcconfig */, + 0FD11B540690F943D73758AF58040714 /* KRLCollectionViewGridLayout-Private.xcconfig */, + 05FE6216540F2DD58D59104D40801FD0 /* KRLCollectionViewGridLayout-dummy.m */, + 38D721F0F350AD41362303E040D8AC3A /* KRLCollectionViewGridLayout-prefix.pch */, + 085B558EAB1B0579E3662F941DDE1BC4 /* KRLCollectionViewGridLayout-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/KRLCollectionViewGridLayout"; + sourceTree = ""; + }; + 999792CF8282488E81EFA3F843572F37 /* iOS */ = { + isa = PBXGroup; + children = ( + C85E22319FB65CC3422D0CC6E7D8BBE0 /* CoreGraphics.framework */, + 58D26857FBADF6A33713439E2245E5AB /* Foundation.framework */, + E0D800F22CA0E020B76C9FA413D0F081 /* ImageIO.framework */, + 5896583D78CF567DFA1B07FBB1247F58 /* MobileCoreServices.framework */, + 97759F43444EF9B6C4D2A6DBA8862117 /* Security.framework */, + 1611459F3D3441C53E6C1D35FB40F518 /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + A69E94DB4C4CFDB9308302478CC279A8 /* Support Files */ = { + isa = PBXGroup; + children = ( + A20703C3817C4F979C6584BA1E8505DC /* Info.plist */, + 6118ADAA57387FF9F72ABB9272036B46 /* SDWebImage.modulemap */, + C3489A09D0A73AD1CA6018E9BAFD7582 /* SDWebImage.xcconfig */, + 981E8E5CE606C1CB4F23A5658AEFD04C /* SDWebImage-Private.xcconfig */, + 95B066C3073F61164D226DF56C7D705D /* SDWebImage-dummy.m */, + 10F28CCFBB5E36AEEFCFF818E13B4778 /* SDWebImage-prefix.pch */, + 50D5153F825E59E39BBF9940B1F3058F /* SDWebImage-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + AA02A5EA89A8BB46FAFA8C56CC86DA52 /* SSKeychain */ = { + isa = PBXGroup; + children = ( + F72491D572DFE618CD091F20C22D5511 /* SSKeychain.h */, + C5CB810F4DCB2E48814F054A23B05007 /* SSKeychain.m */, + 7842E81B89DB03AEC44D01F5CDB4615D /* SSKeychainQuery.h */, + 405DAD33079CE3CE214EF60AE0A2AF08 /* SSKeychainQuery.m */, + 6D9FBD76CBEBAE2E2B483D9B3141EA53 /* Support Files */, + ); + path = SSKeychain; + sourceTree = ""; + }; + B0E7E074AA903BF8BE69059AD2FDDCC2 /* SDWebImage */ = { + isa = PBXGroup; + children = ( + 73FBC8BD7502CFE61BA1DD5514204589 /* Core */, + A69E94DB4C4CFDB9308302478CC279A8 /* Support Files */, + ); + path = SDWebImage; + sourceTree = ""; + }; + B5207008C49B61D3D3DDA9D8C33C3CF1 /* UIKit */ = { + isa = PBXGroup; + children = ( + 0A22AE8B8B8CF29A866032716A722E64 /* AFNetworkActivityIndicatorManager.h */, + 7BD2ED8D65823991044F8F6B6A1F75DF /* AFNetworkActivityIndicatorManager.m */, + F6EA380D1D4171B11C973D86A9C8D8BA /* UIActivityIndicatorView+AFNetworking.h */, + F77D18DA42F04FF675FEB773EE99C26C /* UIActivityIndicatorView+AFNetworking.m */, + E324DF51380D38386B8EAF5E83F86A7F /* UIAlertView+AFNetworking.h */, + 5C146E8FDD433656BCED9366C9443F6A /* UIAlertView+AFNetworking.m */, + 955C4D7CF225183C84AA3D2F3E010CB5 /* UIButton+AFNetworking.h */, + 0099C626AF30EC52BB2A29B99176C2FB /* UIButton+AFNetworking.m */, + DF3E13D718420ECAD78C68C4208FD9E1 /* UIImage+AFNetworking.h */, + AA6A14414AEF261F477715DB0B67B4D7 /* UIImageView+AFNetworking.h */, + 82CF481D7A598D18A79EDF3B0AF9B0F4 /* UIImageView+AFNetworking.m */, + 5EE9991FA5B1ACA0F845C51DA13E7CDB /* UIKit+AFNetworking.h */, + F557D3AA40B7DE218541E2385B99EB73 /* UIProgressView+AFNetworking.h */, + 2AF0755A4302A26224235AFF270647DE /* UIProgressView+AFNetworking.m */, + 63D8AF70BF0337074F240803CFD505E4 /* UIRefreshControl+AFNetworking.h */, + FC1CFFC7D00C8033DD4F1B26FD0C07EB /* UIRefreshControl+AFNetworking.m */, + 199314128ABD1E7069E5D03640B37FD6 /* UIWebView+AFNetworking.h */, + 3016012A25D077C7474078197720D23C /* UIWebView+AFNetworking.m */, + ); + name = UIKit; + sourceTree = ""; + }; + BA59050928E1CC8EFAB72616F720CC8B /* Serialization */ = { + isa = PBXGroup; + children = ( + 2B23A47CEF1D20A36FBD55EE05202579 /* AFURLRequestSerialization.h */, + 45DD483C3945A87AB4D192E8FCA42E32 /* AFURLRequestSerialization.m */, + E30FBCC8EA678E0E7540A01BBFE19FB9 /* AFURLResponseSerialization.h */, + AC5146F912626755A73BE198CBA7E54C /* AFURLResponseSerialization.m */, + ); + name = Serialization; + sourceTree = ""; + }; + BF5F541569FB48364F3ACC3F37848AD0 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 79411CB5A3E849E1D2DC22E1E61AE60D /* Pods-Ryff */, + CD56ADF5AD038D195ECB05799EBBF499 /* Pods-RyffTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + C6D2364EC051D3753982474CFA90A9D8 /* NSURLSession */ = { + isa = PBXGroup; + children = ( + 164F10F771B605E17352DED2CA35EA0E /* AFHTTPSessionManager.h */, + BB85E059F7161FF0014729F57DD04403 /* AFHTTPSessionManager.m */, + 0EDA1012AC3F49F68F48CA3E570B3A1E /* AFURLSessionManager.h */, + C9E43659F5F95E0DFC4738B7F958E252 /* AFURLSessionManager.m */, + ); + name = NSURLSession; + sourceTree = ""; + }; + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { + isa = PBXGroup; + children = ( + B0FAAFFC957CA08FEC72F8619587969F /* AFNetworking.framework */, + C5E378C0115E30CFE1AFF2AD39FC93F9 /* CHTCollectionViewWaterfallLayout.framework */, + 44510ADC7D6F5BF9C659467F042C34E8 /* KRLCollectionViewGridLayout.framework */, + 742385D617846ECC2941F0F912C01C0B /* MBProgressHUD.framework */, + 890CB5D352C5511747D249D512E64349 /* Pods_Ryff.framework */, + F63ACC2DF7087060CB707D29F580E447 /* Pods_RyffTests.framework */, + 2E55A4429F063A37A9B01D65C08EDB37 /* SDWebImage.framework */, + DEDC47454762C960F6DF6CD45898E0E7 /* SSKeychain.framework */, + ); + name = Products; + sourceTree = ""; + }; + CD56ADF5AD038D195ECB05799EBBF499 /* Pods-RyffTests */ = { + isa = PBXGroup; + children = ( + 0476DDA38E56E573B0F83C7B07125DCD /* Info.plist */, + 4812895C615630B7D36F1DA7EFDF6549 /* Pods-RyffTests.modulemap */, + 282A5C812590F7B349B7D5532434DC97 /* Pods-RyffTests-acknowledgements.markdown */, + A8DD7AFDF69A01A9CFAB0DB5495015DC /* Pods-RyffTests-acknowledgements.plist */, + 91A054E90A5417EC5BABCA194ADD6DB0 /* Pods-RyffTests-dummy.m */, + 355E4C292EFDB17D5EABE71377282139 /* Pods-RyffTests-frameworks.sh */, + 059B25ADAE64C558ACDB35973B79EC6B /* Pods-RyffTests-resources.sh */, + 92F3CA31F9EA4A7D79B49B1202BEDF20 /* Pods-RyffTests-umbrella.h */, + 8AD3E4D58DA37F6886DFAA846ACAE5B0 /* Pods-RyffTests.debug.xcconfig */, + B07AA3467F8CE289818649DFE931FD8D /* Pods-RyffTests.release.xcconfig */, + ); + name = "Pods-RyffTests"; + path = "Target Support Files/Pods-RyffTests"; + sourceTree = ""; + }; + D962A180817FE138FA15ED094323A1E8 /* AFNetworking */ = { + isa = PBXGroup; + children = ( + A6CC08341C3AF9B651D215198A9378C3 /* AFNetworking.h */, + 2FBCB7C01514DDEDA9E0790618E9EE9F /* NSURLConnection */, + C6D2364EC051D3753982474CFA90A9D8 /* NSURLSession */, + 1DF3F8C759E6362DAAB2B87063692939 /* Reachability */, + 4D546357BCC6360106DDBEE03F9F75B7 /* Security */, + BA59050928E1CC8EFAB72616F720CC8B /* Serialization */, + 5709003FA3D9172B9FEDBE412A2B73F6 /* Support Files */, + B5207008C49B61D3D3DDA9D8C33C3CF1 /* UIKit */, + ); + path = AFNetworking; + sourceTree = ""; + }; + DFEB8CB9BD8AD3795D5E7E8DAAFC6CE4 /* MBProgressHUD */ = { + isa = PBXGroup; + children = ( + 1FDA1A6D82E82A89AC02165E2DE7469A /* MBProgressHUD.h */, + FD60E72F56E14EB8B3DB0F33B68B5510 /* MBProgressHUD.m */, + 4A9127D59337DB5BEA1EC1C591B6DEF4 /* Support Files */, + ); + path = MBProgressHUD; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 0A5228670865E1B546BBA28E0C4C7C1F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 569A785A2BDF85BF692E19E0DC83D250 /* Pods-RyffTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 143611D604F3DAE99CC07DC48114F70D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F560DE4BE9B5140C952194BAEDDEB1EE /* AFHTTPRequestOperation.h in Headers */, + 4E51960B56F4DB69552A9A76A3C75BF4 /* AFHTTPRequestOperationManager.h in Headers */, + 58E3614287C3DDC2251B53FF8E2F0686 /* AFHTTPSessionManager.h in Headers */, + CE65CF46A4E8BA8DC56202221ED6A214 /* AFNetworkActivityIndicatorManager.h in Headers */, + 3AB839A1A07432CFF78644D201C9843C /* AFNetworkReachabilityManager.h in Headers */, + 60F53E2C1F5F5492A6D6E9F8777B6E02 /* AFNetworking-umbrella.h in Headers */, + 9B54EB4CD91228093E76FD2D76A712FE /* AFNetworking.h in Headers */, + 24F1DABB787B064225C362F166757332 /* AFSecurityPolicy.h in Headers */, + 68B2FBC16592EE6FDC405FD974AADFDF /* AFURLConnectionOperation.h in Headers */, + A9431C5205302B6E93954A4F489A4639 /* AFURLRequestSerialization.h in Headers */, + E8FFBEEF2CDFBA2F0260B45FDE92A489 /* AFURLResponseSerialization.h in Headers */, + 768EFC7B405E2AB4FFA98439BF4FF50D /* AFURLSessionManager.h in Headers */, + 70FF81AAB9F5AA6BEEB0EB6410D55823 /* UIActivityIndicatorView+AFNetworking.h in Headers */, + 99011BA6886A006C1B66466E555B7021 /* UIAlertView+AFNetworking.h in Headers */, + 8397444E32521D2FFF6DEEA7406074E6 /* UIButton+AFNetworking.h in Headers */, + 211A2E1E71DB396002E53C3E952A8A63 /* UIImage+AFNetworking.h in Headers */, + A235FFC5F1AAF0937C9407B9D5D71F2D /* UIImageView+AFNetworking.h in Headers */, + AC71E006E2DF344B050FB25A4E553501 /* UIKit+AFNetworking.h in Headers */, + ABC5DE6E9261B08CC53136872745D5D2 /* UIProgressView+AFNetworking.h in Headers */, + 71D03085C8FD0F6507EEEF130646F0E7 /* UIRefreshControl+AFNetworking.h in Headers */, + EAEB59DFA3BE09196DB2A4863D86AD2B /* UIWebView+AFNetworking.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7161FBAEF10EE2F9700CB6A259744634 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A5DE53190BE217689F5BE109FEC20A1A /* SSKeychain-umbrella.h in Headers */, + 2285FC98B68173BE0EAC5A516464AB5E /* SSKeychain.h in Headers */, + 35DAEFCFD582A5B69C93BDC5C717C3B1 /* SSKeychainQuery.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 90F0081D19ABC6C3AAA646CB85A20726 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8CFEF461CF837247C4E7941E983B6D17 /* CHTCollectionViewWaterfallLayout-umbrella.h in Headers */, + 40633E1155521D903331A83EC49A9C44 /* CHTCollectionViewWaterfallLayout.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A5619DC80A7EB8C542267F33D17BBABB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D362FAD26768847748A61A7E58BD69A2 /* Pods-Ryff-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D24E0A1AF7799E2E3AFE1031634B00EF /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 13CA33948C7BDA9E65C680551E1E919A /* MBProgressHUD-umbrella.h in Headers */, + AAEAA5B71E35B6307573AF99BCEA65A4 /* MBProgressHUD.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D6D8CB456E549CFA4BF4B84869A6884E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + AAA138F0836AAFE699EDD6B15E439F74 /* NSData+ImageContentType.h in Headers */, + D1376A9522BA91238282A6FA7D7341D0 /* SDImageCache.h in Headers */, + 5E2784A3B9C7733A87F29FF89961C6C8 /* SDWebImage-umbrella.h in Headers */, + E085821F65F1A32318CBFA840744FC69 /* SDWebImageCompat.h in Headers */, + EE100E537E66C1060BE585901CCF89EA /* SDWebImageDecoder.h in Headers */, + 918925E758B9CF1EB782014504385933 /* SDWebImageDownloader.h in Headers */, + 50B5C323D893DDA2DFF62DFAB7F5A86C /* SDWebImageDownloaderOperation.h in Headers */, + 00A5C06D70A19916A3AA16B56A6B06DE /* SDWebImageManager.h in Headers */, + 241BBDAFDCD5BDE21BEC3953A470E7AC /* SDWebImageOperation.h in Headers */, + 8197E1EF4D2114D8076C293EBACE80C3 /* SDWebImagePrefetcher.h in Headers */, + EF20481E3F608C296BA47762FA58AFB5 /* UIButton+WebCache.h in Headers */, + 00D64D8D069226AA544C9B2BE414B310 /* UIImage+GIF.h in Headers */, + DE13B71A1C823DFD2CD8CDFCA3280FC2 /* UIImage+MultiFormat.h in Headers */, + F63EA8AE45984DB1C7B34A64A1FB00D5 /* UIImageView+HighlightedWebCache.h in Headers */, + 8C1301CCB38A010C5E77AE3870FB366F /* UIImageView+WebCache.h in Headers */, + DB580210012243B347B8A79D25577F89 /* UIView+WebCacheOperation.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F2F756A111AA28A2766179949BB0D9F6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F4BB263BE90575F39E6F90621B8BF43A /* KRLCollectionViewGridLayout-umbrella.h in Headers */, + F64247D0BFC08D7FDB86D1C4F22CBDDD /* KRLCollectionViewGridLayout.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 12D9723DA6FC9334CE1435F1F069EE49 /* AFNetworking */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2960A25680872A5C052BF7948889B13F /* Build configuration list for PBXNativeTarget "AFNetworking" */; + buildPhases = ( + 632F02D777852B00063514FEA3AE1914 /* Sources */, + 13C4C79A2DC058D94813CFBA529E9F47 /* Frameworks */, + 143611D604F3DAE99CC07DC48114F70D /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AFNetworking; + productName = AFNetworking; + productReference = B0FAAFFC957CA08FEC72F8619587969F /* AFNetworking.framework */; + productType = "com.apple.product-type.framework"; + }; + 4EB6DFE12524FD2DA752B684CE4CF6F0 /* Pods-Ryff */ = { + isa = PBXNativeTarget; + buildConfigurationList = E5446B40F69FDF12AE0119390CE2839F /* Build configuration list for PBXNativeTarget "Pods-Ryff" */; + buildPhases = ( + 771794D4EF9345BDE494A1B95181B9BC /* Sources */, + 1ABF50DD0E18F537F34FA3C39D023FCE /* Frameworks */, + A5619DC80A7EB8C542267F33D17BBABB /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + AB12E15EFCC8F7F9402E0D359564705C /* PBXTargetDependency */, + EA4EC7EB10E8D79DD6DA3C7AE4F516DF /* PBXTargetDependency */, + 7A03C2AD442F920BF37397166EC7681F /* PBXTargetDependency */, + 70EF93725C6822335987225933565B81 /* PBXTargetDependency */, + 48C291B71AD19BF847C5F9CB90159DAD /* PBXTargetDependency */, + E7F5795C2CD6CF7888563A32BEFC6A69 /* PBXTargetDependency */, + ); + name = "Pods-Ryff"; + productName = "Pods-Ryff"; + productReference = 890CB5D352C5511747D249D512E64349 /* Pods_Ryff.framework */; + productType = "com.apple.product-type.framework"; + }; + 8933734DEB8C707799F8C16D5EF95254 /* Pods-RyffTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 234FF63E6C706C7B08131347614113A4 /* Build configuration list for PBXNativeTarget "Pods-RyffTests" */; + buildPhases = ( + 930B8F56B8989BEABC68382ED0F59382 /* Sources */, + 8B40DED2ACFED6795082DE9878853B9F /* Frameworks */, + 0A5228670865E1B546BBA28E0C4C7C1F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 598ADBEDF964E93B95ED7CA04CBE3D62 /* PBXTargetDependency */, + E95B2B655D8E5C83DCE8B68DB4A84656 /* PBXTargetDependency */, + 7B829A8EA4ED1564FB388E44B4551B1C /* PBXTargetDependency */, + E58FDC2F06003406DDFEF799410CA27A /* PBXTargetDependency */, + D0E791D16A98B4E433828C78EF3740D2 /* PBXTargetDependency */, + 6295AEBF7C257EDB1539E1506ADB56CF /* PBXTargetDependency */, + ); + name = "Pods-RyffTests"; + productName = "Pods-RyffTests"; + productReference = F63ACC2DF7087060CB707D29F580E447 /* Pods_RyffTests.framework */; + productType = "com.apple.product-type.framework"; + }; + 9666688CB41B38A9914616144C9C7A3E /* SDWebImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9A6FC2693C4E733D173751568F60144F /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildPhases = ( + 9E6D908EEC17B4F6ABB7DE67EC59EA9F /* Sources */, + A4A233BDFF06C50E48093555087F43EC /* Frameworks */, + D6D8CB456E549CFA4BF4B84869A6884E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SDWebImage; + productName = SDWebImage; + productReference = 2E55A4429F063A37A9B01D65C08EDB37 /* SDWebImage.framework */; + productType = "com.apple.product-type.framework"; + }; + AF7B2FC32BB12986BA0BF6C4CB51BFEE /* MBProgressHUD */ = { + isa = PBXNativeTarget; + buildConfigurationList = BA419317B466380869FAF0A490A55F71 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildPhases = ( + 26094B4AD2099CEED7DDA6B1D5067BEC /* Sources */, + BA6D69F0A49585443C9633EE2E43D75D /* Frameworks */, + D24E0A1AF7799E2E3AFE1031634B00EF /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MBProgressHUD; + productName = MBProgressHUD; + productReference = 742385D617846ECC2941F0F912C01C0B /* MBProgressHUD.framework */; + productType = "com.apple.product-type.framework"; + }; + C2814CF121DAF0BC8208C621CC869657 /* SSKeychain */ = { + isa = PBXNativeTarget; + buildConfigurationList = B01200C1D15189C7EBD24C32D8DECFB2 /* Build configuration list for PBXNativeTarget "SSKeychain" */; + buildPhases = ( + 3544E03E1EF907C92E51476F7ABE9F6A /* Sources */, + 7CA248BD50CEFBA7AEDE7CB02F422719 /* Frameworks */, + 7161FBAEF10EE2F9700CB6A259744634 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SSKeychain; + productName = SSKeychain; + productReference = DEDC47454762C960F6DF6CD45898E0E7 /* SSKeychain.framework */; + productType = "com.apple.product-type.framework"; + }; + D7B8FEA8CF7F5F6473FA000DAA7C17FD /* KRLCollectionViewGridLayout */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3BB4164186022B072C118C4208D6C496 /* Build configuration list for PBXNativeTarget "KRLCollectionViewGridLayout" */; + buildPhases = ( + C3E272C33FFE49D476871BF174FA99BD /* Sources */, + B568F885AD9B73677ACD6AD643BC6720 /* Frameworks */, + F2F756A111AA28A2766179949BB0D9F6 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = KRLCollectionViewGridLayout; + productName = KRLCollectionViewGridLayout; + productReference = 44510ADC7D6F5BF9C659467F042C34E8 /* KRLCollectionViewGridLayout.framework */; + productType = "com.apple.product-type.framework"; + }; + E2C7547D2DD7E86D2C40276BA99E896B /* CHTCollectionViewWaterfallLayout */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5465079CAB48484E25E499D756BCFF56 /* Build configuration list for PBXNativeTarget "CHTCollectionViewWaterfallLayout" */; + buildPhases = ( + 77CA576409499CE7C814A5BE8F28FC47 /* Sources */, + 2F2055C68510DDA4EB370FA722330DF6 /* Frameworks */, + 90F0081D19ABC6C3AAA646CB85A20726 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CHTCollectionViewWaterfallLayout; + productName = CHTCollectionViewWaterfallLayout; + productReference = C5E378C0115E30CFE1AFF2AD39FC93F9 /* CHTCollectionViewWaterfallLayout.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = CCA510CFBEA2D207524CDA0D73C3B561 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 12D9723DA6FC9334CE1435F1F069EE49 /* AFNetworking */, + E2C7547D2DD7E86D2C40276BA99E896B /* CHTCollectionViewWaterfallLayout */, + D7B8FEA8CF7F5F6473FA000DAA7C17FD /* KRLCollectionViewGridLayout */, + AF7B2FC32BB12986BA0BF6C4CB51BFEE /* MBProgressHUD */, + 4EB6DFE12524FD2DA752B684CE4CF6F0 /* Pods-Ryff */, + 8933734DEB8C707799F8C16D5EF95254 /* Pods-RyffTests */, + 9666688CB41B38A9914616144C9C7A3E /* SDWebImage */, + C2814CF121DAF0BC8208C621CC869657 /* SSKeychain */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 26094B4AD2099CEED7DDA6B1D5067BEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D66DB1043BFB18AB2D7CF58D57B67A0E /* MBProgressHUD-dummy.m in Sources */, + 8A456EFC298191CBBFF7D85604CEA7E9 /* MBProgressHUD.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3544E03E1EF907C92E51476F7ABE9F6A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 456B9D58898E4D5CB0CD9CD33E961691 /* SSKeychain-dummy.m in Sources */, + 1AD954E9D363C6D9CB634BC604DDB22A /* SSKeychain.m in Sources */, + 30BEFFAA33BB6FEC8E3E9DD82D5B7136 /* SSKeychainQuery.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 632F02D777852B00063514FEA3AE1914 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F48DD1C2F4A9628558E2FF8A35DF216 /* AFHTTPRequestOperation.m in Sources */, + 261B4E9A06A3A1D388F757EF58D78A1A /* AFHTTPRequestOperationManager.m in Sources */, + 3DA2D42C8F9D1751CBEC933D34375330 /* AFHTTPSessionManager.m in Sources */, + B940804524126D6424E37AFEDDC44B23 /* AFNetworkActivityIndicatorManager.m in Sources */, + DC6E0EA6614CA015BDDCF53BAE604D85 /* AFNetworkReachabilityManager.m in Sources */, + 43411424976E89634A60C11162CE94B8 /* AFNetworking-dummy.m in Sources */, + 5725D951B0142B7870F91BAA87B0E5BC /* AFSecurityPolicy.m in Sources */, + 02CEB4C761522684904801EA689BA480 /* AFURLConnectionOperation.m in Sources */, + 40CA03B1CF60C19AE2A9F479E0CD71CC /* AFURLRequestSerialization.m in Sources */, + 427A778E1CB6D71128A78D58DAC6F1A8 /* AFURLResponseSerialization.m in Sources */, + 86EECC0414A64A89566784C1BBA02EE4 /* AFURLSessionManager.m in Sources */, + D1320CBA4D58B961A25E27B3C197D571 /* UIActivityIndicatorView+AFNetworking.m in Sources */, + CAB3A3683CEE61562D6A807834A8F319 /* UIAlertView+AFNetworking.m in Sources */, + 45777A03ADD721AEB2ADAAB8B1E2EB6F /* UIButton+AFNetworking.m in Sources */, + 1357F26CC2D63D643A3BA38F9AB090FD /* UIImageView+AFNetworking.m in Sources */, + C01E67B25AF4C0DEF5977B8BF61400B7 /* UIProgressView+AFNetworking.m in Sources */, + 6E75A67C82FFA77F48FE1B687A175335 /* UIRefreshControl+AFNetworking.m in Sources */, + C6198EF2577E02DEC1992D817721A49A /* UIWebView+AFNetworking.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 771794D4EF9345BDE494A1B95181B9BC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5E4F516535B7F4C8490FE652FB29B9B /* Pods-Ryff-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 77CA576409499CE7C814A5BE8F28FC47 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2F7473CFFAE15009345F603836928B7A /* CHTCollectionViewWaterfallLayout-dummy.m in Sources */, + 535837724A1BDB4073189EC54508E5F5 /* CHTCollectionViewWaterfallLayout.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 930B8F56B8989BEABC68382ED0F59382 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 16A1E3B079AC96623BD2A172487AC9D4 /* Pods-RyffTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9E6D908EEC17B4F6ABB7DE67EC59EA9F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D294FC8161890785F2EE7845018C06E /* NSData+ImageContentType.m in Sources */, + 91838473483586AEE79A3CE5A8A0F760 /* SDImageCache.m in Sources */, + EC945F5BF9040A6635A6CBAC726A6096 /* SDWebImage-dummy.m in Sources */, + 0DFEEC44263FBCBAC890D12ADB7A5AB8 /* SDWebImageCompat.m in Sources */, + 67266B31FF6088E00ABD04BD2EA82A13 /* SDWebImageDecoder.m in Sources */, + 9531D255DFCEAD5AEBB69526351CDF10 /* SDWebImageDownloader.m in Sources */, + 27501010323D44134110117667A58821 /* SDWebImageDownloaderOperation.m in Sources */, + 36A3561BFAF840764C05F9500D87323F /* SDWebImageManager.m in Sources */, + 28812A5C5F5A20E6DF51920F3CDFF701 /* SDWebImagePrefetcher.m in Sources */, + C7C2A233E54E544AEB3C1E6D4612D20A /* UIButton+WebCache.m in Sources */, + A911D66CF6E80A517A1EE92B1BCD220A /* UIImage+GIF.m in Sources */, + EF42FBE937D524003A2B96FD1B3956C2 /* UIImage+MultiFormat.m in Sources */, + 3BA0E7F7756387D45AAC8B03DF002815 /* UIImageView+HighlightedWebCache.m in Sources */, + B5D4A3EFED42C133F2B03B3543699B29 /* UIImageView+WebCache.m in Sources */, + 14B1D5628D86026B80A02E77ECD9B00A /* UIView+WebCacheOperation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C3E272C33FFE49D476871BF174FA99BD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CE196452DEBD306AEF0C6CA952AA74F3 /* KRLCollectionViewGridLayout-dummy.m in Sources */, + 0F2798FA91027554045C7478CEB91C83 /* KRLCollectionViewGridLayout.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 48C291B71AD19BF847C5F9CB90159DAD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 9666688CB41B38A9914616144C9C7A3E /* SDWebImage */; + targetProxy = E08FAAAD8ED53105BEF98ADAFE74AABB /* PBXContainerItemProxy */; + }; + 598ADBEDF964E93B95ED7CA04CBE3D62 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AFNetworking; + target = 12D9723DA6FC9334CE1435F1F069EE49 /* AFNetworking */; + targetProxy = 8B9BAE0BF47548D7AB69916FE665387A /* PBXContainerItemProxy */; + }; + 6295AEBF7C257EDB1539E1506ADB56CF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SSKeychain; + target = C2814CF121DAF0BC8208C621CC869657 /* SSKeychain */; + targetProxy = 58C399F8BB60737868CF1CAB59107813 /* PBXContainerItemProxy */; + }; + 70EF93725C6822335987225933565B81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MBProgressHUD; + target = AF7B2FC32BB12986BA0BF6C4CB51BFEE /* MBProgressHUD */; + targetProxy = A04D5739982D023AAA10343223A145F0 /* PBXContainerItemProxy */; + }; + 7A03C2AD442F920BF37397166EC7681F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = KRLCollectionViewGridLayout; + target = D7B8FEA8CF7F5F6473FA000DAA7C17FD /* KRLCollectionViewGridLayout */; + targetProxy = 803E0AB89D59702AB2CA8B3EE68BD241 /* PBXContainerItemProxy */; + }; + 7B829A8EA4ED1564FB388E44B4551B1C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = KRLCollectionViewGridLayout; + target = D7B8FEA8CF7F5F6473FA000DAA7C17FD /* KRLCollectionViewGridLayout */; + targetProxy = 06BDCA59DAC9056E6A9D67874DB93C61 /* PBXContainerItemProxy */; + }; + AB12E15EFCC8F7F9402E0D359564705C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AFNetworking; + target = 12D9723DA6FC9334CE1435F1F069EE49 /* AFNetworking */; + targetProxy = D5282EC02A1490B25309404138F289F5 /* PBXContainerItemProxy */; + }; + D0E791D16A98B4E433828C78EF3740D2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 9666688CB41B38A9914616144C9C7A3E /* SDWebImage */; + targetProxy = 3BB836AB7F67D4733326220540391438 /* PBXContainerItemProxy */; + }; + E58FDC2F06003406DDFEF799410CA27A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MBProgressHUD; + target = AF7B2FC32BB12986BA0BF6C4CB51BFEE /* MBProgressHUD */; + targetProxy = DCC19B32287F890756B074A46704BDBD /* PBXContainerItemProxy */; + }; + E7F5795C2CD6CF7888563A32BEFC6A69 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SSKeychain; + target = C2814CF121DAF0BC8208C621CC869657 /* SSKeychain */; + targetProxy = 2E262B946B6481ACEC661C717144EA44 /* PBXContainerItemProxy */; + }; + E95B2B655D8E5C83DCE8B68DB4A84656 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = CHTCollectionViewWaterfallLayout; + target = E2C7547D2DD7E86D2C40276BA99E896B /* CHTCollectionViewWaterfallLayout */; + targetProxy = 3FC4DB1039E4E9315F4234A7885A596E /* PBXContainerItemProxy */; + }; + EA4EC7EB10E8D79DD6DA3C7AE4F516DF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = CHTCollectionViewWaterfallLayout; + target = E2C7547D2DD7E86D2C40276BA99E896B /* CHTCollectionViewWaterfallLayout */; + targetProxy = 8CB285FE6BDDE89E742A3C959FF06C54 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 009AEB0B0465388D494328BECBC8F560 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0FD11B540690F943D73758AF58040714 /* KRLCollectionViewGridLayout-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.4.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.4.0; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/KRLCollectionViewGridLayout/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = KRLCollectionViewGridLayout; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0982AE089DFC2CD2EA56BE93364A6AE6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 979BE1B20A85556B7E68092EF68F0CD4 /* CHTCollectionViewWaterfallLayout-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.9.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.9.2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CHTCollectionViewWaterfallLayout/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = CHTCollectionViewWaterfallLayout; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0ED2E168F745462E4DA637AD4778EC6C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FAD0EFAC7D1D87DB12BFC04FC6393D0C /* MBProgressHUD-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.9.1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.9.1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MBProgressHUD/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 2E2E52B439C027FDFACF9708181E158F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8AD3E4D58DA37F6886DFAA846ACAE5B0 /* Pods-RyffTests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-RyffTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-RyffTests/Pods-RyffTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_RyffTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 404B24647D0EB30964633B17F345A84E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A280CF3EB2B037A4082FAC5F526F93E /* SSKeychain-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.2.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SSKeychain/SSKeychain-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SSKeychain/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SSKeychain/SSKeychain.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SSKeychain; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 4CE031F396E4A243356B05E00941365C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A280CF3EB2B037A4082FAC5F526F93E /* SSKeychain-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.2.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SSKeychain/SSKeychain-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SSKeychain/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SSKeychain/SSKeychain.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SSKeychain; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 5ECAC210D1C570BA54049CE48D16DA3B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 979BE1B20A85556B7E68092EF68F0CD4 /* CHTCollectionViewWaterfallLayout-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.9.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.9.2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/CHTCollectionViewWaterfallLayout/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = CHTCollectionViewWaterfallLayout; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 719C0D5EB357693CB1228DA9DB4CACB6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FBE66132E4D8A106F76CE1E02AD5FF3F /* Pods-Ryff.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Ryff/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-Ryff/Pods-Ryff.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Ryff; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 763DB45EB53F6E54F929A0F25766B6C4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0FD11B540690F943D73758AF58040714 /* KRLCollectionViewGridLayout-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.4.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.4.0; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/KRLCollectionViewGridLayout/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = KRLCollectionViewGridLayout; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7953292DD83713871BFBAFD91D062058 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E3E46F281D005906EAC9ADD534A08F1A /* AFNetworking-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.6.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = AFNetworking; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 912D0853A57ED4D65B1B4692215C9945 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 981E8E5CE606C1CB4F23A5658AEFD04C /* SDWebImage-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 3.7.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 3; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9B9A671D1EAC0995AF44A871CA69BACF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E3E46F281D005906EAC9ADD534A08F1A /* AFNetworking-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.6.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = AFNetworking; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + AFF5B989CF7C90A5F30C879E4FABC5A7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B07AA3467F8CE289818649DFE931FD8D /* Pods-RyffTests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-RyffTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-RyffTests/Pods-RyffTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_RyffTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B63863C453BFA1FA2ADFAE740A5060CA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0D6194FE4276423AE43107355B22D1BF /* Pods-Ryff.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Ryff/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-Ryff/Pods-Ryff.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Ryff; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DA5A7C5CBF621224316C2F9EC7108BDA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 981E8E5CE606C1CB4F23A5658AEFD04C /* SDWebImage-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 3.7.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 3; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F6F2F1A5AA5E9A1802DF016C1751377A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FAD0EFAC7D1D87DB12BFC04FC6393D0C /* MBProgressHUD-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.9.1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.9.1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MBProgressHUD/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FB45FFD90572718D82AB9092B750F0CA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 234FF63E6C706C7B08131347614113A4 /* Build configuration list for PBXNativeTarget "Pods-RyffTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E2E52B439C027FDFACF9708181E158F /* Debug */, + AFF5B989CF7C90A5F30C879E4FABC5A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2960A25680872A5C052BF7948889B13F /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9B9A671D1EAC0995AF44A871CA69BACF /* Debug */, + 7953292DD83713871BFBAFD91D062058 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */, + FB45FFD90572718D82AB9092B750F0CA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3BB4164186022B072C118C4208D6C496 /* Build configuration list for PBXNativeTarget "KRLCollectionViewGridLayout" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 009AEB0B0465388D494328BECBC8F560 /* Debug */, + 763DB45EB53F6E54F929A0F25766B6C4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5465079CAB48484E25E499D756BCFF56 /* Build configuration list for PBXNativeTarget "CHTCollectionViewWaterfallLayout" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0982AE089DFC2CD2EA56BE93364A6AE6 /* Debug */, + 5ECAC210D1C570BA54049CE48D16DA3B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9A6FC2693C4E733D173751568F60144F /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 912D0853A57ED4D65B1B4692215C9945 /* Debug */, + DA5A7C5CBF621224316C2F9EC7108BDA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B01200C1D15189C7EBD24C32D8DECFB2 /* Build configuration list for PBXNativeTarget "SSKeychain" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CE031F396E4A243356B05E00941365C /* Debug */, + 404B24647D0EB30964633B17F345A84E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BA419317B466380869FAF0A490A55F71 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F6F2F1A5AA5E9A1802DF016C1751377A /* Debug */, + 0ED2E168F745462E4DA637AD4778EC6C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E5446B40F69FDF12AE0119390CE2839F /* Build configuration list for PBXNativeTarget "Pods-Ryff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B63863C453BFA1FA2ADFAE740A5060CA /* Debug */, + 719C0D5EB357693CB1228DA9DB4CACB6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/AFNetworking.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/AFNetworking.xcscheme new file mode 100644 index 0000000..dbfc5dd --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/AFNetworking.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme new file mode 100644 index 0000000..f8f6fcc --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme new file mode 100644 index 0000000..6727a7b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/MBProgressHUD.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/MBProgressHUD.xcscheme new file mode 100644 index 0000000..b387681 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/MBProgressHUD.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-Ryff.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-Ryff.xcscheme new file mode 100644 index 0000000..ae025fa --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-Ryff.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme new file mode 100644 index 0000000..6e9e323 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SDWebImage.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SDWebImage.xcscheme new file mode 100644 index 0000000..86741ee --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SSKeychain.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SSKeychain.xcscheme new file mode 100644 index 0000000..d4b9a7b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/SSKeychain.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..a26e7cd --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,92 @@ + + + + + SchemeUserState + + AFNetworking.xcscheme + + isShown + + + CHTCollectionViewWaterfallLayout.xcscheme + + isShown + + + KRLCollectionViewGridLayout.xcscheme + + isShown + + + MBProgressHUD.xcscheme + + isShown + + + Pods-Ryff.xcscheme + + isShown + + + Pods-RyffTests.xcscheme + + isShown + + + SDWebImage.xcscheme + + isShown + + + SSKeychain.xcscheme + + isShown + + + + SuppressBuildableAutocreation + + 12D9723DA6FC9334CE1435F1F069EE49 + + primary + + + 4EB6DFE12524FD2DA752B684CE4CF6F0 + + primary + + + 8933734DEB8C707799F8C16D5EF95254 + + primary + + + 9666688CB41B38A9914616144C9C7A3E + + primary + + + AF7B2FC32BB12986BA0BF6C4CB51BFEE + + primary + + + C2814CF121DAF0BC8208C621CC869657 + + primary + + + D7B8FEA8CF7F5F6473FA000DAA7C17FD + + primary + + + E2C7547D2DD7E86D2C40276BA99E896B + + primary + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/AFNetworking.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/AFNetworking.xcscheme new file mode 100644 index 0000000..77a6819 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/AFNetworking.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme new file mode 100644 index 0000000..5c88f00 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/CHTCollectionViewWaterfallLayout.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme new file mode 100644 index 0000000..f1e5a0f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/KRLCollectionViewGridLayout.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/MBProgressHUD.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/MBProgressHUD.xcscheme new file mode 100644 index 0000000..5b9c55f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/MBProgressHUD.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-Ryff.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-Ryff.xcscheme new file mode 100644 index 0000000..1018dbc --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-Ryff.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme new file mode 100644 index 0000000..a565250 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/Pods-RyffTests.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SDWebImage.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SDWebImage.xcscheme new file mode 100644 index 0000000..a46e427 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SSKeychain.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SSKeychain.xcscheme new file mode 100644 index 0000000..c6574cb --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/SSKeychain.xcscheme @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..cac49f1 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,122 @@ + + + + + SchemeUserState + + AFNetworking.xcscheme + + isShown + + + CHTCollectionViewWaterfallLayout.xcscheme + + isShown + + + KRLCollectionViewGridLayout.xcscheme + + isShown + + + MBProgressHUD.xcscheme + + isShown + + + Pods-Ryff.xcscheme + + isShown + + + Pods-RyffTests.xcscheme + + isShown + + + SDWebImage.xcscheme + + isShown + + + SSKeychain.xcscheme + + isShown + + + + SuppressBuildableAutocreation + + 0469E15C6493CFE6935DCCA1F2325FCB + + primary + + + 4EB6DFE12524FD2DA752B684CE4CF6F0 + + primary + + + 66BBA2D942F6FD3569C2323193E93180 + + primary + + + 8933734DEB8C707799F8C16D5EF95254 + + primary + + + 8AEF711DC5BCBE34B3DA76FF0207400F + + primary + + + 904C0B1D5EACD9C8D647BD9065D54C5A + + primary + + + 9666688CB41B38A9914616144C9C7A3E + + primary + + + 9CA5BF43AF512D2C8F188EDFA4A0F235 + + primary + + + 9F193AA30E724653AED855623AC2C856 + + primary + + + B9F3B163B68288C65279212D5B4942C1 + + primary + + + C2814CF121DAF0BC8208C621CC869657 + + primary + + + C77B105113B1931525CFE52A471EE588 + + primary + + + D965002AFE638A0C0883DEDC7EF45280 + + primary + + + F0004311CCAB6F5249FC0BF262BE5F27 + + primary + + + + + diff --git a/Pods/SDWebImage/LICENSE b/Pods/SDWebImage/LICENSE new file mode 100644 index 0000000..ae783e1 --- /dev/null +++ b/Pods/SDWebImage/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/Pods/SDWebImage/README.md b/Pods/SDWebImage/README.md new file mode 100644 index 0000000..bc47123 --- /dev/null +++ b/Pods/SDWebImage/README.md @@ -0,0 +1,315 @@ +Web Image +========= +[![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) +[![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) +[![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) +[![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) +[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/3.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/3.3) +[![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) + +This library provides a category for UIImageView with support for remote images coming from the web. + +It provides: + +- An UIImageView category adding web image and cache management to the Cocoa Touch framework +- An asynchronous image downloader +- An asynchronous memory + disk image caching with automatic cache expiration handling +- Animated GIF support +- WebP format support +- A background image decompression +- A guarantee that the same URL won't be downloaded several times +- A guarantee that bogus URLs won't be retried again and again +- A guarantee that main thread will never be blocked +- Performances! +- Use GCD and ARC +- Arm64 support + +NOTE: The version 3.0 of SDWebImage isn't fully backward compatible with 2.0 and requires iOS 5.1.1 +minimum deployement version. If you need iOS < 5.0 support, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). + +[How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) + +Who Use It +---------- + +Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. + +How To Use +---------- + +API documentation is available at [CocoaDocs - SDWebImage](http://cocoadocs.org/docsets/SDWebImage/) + +### Using UIImageView+WebCache category with UITableView + +Just #import the UIImageView+WebCache.h header, and call the sd_setImageWithURL:placeholderImage: +method from the tableView:cellForRowAtIndexPath: UITableViewDataSource method. Everything will be +handled for you, from async downloads to caching management. + +```objective-c +#import + +... + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *MyIdentifier = @"MyIdentifier"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; + + if (cell == nil) + { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:MyIdentifier] autorelease]; + } + + // Here we use the new provided sd_setImageWithURL: method to load the web image + [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; + + cell.textLabel.text = @"My Text"; + return cell; +} +``` + +### Using blocks + +With blocks, you can be notified about the image download progress and whenever the image retrival +has completed with success or not: + +```objective-c +// Here we use the new provided sd_setImageWithURL: method to load the web image +[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"] + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {... completion code here ...}]; +``` + +Note: neither your success nor failure block will be call if your image request is canceled before completion. + +### Using SDWebImageManager + +The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the +asynchronous downloader with the image cache store. You can use this class directly to benefit +from web image downloading with caching in another context than a UIView (ie: with Cocoa). + +Here is a simple example of how to use SDWebImageManager: + +```objective-c +SDWebImageManager *manager = [SDWebImageManager sharedManager]; +[manager downloadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + // progression tracking code + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Downloader Independently + +It's also possible to use the async image downloader independently: + +```objective-c +[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) + { + // progression tracking code + } + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) + { + if (image && finished) + { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Caching Independently + +It is also possible to use the async based image cache store independently. SDImageCache +maintains a memory cache and an optional disk cache. Disk cache write operations are performed +asynchronous so it doesn't add unnecessary latency to the UI. + +The SDImageCache class provides a singleton instance for convenience but you can create your own +instance if you want to create separated cache namespace. + +To lookup the cache, you use the `queryDiskCacheForKey:done:` method. If the method returns nil, it means the cache +doesn't currently own the image. You are thus responsible for generating and caching it. The cache +key is an application unique identifier for the image to cache. It is generally the absolute URL of +the image. + +```objective-c +SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; +[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) +{ + // image is not nil if image was found +}]; +``` + +By default SDImageCache will lookup the disk cache if an image can't be found in the memory cache. +You can prevent this from happening by calling the alternative method `imageFromMemoryCacheForKey:`. + +To store an image into the cache, you use the storeImage:forKey: method: + +```objective-c +[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; +``` + +By default, the image will be stored in memory cache as well as on disk cache (asynchronously). If +you want only the memory cache, use the alternative method storeImage:forKey:toDisk: with a negative +third argument. + +### Using cache key filter + +Sometime, you may not want to use the image URL as cache key because part of the URL is dynamic +(i.e.: for access control purpose). SDWebImageManager provides a way to set a cache key filter that +takes the NSURL as input, and output a cache key NSString. + +The following example sets a filter in the application delegate that will remove any query-string from +the URL before to use it as a cache key: + +```objective-c +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { + url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; + return [url absoluteString]; + }; + + // Your app init code... + return YES; +} +``` + + +Common Problems +--------------- + +### Using dynamic image size with UITableViewCell + +UITableView determines the size of the image by the first image set for a cell. If your remote images +don't have the same size as your placeholder image, you may experience strange anamorphic scaling issue. +The following article gives a way to workaround this issue: + +[http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/](http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/) + + +### Handle image refresh + +SDWebImage does very aggressive caching by default. It ignores all kind of caching control header returned by the HTTP server and cache the returned images with no time restriction. It implies your images URLs are static URLs pointing to images that never change. If the pointed image happen to change, some parts of the URL should change accordingly. + +If you don't control the image server you're using, you may not be able to change the URL when its content is updated. This is the case for Facebook avatar URLs for instance. In such case, you may use the `SDWebImageRefreshCached` flag. This will slightly degrade the performance but will respect the HTTP caching control headers: + +``` objective-c +[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] + placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] + options:SDWebImageRefreshCached]; +``` + +### Add a progress indicator + +See this category: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage + +Installation +------------ + +There are three ways to use SDWebImage in your project: +- using Cocoapods +- copying all the files into your project +- importing the project as a static library + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org/) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries in your projects. See the [Get Started](http://cocoapods.org/#get_started) section for more details. + +#### Podfile +``` +platform :ios, '6.1' +pod 'SDWebImage', '~>3.7' +``` + +### Installation with Carthage (iOS 8+) + +[Carthage](https://github.com/Carthage/Carthage) is a lightweight dependency manager for Swift and Objective-C. It leverages CocoaTouch modules and ins less invasive than CocoaPods. + +To install with carthage, follow the instruction on [Carthage](https://github.com/Carthage/Carthage) + +#### Cartfile +``` +github "rs/SDWebImage" +``` + +#### Usage +Swift + +``` +import WebImage + +``` + +Objective-C + +``` +@import WebImage; +``` + +### Installation by cloning the repository + +In order to gain access to all the files from the repository, you should clone it. +``` +git clone --recursive https://github.com/rs/SDWebImage.git +``` + +### Add the SDWebImage project to your project + +- Download and unzip the last version of the framework from the [download page](https://github.com/rs/SDWebImage/releases) +- Right-click on the project navigator and select "Add Files to "Your Project": +- In the dialog, select SDWebImage.framework: +- Check the "Copy items into destination group's folder (if needed)" checkbox + +### Add dependencies + +- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: +- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: + +### Add Linker Flag + +Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: + +![Other Linker Flags](http://dl.dropbox.com/u/123346/SDWebImage/10_other_linker_flags.jpg) + +Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use: +``` +-force_load SDWebImage.framework/Versions/Current/SDWebImage +``` + +If you're using Cocoa Pods and have any frameworks that extend optional libraries, such as Parsen RestKit or opencv2, instead of the -ObjC flag use: +``` +-force_load $(TARGET_BUILD_DIR)/libPods.a +``` + +### Import headers in your source files + +In the source files where you need to use the library, import the header file: + +```objective-c +#import +``` + +### Build Project + +At this point your workspace should build without error. If you are having problem, post to the Issue and the +community can help you solve it. + +Future Enhancements +------------------- + +- LRU memory cache cleanup instead of reset on memory warning + +## Licenses + +All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). diff --git a/Ryff/Frameworks/SDWebImage/NSData+ImageContentType.h b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/NSData+ImageContentType.h rename to Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h diff --git a/Ryff/Frameworks/SDWebImage/NSData+ImageContentType.m b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/NSData+ImageContentType.m rename to Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m diff --git a/Ryff/Frameworks/SDWebImage/SDImageCache.h b/Pods/SDWebImage/SDWebImage/SDImageCache.h old mode 100755 new mode 100644 similarity index 88% rename from Ryff/Frameworks/SDWebImage/SDImageCache.h rename to Pods/SDWebImage/SDWebImage/SDImageCache.h index 62894a1..8e08aa1 --- a/Ryff/Frameworks/SDWebImage/SDImageCache.h +++ b/Pods/SDWebImage/SDWebImage/SDImageCache.h @@ -36,11 +36,22 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ @interface SDImageCache : NSObject +/** + * Decompressing images that are downloaded and cached can improve peformance but can consume lot of memory. + * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. + */ +@property (assign, nonatomic) BOOL shouldDecompressImages; + /** * The maximum "total cost" of the in-memory image cache. The cost function is the number of pixels held in memory. */ @property (assign, nonatomic) NSUInteger maxMemoryCost; +/** + * The maximum number of objects the cache should hold. + */ +@property (assign, nonatomic) NSUInteger maxMemoryCountLimit; + /** * The maximum length of time to keep an image in the cache, in seconds */ @@ -65,6 +76,16 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ - (id)initWithNamespace:(NSString *)ns; +/** + * Init a new cache store with a specific namespace and directory + * + * @param ns The namespace to use for this cache store + * @param directory Directory to cache disk images in + */ +- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory; + +-(NSString *)makeDiskCachePath:(NSString*)fullNamespace; + /** * Add a read-only cache path to search for images pre-cached by SDImageCache * Useful if you want to bundle pre-loaded images with your app @@ -133,7 +154,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** - * Remove the image from memory and disk cache synchronously + * Remove the image from memory and disk cache asynchronously * * @param key The unique image cache key * @param completion An block that should be executed after the image has been removed (optional) @@ -141,7 +162,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion; /** - * Remove the image from memory and optionally disk cache synchronously + * Remove the image from memory and optionally disk cache asynchronously * * @param key The unique image cache key * @param fromDisk Also remove cache entry from disk if YES @@ -149,7 +170,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk; /** - * Remove the image from memory and optionally disk cache synchronously + * Remove the image from memory and optionally disk cache asynchronously * * @param key The unique image cache key * @param fromDisk Also remove cache entry from disk if YES diff --git a/Ryff/Frameworks/SDWebImage/SDImageCache.m b/Pods/SDWebImage/SDWebImage/SDImageCache.m old mode 100755 new mode 100644 similarity index 85% rename from Ryff/Frameworks/SDWebImage/SDImageCache.m rename to Pods/SDWebImage/SDWebImage/SDImageCache.m index 59c3471..2202602 --- a/Ryff/Frameworks/SDWebImage/SDImageCache.m +++ b/Pods/SDWebImage/SDWebImage/SDImageCache.m @@ -11,6 +11,29 @@ #import "UIImage+MultiFormat.h" #import +// See https://github.com/rs/SDWebImage/pull/1141 for discussion +@interface AutoPurgeCache : NSCache +@end + +@implementation AutoPurgeCache + +- (id)init +{ + self = [super init]; + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; + +} + +@end + static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week // PNG signature bytes and data (below) static unsigned char kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; @@ -29,6 +52,10 @@ BOOL ImageDataHasPNGPreffix(NSData *data) { return NO; } +FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { + return image.size.height * image.size.width * image.scale * image.scale; +} + @interface SDImageCache () @property (strong, nonatomic) NSCache *memCache; @@ -48,7 +75,6 @@ + (SDImageCache *)sharedImageCache { static id instance; dispatch_once(&once, ^{ instance = [self new]; - kPNGSignatureData = [NSData dataWithBytes:kPNGSignatureBytes length:8]; }); return instance; } @@ -58,9 +84,17 @@ - (id)init { } - (id)initWithNamespace:(NSString *)ns { + NSString *path = [self makeDiskCachePath:ns]; + return [self initWithNamespace:ns diskCacheDirectory:path]; +} + +- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { if ((self = [super init])) { NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; + // initialise PNG signature data + kPNGSignatureData = [NSData dataWithBytes:kPNGSignatureBytes length:8]; + // Create IO serial queue _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); @@ -68,12 +102,19 @@ - (id)initWithNamespace:(NSString *)ns { _maxCacheAge = kDefaultCacheMaxCacheAge; // Init the memory cache - _memCache = [[NSCache alloc] init]; + _memCache = [[AutoPurgeCache alloc] init]; _memCache.name = fullNamespace; // Init the disk cache - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace]; + if (directory != nil) { + _diskCachePath = [directory stringByAppendingPathComponent:fullNamespace]; + } else { + NSString *path = [self makeDiskCachePath:ns]; + _diskCachePath = path; + } + + // Set decompression to YES + _shouldDecompressImages = YES; dispatch_sync(_ioQueue, ^{ _fileManager = [NSFileManager new]; @@ -142,12 +183,19 @@ - (NSString *)cachedFileNameForKey:(NSString *)key { #pragma mark ImageCache +// Init the disk cache +-(NSString *)makeDiskCachePath:(NSString*)fullNamespace{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + return [paths[0] stringByAppendingPathComponent:fullNamespace]; +} + - (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk { if (!image || !key) { return; } - [self.memCache setObject:image forKey:key cost:image.size.height * image.size.width * image.scale]; + NSUInteger cost = SDCacheCostForImage(image); + [self.memCache setObject:image forKey:key cost:cost]; if (toDisk) { dispatch_async(self.ioQueue, ^{ @@ -160,9 +208,13 @@ - (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate image // The first eight bytes of a PNG file always contain the following (decimal) values: // 137 80 78 71 13 10 26 10 - // We assume the image is PNG, in case the imageData is nil (i.e. if trying to save a UIImage directly), - // we will consider it PNG to avoid loosing the transparency - BOOL imageIsPng = YES; + // If the imageData is nil (i.e. if trying to save a UIImage directly or the image was transformed on download) + // and the image has an alpha channel, we will consider it PNG to avoid losing the transparency + int alphaInfo = CGImageGetAlphaInfo(image.CGImage); + BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || + alphaInfo == kCGImageAlphaNoneSkipFirst || + alphaInfo == kCGImageAlphaNoneSkipLast); + BOOL imageIsPng = hasAlpha; // But if we have an image data, we will look at the preffix if ([imageData length] >= [kPNGSignatureData length]) { @@ -234,7 +286,7 @@ - (UIImage *)imageFromDiskCacheForKey:(NSString *)key { // Second check the disk cache... UIImage *diskImage = [self diskImageForKey:key]; if (diskImage) { - CGFloat cost = diskImage.size.height * diskImage.size.width * diskImage.scale; + NSUInteger cost = SDCacheCostForImage(diskImage); [self.memCache setObject:diskImage forKey:key cost:cost]; } @@ -248,7 +300,8 @@ - (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { return data; } - for (NSString *path in self.customPaths) { + NSArray *customPaths = [self.customPaths copy]; + for (NSString *path in customPaths) { NSString *filePath = [self cachePathForKey:key inPath:path]; NSData *imageData = [NSData dataWithContentsOfFile:filePath]; if (imageData) { @@ -264,7 +317,9 @@ - (UIImage *)diskImageForKey:(NSString *)key { if (data) { UIImage *image = [UIImage sd_imageWithData:data]; image = [self scaledImageForKey:key image:image]; - image = [UIImage decodedImageWithImage:image]; + if (self.shouldDecompressImages) { + image = [UIImage decodedImageWithImage:image]; + } return image; } else { @@ -302,7 +357,7 @@ - (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompl @autoreleasepool { UIImage *diskImage = [self diskImageForKey:key]; if (diskImage) { - CGFloat cost = diskImage.size.height * diskImage.size.width * diskImage.scale; + NSUInteger cost = SDCacheCostForImage(diskImage); [self.memCache setObject:diskImage forKey:key cost:cost]; } @@ -359,6 +414,14 @@ - (NSUInteger)maxMemoryCost { return self.memCache.totalCostLimit; } +- (NSUInteger)maxMemoryCountLimit { + return self.memCache.countLimit; +} + +- (void)setMaxMemoryCountLimit:(NSUInteger)maxCountLimit { + self.memCache.countLimit = maxCountLimit; +} + - (void)clearMemory { [self.memCache removeAllObjects]; } @@ -467,7 +530,11 @@ - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { } - (void)backgroundCleanDisk { - UIApplication *application = [UIApplication sharedApplication]; + Class UIApplicationClass = NSClassFromString(@"UIApplication"); + if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { + return; + } + UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ // Clean up any unfinished task business by marking where you // stopped or ending the task outright. diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageCompat.h b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h old mode 100755 new mode 100644 similarity index 92% rename from Ryff/Frameworks/SDWebImage/SDWebImageCompat.h rename to Pods/SDWebImage/SDWebImage/SDWebImageCompat.h index a0555fd..9773545 --- a/Ryff/Frameworks/SDWebImage/SDWebImageCompat.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h @@ -13,7 +13,7 @@ #error SDWebImage does not support Objective-C Garbage Collection #endif -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 +#if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 #error SDWebImage doesn't support Deployement Target version < 5.0 #endif @@ -55,6 +55,8 @@ extern UIImage *SDScaledImageForKey(NSString *key, UIImage *image); typedef void(^SDWebImageNoParamsBlock)(); +extern NSString *const SDWebImageErrorDomain; + #define dispatch_main_sync_safe(block)\ if ([NSThread isMainThread]) {\ block();\ diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageCompat.m b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m old mode 100755 new mode 100644 similarity index 80% rename from Ryff/Frameworks/SDWebImage/SDWebImageCompat.m rename to Pods/SDWebImage/SDWebImage/SDWebImageCompat.m index 8c7d345..54fb60e --- a/Ryff/Frameworks/SDWebImage/SDWebImageCompat.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m @@ -30,11 +30,15 @@ if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { CGFloat scale = 1.0; if (key.length >= 8) { - // Search @2x. at the end of the string, before a 3 to 4 extension length (only if key len is 8 or more @2x. + 4 len ext) - NSRange range = [key rangeOfString:@"@2x." options:0 range:NSMakeRange(key.length - 8, 5)]; + NSRange range = [key rangeOfString:@"@2x."]; if (range.location != NSNotFound) { scale = 2.0; } + + range = [key rangeOfString:@"@3x."]; + if (range.location != NSNotFound) { + scale = 3.0; + } } UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; @@ -43,3 +47,5 @@ return image; } } + +NSString *const SDWebImageErrorDomain = @"SDWebImageErrorDomain"; diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDecoder.h b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/SDWebImageDecoder.h rename to Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDecoder.m b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/SDWebImageDecoder.m rename to Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDownloader.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h old mode 100755 new mode 100644 similarity index 89% rename from Ryff/Frameworks/SDWebImage/SDWebImageDownloader.h rename to Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h index 008231a..b8db86f --- a/Ryff/Frameworks/SDWebImage/SDWebImageDownloader.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h @@ -49,8 +49,6 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { * Put the image in the high priority queue. */ SDWebImageDownloaderHighPriority = 1 << 7, - - }; typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { @@ -79,12 +77,17 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi */ @interface SDWebImageDownloader : NSObject +/** + * Decompressing images that are downloaded and cached can improve peformance but can consume lot of memory. + * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. + */ +@property (assign, nonatomic) BOOL shouldDecompressImages; + @property (assign, nonatomic) NSInteger maxConcurrentDownloads; /** * Shows the current amount of downloads that still need to be downloaded */ - @property (readonly, nonatomic) NSUInteger currentDownloadCount; @@ -139,6 +142,16 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi */ - (NSString *)valueForHTTPHeaderField:(NSString *)field; +/** + * Sets a subclass of `SDWebImageDownloaderOperation` as the default + * `NSOperation` to be used each time SDWebImage constructs a request + * operation to download an image. + * + * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set + * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. + */ +- (void)setOperationClass:(Class)operationClass; + /** * Creates a SDWebImageDownloader async downloader instance with a given URL * diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDownloader.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m old mode 100755 new mode 100644 similarity index 70% rename from Ryff/Frameworks/SDWebImage/SDWebImageDownloader.m rename to Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m index 60914db..acda892 --- a/Ryff/Frameworks/SDWebImage/SDWebImageDownloader.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m @@ -10,9 +10,6 @@ #import "SDWebImageDownloaderOperation.h" #import -NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; -NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; - static NSString *const kProgressCallbackKey = @"progress"; static NSString *const kCompletedCallbackKey = @"completed"; @@ -20,6 +17,7 @@ @interface SDWebImageDownloader () @property (strong, nonatomic) NSOperationQueue *downloadQueue; @property (weak, nonatomic) NSOperation *lastAddedOperation; +@property (assign, nonatomic) Class operationClass; @property (strong, nonatomic) NSMutableDictionary *URLCallbacks; @property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue @@ -63,11 +61,17 @@ + (SDWebImageDownloader *)sharedDownloader { - (id)init { if ((self = [super init])) { + _operationClass = [SDWebImageDownloaderOperation class]; + _shouldDecompressImages = YES; _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; _downloadQueue = [NSOperationQueue new]; - _downloadQueue.maxConcurrentOperationCount = 2; + _downloadQueue.maxConcurrentOperationCount = 6; _URLCallbacks = [NSMutableDictionary new]; - _HTTPHeaders = [NSMutableDictionary dictionaryWithObject:@"image/webp,image/*;q=0.8" forKey:@"Accept"]; +#ifdef SD_WEBP + _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; +#else + _HTTPHeaders = [@{@"Accept": @"image/*;q=0.8"} mutableCopy]; +#endif _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); _downloadTimeout = 15.0; } @@ -104,9 +108,13 @@ - (NSInteger)maxConcurrentDownloads { return _downloadQueue.maxConcurrentOperationCount; } +- (void)setOperationClass:(Class)operationClass { + _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; +} + - (id )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { __block SDWebImageDownloaderOperation *operation; - __weak SDWebImageDownloader *wself = self; + __weak __typeof(self)wself = self; [self addProgressCallback:progressBlock andCompletedBlock:completedBlock forURL:url createCallback:^{ NSTimeInterval timeoutInterval = wself.downloadTimeout; @@ -124,34 +132,43 @@ - (NSInteger)maxConcurrentDownloads { else { request.allHTTPHeaderFields = wself.HTTPHeaders; } - operation = [[SDWebImageDownloaderOperation alloc] initWithRequest:request - options:options - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - NSArray *callbacksForURL = [sself callbacksForURL:url]; - for (NSDictionary *callbacks in callbacksForURL) { - SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; - if (callback) callback(receivedSize, expectedSize); - } - } - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - NSArray *callbacksForURL = [sself callbacksForURL:url]; - if (finished) { - [sself removeCallbacksForURL:url]; - } - for (NSDictionary *callbacks in callbacksForURL) { - SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; - if (callback) callback(image, data, error, finished); - } - } - cancelled:^{ - SDWebImageDownloader *sself = wself; - if (!sself) return; - [sself removeCallbacksForURL:url]; - }]; + operation = [[wself.operationClass alloc] initWithRequest:request + options:options + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + SDWebImageDownloader *sself = wself; + if (!sself) return; + __block NSArray *callbacksForURL; + dispatch_sync(sself.barrierQueue, ^{ + callbacksForURL = [sself.URLCallbacks[url] copy]; + }); + for (NSDictionary *callbacks in callbacksForURL) { + SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; + if (callback) callback(receivedSize, expectedSize); + } + } + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + SDWebImageDownloader *sself = wself; + if (!sself) return; + __block NSArray *callbacksForURL; + dispatch_barrier_sync(sself.barrierQueue, ^{ + callbacksForURL = [sself.URLCallbacks[url] copy]; + if (finished) { + [sself.URLCallbacks removeObjectForKey:url]; + } + }); + for (NSDictionary *callbacks in callbacksForURL) { + SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; + if (callback) callback(image, data, error, finished); + } + } + cancelled:^{ + SDWebImageDownloader *sself = wself; + if (!sself) return; + dispatch_barrier_async(sself.barrierQueue, ^{ + [sself.URLCallbacks removeObjectForKey:url]; + }); + }]; + operation.shouldDecompressImages = wself.shouldDecompressImages; if (wself.username && wself.password) { operation.credential = [NSURLCredential credentialWithUser:wself.username password:wself.password persistence:NSURLCredentialPersistenceForSession]; @@ -204,20 +221,6 @@ - (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock and }); } -- (NSArray *)callbacksForURL:(NSURL *)url { - __block NSArray *callbacksForURL; - dispatch_sync(self.barrierQueue, ^{ - callbacksForURL = self.URLCallbacks[url]; - }); - return [callbacksForURL copy]; -} - -- (void)removeCallbacksForURL:(NSURL *)url { - dispatch_barrier_async(self.barrierQueue, ^{ - [self.URLCallbacks removeObjectForKey:url]; - }); -} - - (void)setSuspended:(BOOL)suspended { [self.downloadQueue setSuspended:suspended]; } diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h old mode 100755 new mode 100644 similarity index 81% rename from Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.h rename to Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h index 21a3106..dd48b22 --- a/Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h @@ -10,6 +10,11 @@ #import "SDWebImageDownloader.h" #import "SDWebImageOperation.h" +extern NSString *const SDWebImageDownloadStartNotification; +extern NSString *const SDWebImageDownloadReceiveResponseNotification; +extern NSString *const SDWebImageDownloadStopNotification; +extern NSString *const SDWebImageDownloadFinishNotification; + @interface SDWebImageDownloaderOperation : NSOperation /** @@ -17,6 +22,9 @@ */ @property (strong, nonatomic, readonly) NSURLRequest *request; + +@property (assign, nonatomic) BOOL shouldDecompressImages; + /** * Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. * @@ -36,6 +44,16 @@ */ @property (assign, nonatomic, readonly) SDWebImageDownloaderOptions options; +/** + * The expected size of data. + */ +@property (assign, nonatomic) NSInteger expectedSize; + +/** + * The response returned by the operation's connection. + */ +@property (strong, nonatomic) NSURLResponse *response; + /** * Initializes a `SDWebImageDownloaderOperation` object * diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m old mode 100755 new mode 100644 similarity index 75% rename from Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.m rename to Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m index 333e316..5a8bd11 --- a/Ryff/Frameworks/SDWebImage/SDWebImageDownloaderOperation.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m @@ -12,6 +12,11 @@ #import #import "SDWebImageManager.h" +NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; +NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; +NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; +NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinishNotification"; + @interface SDWebImageDownloaderOperation () @property (copy, nonatomic) SDWebImageDownloaderProgressBlock progressBlock; @@ -20,7 +25,6 @@ @interface SDWebImageDownloaderOperation () @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; -@property (assign, nonatomic) NSInteger expectedSize; @property (strong, nonatomic) NSMutableData *imageData; @property (strong, nonatomic) NSURLConnection *connection; @property (strong, atomic) NSThread *thread; @@ -47,6 +51,7 @@ - (id)initWithRequest:(NSURLRequest *)request cancelled:(SDWebImageNoParamsBlock)cancelBlock { if ((self = [super init])) { _request = request; + _shouldDecompressImages = YES; _shouldUseCredentialStorage = YES; _options = options; _progressBlock = [progressBlock copy]; @@ -69,15 +74,18 @@ - (void)start { } #if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 - if ([self shouldContinueWhenAppEntersBackground]) { + Class UIApplicationClass = NSClassFromString(@"UIApplication"); + BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; + if (hasApplication && [self shouldContinueWhenAppEntersBackground]) { __weak __typeof__ (self) wself = self; - self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)]; + self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{ __strong __typeof (wself) sself = wself; if (sself) { [sself cancel]; - [[UIApplication sharedApplication] endBackgroundTask:sself.backgroundTaskId]; + [app endBackgroundTask:sself.backgroundTaskId]; sself.backgroundTaskId = UIBackgroundTaskInvalid; } }]; @@ -95,7 +103,9 @@ - (void)start { if (self.progressBlock) { self.progressBlock(0, NSURLResponseUnknownLength); } - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; + }); if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_5_1) { // Make sure to run the runloop in our background thread so it can process downloaded data @@ -119,8 +129,13 @@ - (void)start { } #if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 + Class UIApplicationClass = NSClassFromString(@"UIApplication"); + if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { + return; + } if (self.backgroundTaskId != UIBackgroundTaskInvalid) { - [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId]; + UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)]; + [app endBackgroundTask:self.backgroundTaskId]; self.backgroundTaskId = UIBackgroundTaskInvalid; } #endif @@ -150,7 +165,9 @@ - (void)cancelInternal { if (self.connection) { [self.connection cancel]; - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + }); // As we cancelled the connection, its callback won't be called and thus won't // maintain the isFinished and isExecuting flags. @@ -195,7 +212,9 @@ - (BOOL)isConcurrent { #pragma mark NSURLConnection (delegate) - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - if (![response respondsToSelector:@selector(statusCode)] || [((NSHTTPURLResponse *)response) statusCode] < 400) { + + //'304 Not Modified' is an exceptional one + if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; if (self.progressBlock) { @@ -203,11 +222,24 @@ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRespon } self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; + self.response = response; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:self]; + }); } else { - [self.connection cancel]; - - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + NSUInteger code = [((NSHTTPURLResponse *)response) statusCode]; + + //This is the case when server returns '304 Not Modified'. It means that remote image is not changed. + //In case of 304 we need just cancel the operation and return cached image from the cache. + if (code == 304) { + [self cancelInternal]; + } else { + [self.connection cancel]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + }); if (self.completedBlock) { self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); @@ -228,8 +260,7 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { const NSInteger totalSize = self.imageData.length; // Update the data source, we must pass ALL the data, not just the new bytes - CGImageSourceRef imageSource = CGImageSourceCreateIncremental(NULL); - CGImageSourceUpdateData(imageSource, (__bridge CFDataRef)self.imageData, totalSize == self.expectedSize); + CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)self.imageData, NULL); if (width + height == 0) { CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); @@ -280,7 +311,12 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { UIImage *image = [UIImage imageWithCGImage:partialImageRef scale:1 orientation:orientation]; NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; UIImage *scaledImage = [self scaledImageForKey:key image:image]; - image = [UIImage decodedImageWithImage:scaledImage]; + if (self.shouldDecompressImages) { + image = [UIImage decodedImageWithImage:scaledImage]; + } + else { + image = scaledImage; + } CGImageRelease(partialImageRef); dispatch_main_sync_safe(^{ if (self.completedBlock) { @@ -331,33 +367,38 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { CFRunLoopStop(CFRunLoopGetCurrent()); self.thread = nil; self.connection = nil; - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:self]; + }); } if (![[NSURLCache sharedURLCache] cachedResponseForRequest:_request]) { responseFromCached = NO; } - if (completionBlock) - { + if (completionBlock) { if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached) { completionBlock(nil, nil, nil, YES); - } - else { + } else if (self.imageData) { UIImage *image = [UIImage sd_imageWithData:self.imageData]; NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; image = [self scaledImageForKey:key image:image]; // Do not force decoding animated GIFs if (!image.images) { - image = [UIImage decodedImageWithImage:image]; + if (self.shouldDecompressImages) { + image = [UIImage decodedImageWithImage:image]; + } } if (CGSizeEqualToSize(image.size, CGSizeZero)) { - completionBlock(nil, nil, [NSError errorWithDomain:@"SDWebImageErrorDomain" code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); + completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); } else { completionBlock(image, self.imageData, nil, YES); } + } else { + completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); } } self.completionBlock = nil; @@ -365,13 +406,19 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - CFRunLoopStop(CFRunLoopGetCurrent()); - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + @synchronized(self) { + CFRunLoopStop(CFRunLoopGetCurrent()); + self.thread = nil; + self.connection = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + }); + } if (self.completedBlock) { self.completedBlock(nil, nil, error, YES); } - + self.completionBlock = nil; [self done]; } @@ -396,8 +443,13 @@ - (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connect - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{ if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { - NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; - [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates) && + [challenge.sender respondsToSelector:@selector(performDefaultHandlingForAuthenticationChallenge:)]) { + [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; + } else { + NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } } else { if ([challenge previousFailureCount] == 0) { if (self.credential) { diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageManager.h b/Pods/SDWebImage/SDWebImage/SDWebImageManager.h old mode 100755 new mode 100644 similarity index 92% rename from Ryff/Frameworks/SDWebImage/SDWebImageManager.h rename to Pods/SDWebImage/SDWebImage/SDWebImageManager.h index cae25d3..7f80e24 --- a/Ryff/Frameworks/SDWebImage/SDWebImageManager.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageManager.h @@ -82,6 +82,13 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { * Use this flag to transform them anyway. */ SDWebImageTransformAnimatedImage = 1 << 10, + + /** + * By default, image is added to the imageView after download. But in some cases, we want to + * have the hand before setting the image (apply a filter or add it with cross-fade animation for instance) + * Use this flag if you want to manually set the image in the completion when success + */ + SDWebImageAvoidAutoSetImage = 1 << 11 }; typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); @@ -132,14 +139,14 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * @code SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager downloadWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; +[manager downloadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; * @endcode */ @@ -166,7 +173,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * @endcode */ -@property (copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; +@property (nonatomic, copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; /** * Returns global SDWebImageManager instance. diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageManager.m b/Pods/SDWebImage/SDWebImage/SDWebImageManager.m old mode 100755 new mode 100644 similarity index 93% rename from Ryff/Frameworks/SDWebImage/SDWebImageManager.m rename to Pods/SDWebImage/SDWebImage/SDWebImageManager.m index 89718cb..3980ced --- a/Ryff/Frameworks/SDWebImage/SDWebImageManager.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageManager.m @@ -21,7 +21,7 @@ @interface SDWebImageManager () @property (strong, nonatomic, readwrite) SDImageCache *imageCache; @property (strong, nonatomic, readwrite) SDWebImageDownloader *imageDownloader; -@property (strong, nonatomic) NSMutableArray *failedURLs; +@property (strong, nonatomic) NSMutableSet *failedURLs; @property (strong, nonatomic) NSMutableArray *runningOperations; @end @@ -41,7 +41,7 @@ - (id)init { if ((self = [super init])) { _imageCache = [self createCache]; _imageDownloader = [SDWebImageDownloader sharedDownloader]; - _failedURLs = [NSMutableArray new]; + _failedURLs = [NSMutableSet new]; _runningOperations = [NSMutableArray new]; } return self; @@ -192,13 +192,21 @@ - (void)diskImageExistsForURL:(NSURL *)url } }); - if (error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled && error.code != NSURLErrorTimedOut) { + BOOL shouldBeFailedURLAlliOSVersion = (error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled && error.code != NSURLErrorTimedOut); + BOOL shouldBeFailedURLiOS7 = (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1 && error.code != NSURLErrorInternationalRoamingOff && error.code != NSURLErrorCallIsActive && error.code != NSURLErrorDataNotAllowed); + if (shouldBeFailedURLAlliOSVersion || shouldBeFailedURLiOS7) { @synchronized (self.failedURLs) { [self.failedURLs addObject:url]; } } } else { + if ((options & SDWebImageRetryFailed)) { + @synchronized (self.failedURLs) { + [self.failedURLs removeObject:url]; + } + } + BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); if (options & SDWebImageRefreshCached && image && !downloadedImage) { @@ -210,7 +218,7 @@ - (void)diskImageExistsForURL:(NSURL *)url if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:data forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : data) forKey:key toDisk:cacheOnDisk]; } dispatch_main_sync_safe(^{ diff --git a/Ryff/Frameworks/SDWebImage/SDWebImageOperation.h b/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/SDWebImageOperation.h rename to Pods/SDWebImage/SDWebImage/SDWebImageOperation.h diff --git a/Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.h b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h old mode 100755 new mode 100644 similarity index 96% rename from Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.h rename to Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h index 4f14fa2..7bb67ac --- a/Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h @@ -58,6 +58,11 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, */ @property (nonatomic, assign) SDWebImageOptions options; +/** + * Queue options for Prefetcher. Defaults to Main Queue. + */ +@property (nonatomic, assign) dispatch_queue_t prefetcherQueue; + @property (weak, nonatomic) id delegate; /** diff --git a/Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.m b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m old mode 100755 new mode 100644 similarity index 87% rename from Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.m rename to Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m index 4087e4a..8756bd0 --- a/Ryff/Frameworks/SDWebImage/SDWebImagePrefetcher.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m @@ -8,7 +8,7 @@ #import "SDWebImagePrefetcher.h" -#if !defined(DEBUG) && !defined (SD_VERBOSE) +#if (!defined(DEBUG) && !defined (SD_VERBOSE)) || defined(SD_LOG_NONE) #define NSLog(...) #endif @@ -40,6 +40,7 @@ - (id)init { if ((self = [super init])) { _manager = [SDWebImageManager new]; _options = SDWebImageLowPriority; + _prefetcherQueue = dispatch_get_main_queue(); self.maxConcurrentDownloads = 3; } return self; @@ -82,9 +83,8 @@ - (void)startPrefetchingAtIndex:(NSUInteger)index { totalCount:self.prefetchURLs.count ]; } - if (self.prefetchURLs.count > self.requestedCount) { - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_async(self.prefetcherQueue, ^{ [self startPrefetchingAtIndex:self.requestedCount]; }); } @@ -94,6 +94,7 @@ - (void)startPrefetchingAtIndex:(NSUInteger)index { self.completionBlock(self.finishedCount, self.skippedCount); self.completionBlock = nil; } + self.progressBlock = nil; } }]; } @@ -120,10 +121,16 @@ - (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock self.completionBlock = completionBlock; self.progressBlock = progressBlock; - // Starts prefetching from the very first image on the list with the max allowed concurrency - NSUInteger listCount = self.prefetchURLs.count; - for (NSUInteger i = 0; i < self.maxConcurrentDownloads && self.requestedCount < listCount; i++) { - [self startPrefetchingAtIndex:i]; + if(urls.count == 0){ + if(completionBlock){ + completionBlock(0,0); + } + }else{ + // Starts prefetching from the very first image on the list with the max allowed concurrency + NSUInteger listCount = self.prefetchURLs.count; + for (NSUInteger i = 0; i < self.maxConcurrentDownloads && self.requestedCount < listCount; i++) { + [self startPrefetchingAtIndex:i]; + } } } diff --git a/Ryff/Frameworks/SDWebImage/UIButton+WebCache.h b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIButton+WebCache.h rename to Pods/SDWebImage/SDWebImage/UIButton+WebCache.h diff --git a/Ryff/Frameworks/SDWebImage/UIButton+WebCache.m b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m old mode 100755 new mode 100644 similarity index 96% rename from Ryff/Frameworks/SDWebImage/UIButton+WebCache.m rename to Pods/SDWebImage/SDWebImage/UIButton+WebCache.m index 8e076ae..33f7c29 --- a/Ryff/Frameworks/SDWebImage/UIButton+WebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m @@ -57,7 +57,7 @@ - (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placehold [self.imageURLStorage removeObjectForKey:@(state)]; dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; if (completedBlock) { completedBlock(nil, error, SDImageCacheTypeNone, url); } @@ -68,7 +68,7 @@ - (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placehold self.imageURLStorage[@(state)] = url; - __weak UIButton *wself = self; + __weak __typeof(self)wself = self; id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ @@ -111,7 +111,7 @@ - (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state [self setBackgroundImage:placeholder forState:state]; if (url) { - __weak UIButton *wself = self; + __weak __typeof(self)wself = self; id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ @@ -128,7 +128,7 @@ - (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state [self sd_setBackgroundImageLoadOperation:operation forState:state]; } else { dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; if (completedBlock) { completedBlock(nil, error, SDImageCacheTypeNone, url); } diff --git a/Ryff/Frameworks/SDWebImage/UIImage+GIF.h b/Pods/SDWebImage/SDWebImage/UIImage+GIF.h similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIImage+GIF.h rename to Pods/SDWebImage/SDWebImage/UIImage+GIF.h diff --git a/Ryff/Frameworks/SDWebImage/UIImage+GIF.m b/Pods/SDWebImage/SDWebImage/UIImage+GIF.m similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIImage+GIF.m rename to Pods/SDWebImage/SDWebImage/UIImage+GIF.m diff --git a/Ryff/Frameworks/SDWebImage/UIImage+MultiFormat.h b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIImage+MultiFormat.h rename to Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h diff --git a/Ryff/Frameworks/SDWebImage/UIImage+MultiFormat.m b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m old mode 100755 new mode 100644 similarity index 98% rename from Ryff/Frameworks/SDWebImage/UIImage+MultiFormat.m rename to Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m index 5395280..a830754 --- a/Ryff/Frameworks/SDWebImage/UIImage+MultiFormat.m +++ b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m @@ -18,6 +18,10 @@ @implementation UIImage (MultiFormat) + (UIImage *)sd_imageWithData:(NSData *)data { + if (!data) { + return nil; + } + UIImage *image; NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; if ([imageContentType isEqualToString:@"image/gif"]) { diff --git a/Ryff/Frameworks/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIImageView+HighlightedWebCache.h rename to Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h diff --git a/Ryff/Frameworks/SDWebImage/UIImageView+HighlightedWebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m old mode 100755 new mode 100644 similarity index 95% rename from Ryff/Frameworks/SDWebImage/UIImageView+HighlightedWebCache.m rename to Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m index ae73610..eed798f --- a/Ryff/Frameworks/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m @@ -33,7 +33,7 @@ - (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)op [self sd_cancelCurrentHighlightedImageLoad]; if (url) { - __weak UIImageView *wself = self; + __weak __typeof(self)wself = self; id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe (^ @@ -51,7 +51,7 @@ - (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)op [self sd_setImageLoadOperation:operation forKey:UIImageViewHighlightedWebCacheOperationKey]; } else { dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; if (completedBlock) { completedBlock(nil, error, SDImageCacheTypeNone, url); } diff --git a/Ryff/Frameworks/SDWebImage/UIImageView+WebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIImageView+WebCache.h rename to Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h diff --git a/Ryff/Frameworks/SDWebImage/UIImageView+WebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m old mode 100755 new mode 100644 similarity index 93% rename from Ryff/Frameworks/SDWebImage/UIImageView+WebCache.m rename to Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m index 51663dd..162c49a --- a/Ryff/Frameworks/SDWebImage/UIImageView+WebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m @@ -43,16 +43,23 @@ - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); if (!(options & SDWebImageDelayPlaceholder)) { - self.image = placeholder; + dispatch_main_async_safe(^{ + self.image = placeholder; + }); } if (url) { - __weak UIImageView *wself = self; + __weak __typeof(self)wself = self; id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; dispatch_main_sync_safe(^{ if (!wself) return; - if (image) { + if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) + { + completedBlock(image, error, cacheType, url); + return; + } + else if (image) { wself.image = image; [wself setNeedsLayout]; } else { @@ -69,7 +76,7 @@ - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; } else { dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; if (completedBlock) { completedBlock(nil, error, SDImageCacheTypeNone, url); } @@ -90,7 +97,7 @@ - (NSURL *)sd_imageURL { - (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; - __weak UIImageView *wself = self; + __weak __typeof(self)wself = self; NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; diff --git a/Ryff/Frameworks/SDWebImage/UIView+WebCacheOperation.h b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIView+WebCacheOperation.h rename to Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h diff --git a/Ryff/Frameworks/SDWebImage/UIView+WebCacheOperation.m b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m old mode 100755 new mode 100644 similarity index 100% rename from Ryff/Frameworks/SDWebImage/UIView+WebCacheOperation.m rename to Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m diff --git a/Pods/SSKeychain/LICENSE b/Pods/SSKeychain/LICENSE new file mode 100644 index 0000000..2ed16bd --- /dev/null +++ b/Pods/SSKeychain/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/SSKeychain/Readme.markdown b/Pods/SSKeychain/Readme.markdown new file mode 100644 index 0000000..52b369e --- /dev/null +++ b/Pods/SSKeychain/Readme.markdown @@ -0,0 +1,77 @@ +# SSKeychain + +SSKeychain is a simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system Keychain on Mac OS X and iOS. + +## Adding to Your Project + +Simply add the following to your Podfile if you're using CocoaPods: + +``` ruby +pod 'SSKeychain' +``` + +or Cartfile if you're using Carthage: + +``` +github "soffes/SSKeychain" +``` + +To manually add to your project: + +1. Add `Security.framework` to your target +2. Add `SSKeychain.h`, `SSKeychain.m`, `SSKeychainQuery.h`, and `SSKeychainQuery.m` to your project. + +SSKeychain requires ARC. + +Note: Currently SSKeychain does not support Mac OS 10.6. + +## Working with the Keychain + +SSKeychain has the following class methods for working with the system keychain: + +```objective-c ++ (NSArray *)allAccounts; ++ (NSArray *)accountsForService:(NSString *)serviceName; ++ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; ++ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; +``` + +Easy as that. (See [SSKeychain.h](https://github.com/soffes/sskeychain/blob/master/SSKeychain/SSKeychain.h) and [SSKeychainQuery.h](https://github.com/soffes/sskeychain/blob/master/SSKeychain/SSKeychainQuery.h) for all of the methods.) + +## Documentation + +### Use prepared documentation + +Read the [online documentation](http://cocoadocs.org/docsets/SSKeychain). + +## Debugging + +If your saving to the keychain fails, use the NSError object to handle it. You can invoke `[error code]` to get the numeric error code. A few values are defined in SSKeychain.h, and the rest in SecBase.h. + +```objective-c +NSError *error = nil; +SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; +query.service = @"MyService"; +query.account = @"soffes"; +[query fetch:&error]; + +if ([error code] == errSecItemNotFound) { + NSLog(@"Password not found"); +} else if (error != nil) { + NSLog(@"Some other error occurred: %@", [error localizedDescription]); +} +``` + +Obviously, you should do something more sophisticated. You can just call `[error localizedDescription]` if all you need is the error message. + +## Disclaimer + +Working with the keychain is pretty sucky. You should really check for errors and failures. This library doesn't make it any more stable, it just wraps up all of the annoying C APIs. + + +## Thanks + +This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. SSKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). + +A huge thanks to [Caleb Davenport](https://github.com/calebd) for leading the way on version 1.0 of SSKeychain. diff --git a/Ryff/Data/SSKeychain/SSKeychain.h b/Pods/SSKeychain/SSKeychain/SSKeychain.h old mode 100755 new mode 100644 similarity index 94% rename from Ryff/Data/SSKeychain/SSKeychain.h rename to Pods/SSKeychain/SSKeychain/SSKeychain.h index eb6c61f..0d7358f --- a/Ryff/Data/SSKeychain/SSKeychain.h +++ b/Pods/SSKeychain/SSKeychain/SSKeychain.h @@ -6,7 +6,7 @@ // Copyright (c) 2010-2014 Sam Soffes. All rights reserved. // -#import "SSKeychainQuery.h" +#import /** Error code specific to SSKeychain that can be returned in NSError objects. @@ -26,7 +26,7 @@ extern NSString *const kSSKeychainAccountKey; /** Time the item was created. - + The value will be a string. */ extern NSString *const kSSKeychainCreatedAtKey; @@ -41,7 +41,7 @@ extern NSString *const kSSKeychainDescriptionKey; extern NSString *const kSSKeychainLabelKey; /** Time the item was last modified. - + The value will be a string. */ extern NSString *const kSSKeychainLastModifiedKey; @@ -52,7 +52,7 @@ extern NSString *const kSSKeychainWhereKey; /** Simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system Keychain on Mac OS X and iOS. - + This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. SSKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). */ @@ -63,11 +63,11 @@ extern NSString *const kSSKeychainWhereKey; /** Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a password for the given parameters. - + @param serviceName The service for which to return the corresponding password. - + @param account The account for which to return the corresponding password. - + @return Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a password for the given parameters. */ @@ -77,11 +77,11 @@ extern NSString *const kSSKeychainWhereKey; /** Deletes a password from the Keychain. - + @param serviceName The service for which to delete the corresponding password. - + @param account The account for which to delete the corresponding password. - + @return Returns `YES` on success, or `NO` on failure. */ + (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; @@ -90,13 +90,13 @@ extern NSString *const kSSKeychainWhereKey; /** Sets a password in the Keychain. - + @param password The password to store in the Keychain. - + @param serviceName The service for which to set the corresponding password. - + @param account The account for which to set the corresponding password. - + @return Returns `YES` on success, or `NO` on failure. */ + (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; @@ -105,29 +105,31 @@ extern NSString *const kSSKeychainWhereKey; /** Returns an array containing the Keychain's accounts, or `nil` if the Keychain has no accounts. - + See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the dictionaries returned by this method. - + @return An array of dictionaries containing the Keychain's accounts, or `nil` if the Keychain doesn't have any accounts. The order of the objects in the array isn't defined. */ + (NSArray *)allAccounts; ++ (NSArray *)allAccounts:(NSError *__autoreleasing *)error; /** Returns an array containing the Keychain's accounts for a given service, or `nil` if the Keychain doesn't have any accounts for the given service. - + See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the dictionaries returned by this method. - + @param serviceName The service for which to return the corresponding accounts. - - @return An array of dictionaries containing the Keychain's accountsfor a given `serviceName`, or `nil` if the Keychain + + @return An array of dictionaries containing the Keychain's accounts for a given `serviceName`, or `nil` if the Keychain doesn't have any accounts for the given `serviceName`. The order of the objects in the array isn't defined. */ + (NSArray *)accountsForService:(NSString *)serviceName; ++ (NSArray *)accountsForService:(NSString *)serviceName error:(NSError *__autoreleasing *)error; #pragma mark - Configuration @@ -135,24 +137,24 @@ extern NSString *const kSSKeychainWhereKey; #if __IPHONE_4_0 && TARGET_OS_IPHONE /** Returns the accessibility type for all future passwords saved to the Keychain. - + @return Returns the accessibility type. - + The return value will be `NULL` or one of the "Keychain Item Accessibility Constants" used for determining when a keychain item should be readable. - + @see setAccessibilityType */ + (CFTypeRef)accessibilityType; /** Sets the accessibility type for all future passwords saved to the Keychain. - + @param accessibilityType One of the "Keychain Item Accessibility Constants" used for determining when a keychain item should be readable. - + If the value is `NULL` (the default), the Keychain default will be used. - + @see accessibilityType */ + (void)setAccessibilityType:(CFTypeRef)accessibilityType; diff --git a/Ryff/Data/SSKeychain/SSKeychain.m b/Pods/SSKeychain/SSKeychain/SSKeychain.m old mode 100755 new mode 100644 similarity index 83% rename from Ryff/Data/SSKeychain/SSKeychain.m rename to Pods/SSKeychain/SSKeychain/SSKeychain.m index 9893fb0..f896b74 --- a/Ryff/Data/SSKeychain/SSKeychain.m +++ b/Pods/SSKeychain/SSKeychain/SSKeychain.m @@ -18,7 +18,7 @@ NSString *const kSSKeychainWhereKey = @"svce"; #if __IPHONE_4_0 && TARGET_OS_IPHONE -static CFTypeRef SSKeychainAccessibilityType = NULL; + static CFTypeRef SSKeychainAccessibilityType = NULL; #endif @implementation SSKeychain @@ -65,14 +65,24 @@ + (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName acco + (NSArray *)allAccounts { - return [self accountsForService:nil]; + return [self allAccounts:nil]; +} + + ++ (NSArray *)allAccounts:(NSError *__autoreleasing *)error { + return [self accountsForService:nil error:error]; } + (NSArray *)accountsForService:(NSString *)serviceName { - SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; - query.service = serviceName; - return [query fetchAll:nil]; + return [self accountsForService:serviceName error:nil]; +} + + ++ (NSArray *)accountsForService:(NSString *)serviceName error:(NSError *__autoreleasing *)error { + SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; + query.service = serviceName; + return [query fetchAll:error]; } diff --git a/Ryff/Data/SSKeychain/SSKeychainQuery.h b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.h old mode 100755 new mode 100644 similarity index 91% rename from Ryff/Data/SSKeychain/SSKeychainQuery.h rename to Pods/SSKeychain/SSKeychain/SSKeychainQuery.h index ef4079a..f0579e1 --- a/Ryff/Data/SSKeychain/SSKeychainQuery.h +++ b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.h @@ -6,12 +6,12 @@ // Copyright (c) 2013-2014 Sam Soffes. All rights reserved. // -#import -#import +@import Foundation; +@import Security; #if __IPHONE_7_0 || __MAC_10_9 -// Keychain synchronization available at compile time -#define SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE 1 + // Keychain synchronization available at compile time + #define SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE 1 #endif #ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE @@ -69,18 +69,18 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { /** Save the receiver's attributes as a keychain item. Existing items with the given account, service, and access group will first be deleted. - + @param error Populated should an error occur. - + @return `YES` if saving was successful, `NO` otherwise. */ - (BOOL)save:(NSError **)error; /** - Dete keychain items that match the given account, service, and access group. - + Delete keychain items that match the given account, service, and access group. + @param error Populated should an error occur. - + @return `YES` if saving was successful, `NO` otherwise. */ - (BOOL)deleteItem:(NSError **)error; @@ -93,9 +93,9 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { /** Fetch all keychain items that match the given account, service, and access group. The values of `password` and `passwordData` are ignored when fetching. - + @param error Populated should an error occur. - + @return An array of dictionaries that represent all matching keychain items or `nil` should an error occur. The order of the items is not determined. @@ -107,9 +107,9 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { group. The `password` and `passwordData` properties will be populated unless an error occurs. The values of `password` and `passwordData` are ignored when fetching. - + @param error Populated should an error occur. - + @return `YES` if fetching was successful, `NO` otherwise. */ - (BOOL)fetch:(NSError **)error; @@ -121,7 +121,7 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { #ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE /** - Returns a boolean indicating if keychain synchronization is available on the device at runtime. The #define + Returns a boolean indicating if keychain synchronization is available on the device at runtime. The #define SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE is only for compile time. If you are checking for the presence of synchronization, you should use this method. diff --git a/Ryff/Data/SSKeychain/SSKeychainQuery.m b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.m old mode 100755 new mode 100644 similarity index 94% rename from Ryff/Data/SSKeychain/SSKeychainQuery.m rename to Pods/SSKeychain/SSKeychain/SSKeychainQuery.m index a493767..70ee516 --- a/Ryff/Data/SSKeychain/SSKeychainQuery.m +++ b/Pods/SSKeychain/SSKeychain/SSKeychainQuery.m @@ -34,9 +34,9 @@ - (BOOL)save:(NSError *__autoreleasing *)error { } return NO; } - + [self deleteItem:nil]; - + NSMutableDictionary *query = [self query]; [query setObject:self.passwordData forKey:(__bridge id)kSecValueData]; if (self.label) { @@ -49,11 +49,11 @@ - (BOOL)save:(NSError *__autoreleasing *)error { } #endif status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); - + if (status != errSecSuccess && error != NULL) { *error = [[self class] errorWithCode:status]; } - + return (status == errSecSuccess); } @@ -66,7 +66,7 @@ - (BOOL)deleteItem:(NSError *__autoreleasing *)error { } return NO; } - + NSMutableDictionary *query = [self query]; #if TARGET_OS_IPHONE status = SecItemDelete((__bridge CFDictionaryRef)query); @@ -79,11 +79,11 @@ - (BOOL)deleteItem:(NSError *__autoreleasing *)error { CFRelease(result); } #endif - + if (status != errSecSuccess && error != NULL) { *error = [[self class] errorWithCode:status]; } - + return (status == errSecSuccess); } @@ -93,14 +93,14 @@ - (NSArray *)fetchAll:(NSError *__autoreleasing *)error { NSMutableDictionary *query = [self query]; [query setObject:@YES forKey:(__bridge id)kSecReturnAttributes]; [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; - + CFTypeRef result = NULL; status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); if (status != errSecSuccess && error != NULL) { *error = [[self class] errorWithCode:status]; return nil; } - + return (__bridge_transfer NSArray *)result; } @@ -113,18 +113,20 @@ - (BOOL)fetch:(NSError *__autoreleasing *)error { } return NO; } - + CFTypeRef result = NULL; NSMutableDictionary *query = [self query]; [query setObject:@YES forKey:(__bridge id)kSecReturnData]; [query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; + + if (status != errSecSuccess) { + if (error) { + *error = [[self class] errorWithCode:status]; + } return NO; } - + self.passwordData = (__bridge_transfer NSData *)result; return YES; } @@ -178,44 +180,44 @@ + (BOOL)isSynchronizationAvailable { - (NSMutableDictionary *)query { NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:3]; [dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; - + if (self.service) { [dictionary setObject:self.service forKey:(__bridge id)kSecAttrService]; } - + if (self.account) { [dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount]; } - + #if __IPHONE_3_0 && TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR if (self.accessGroup) { [dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; } #endif - + #ifdef SSKEYCHAIN_SYNCHRONIZATION_AVAILABLE if ([[self class] isSynchronizationAvailable]) { id value; - + switch (self.synchronizationMode) { case SSKeychainQuerySynchronizationModeNo: { - value = @NO; - break; + value = @NO; + break; } case SSKeychainQuerySynchronizationModeYes: { - value = @YES; - break; + value = @YES; + break; } case SSKeychainQuerySynchronizationModeAny: { - value = (__bridge id)(kSecAttrSynchronizableAny); - break; + value = (__bridge id)(kSecAttrSynchronizableAny); + break; } } - + [dictionary setObject:value forKey:(__bridge id)(kSecAttrSynchronizable)]; } #endif - + return dictionary; } @@ -225,7 +227,7 @@ + (NSError *)errorWithCode:(OSStatus) code { switch (code) { case errSecSuccess: return nil; case SSKeychainErrorBadArguments: message = NSLocalizedStringFromTable(@"SSKeychainErrorBadArguments", @"SSKeychain", nil); break; - + #if TARGET_OS_IPHONE case errSecUnimplemented: { message = NSLocalizedStringFromTable(@"errSecUnimplemented", @"SSKeychain", nil); @@ -271,7 +273,7 @@ + (NSError *)errorWithCode:(OSStatus) code { message = (__bridge_transfer NSString *)SecCopyErrorMessageString(code, NULL); #endif } - + NSDictionary *userInfo = nil; if (message) { userInfo = @{ NSLocalizedDescriptionKey : message }; diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-Private.xcconfig b/Pods/Target Support Files/AFNetworking/AFNetworking-Private.xcconfig new file mode 100644 index 0000000..7c1f0b1 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-Private.xcconfig @@ -0,0 +1,6 @@ +#include "AFNetworking.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${AFNETWORKING_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m b/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m new file mode 100644 index 0000000..6a29cf8 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AFNetworking : NSObject +@end +@implementation PodsDummy_AFNetworking +@end diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch new file mode 100644 index 0000000..1e116a3 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch @@ -0,0 +1,11 @@ +#ifdef __OBJC__ +#import +#endif + +#ifndef TARGET_OS_IOS + #define TARGET_OS_IOS TARGET_OS_IPHONE +#endif + +#ifndef TARGET_OS_WATCH + #define TARGET_OS_WATCH 0 +#endif diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-umbrella.h b/Pods/Target Support Files/AFNetworking/AFNetworking-umbrella.h new file mode 100644 index 0000000..82a3f9d --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-umbrella.h @@ -0,0 +1,26 @@ +#import + +#import "AFNetworking.h" +#import "AFURLConnectionOperation.h" +#import "AFHTTPRequestOperation.h" +#import "AFHTTPRequestOperationManager.h" +#import "AFHTTPSessionManager.h" +#import "AFURLSessionManager.h" +#import "AFNetworkReachabilityManager.h" +#import "AFSecurityPolicy.h" +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" +#import "AFNetworkActivityIndicatorManager.h" +#import "UIActivityIndicatorView+AFNetworking.h" +#import "UIAlertView+AFNetworking.h" +#import "UIButton+AFNetworking.h" +#import "UIImage+AFNetworking.h" +#import "UIImageView+AFNetworking.h" +#import "UIKit+AFNetworking.h" +#import "UIProgressView+AFNetworking.h" +#import "UIRefreshControl+AFNetworking.h" +#import "UIWebView+AFNetworking.h" + +FOUNDATION_EXPORT double AFNetworkingVersionNumber; +FOUNDATION_EXPORT const unsigned char AFNetworkingVersionString[]; + diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking.modulemap b/Pods/Target Support Files/AFNetworking/AFNetworking.modulemap new file mode 100644 index 0000000..5892cd3 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking.modulemap @@ -0,0 +1,6 @@ +framework module AFNetworking { + umbrella header "AFNetworking-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig new file mode 100644 index 0000000..b0b2d52 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig @@ -0,0 +1 @@ +AFNETWORKING_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" \ No newline at end of file diff --git a/Pods/Target Support Files/AFNetworking/Info.plist b/Pods/Target Support Files/AFNetworking/Info.plist new file mode 100644 index 0000000..cf3dfe2 --- /dev/null +++ b/Pods/Target Support Files/AFNetworking/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.6.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-Private.xcconfig b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-Private.xcconfig new file mode 100644 index 0000000..0451999 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-Private.xcconfig @@ -0,0 +1,5 @@ +#include "CHTCollectionViewWaterfallLayout.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/CHTCollectionViewWaterfallLayout" "${PODS_ROOT}/Headers/Public" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-dummy.m b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-dummy.m new file mode 100644 index 0000000..3f7d031 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_CHTCollectionViewWaterfallLayout : NSObject +@end +@implementation PodsDummy_CHTCollectionViewWaterfallLayout +@end diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-prefix.pch b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-umbrella.h b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-umbrella.h new file mode 100644 index 0000000..41aed33 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout-umbrella.h @@ -0,0 +1,7 @@ +#import + +#import "CHTCollectionViewWaterfallLayout.h" + +FOUNDATION_EXPORT double CHTCollectionViewWaterfallLayoutVersionNumber; +FOUNDATION_EXPORT const unsigned char CHTCollectionViewWaterfallLayoutVersionString[]; + diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.modulemap b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.modulemap new file mode 100644 index 0000000..dc20040 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.modulemap @@ -0,0 +1,6 @@ +framework module CHTCollectionViewWaterfallLayout { + umbrella header "CHTCollectionViewWaterfallLayout-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.xcconfig b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/CHTCollectionViewWaterfallLayout.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/Info.plist b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/Info.plist new file mode 100644 index 0000000..638b960 --- /dev/null +++ b/Pods/Target Support Files/CHTCollectionViewWaterfallLayout/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.9.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/Info.plist b/Pods/Target Support Files/KRLCollectionViewGridLayout/Info.plist new file mode 100644 index 0000000..f191076 --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.4.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-Private.xcconfig b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-Private.xcconfig new file mode 100644 index 0000000..7f23c4b --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-Private.xcconfig @@ -0,0 +1,5 @@ +#include "KRLCollectionViewGridLayout.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/KRLCollectionViewGridLayout" "${PODS_ROOT}/Headers/Public" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-dummy.m b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-dummy.m new file mode 100644 index 0000000..9052bd0 --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_KRLCollectionViewGridLayout : NSObject +@end +@implementation PodsDummy_KRLCollectionViewGridLayout +@end diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-prefix.pch b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-umbrella.h b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-umbrella.h new file mode 100644 index 0000000..ee72006 --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout-umbrella.h @@ -0,0 +1,7 @@ +#import + +#import "KRLCollectionViewGridLayout.h" + +FOUNDATION_EXPORT double KRLCollectionViewGridLayoutVersionNumber; +FOUNDATION_EXPORT const unsigned char KRLCollectionViewGridLayoutVersionString[]; + diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.modulemap b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.modulemap new file mode 100644 index 0000000..a2bc6d3 --- /dev/null +++ b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.modulemap @@ -0,0 +1,6 @@ +framework module KRLCollectionViewGridLayout { + umbrella header "KRLCollectionViewGridLayout-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.xcconfig b/Pods/Target Support Files/KRLCollectionViewGridLayout/KRLCollectionViewGridLayout.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Target Support Files/MBProgressHUD/Info.plist b/Pods/Target Support Files/MBProgressHUD/Info.plist new file mode 100644 index 0000000..8dd5fc5 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.9.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-Private.xcconfig b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-Private.xcconfig new file mode 100644 index 0000000..f769e99 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-Private.xcconfig @@ -0,0 +1,6 @@ +#include "MBProgressHUD.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MBProgressHUD" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${MBPROGRESSHUD_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-dummy.m b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-dummy.m new file mode 100644 index 0000000..67a74df --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_MBProgressHUD : NSObject +@end +@implementation PodsDummy_MBProgressHUD +@end diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-umbrella.h b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-umbrella.h new file mode 100644 index 0000000..d0c4622 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-umbrella.h @@ -0,0 +1,7 @@ +#import + +#import "MBProgressHUD.h" + +FOUNDATION_EXPORT double MBProgressHUDVersionNumber; +FOUNDATION_EXPORT const unsigned char MBProgressHUDVersionString[]; + diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.modulemap b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.modulemap new file mode 100644 index 0000000..dbb3f94 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.modulemap @@ -0,0 +1,6 @@ +framework module MBProgressHUD { + umbrella header "MBProgressHUD-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig new file mode 100644 index 0000000..abf2244 --- /dev/null +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig @@ -0,0 +1 @@ +MBPROGRESSHUD_OTHER_LDFLAGS = -framework "CoreGraphics" \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-Ryff/Info.plist b/Pods/Target Support Files/Pods-Ryff/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.markdown b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.markdown new file mode 100644 index 0000000..472347a --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.markdown @@ -0,0 +1,142 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## CHTCollectionViewWaterfallLayout + +Copyright (c) 2012 Nelson Tai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## KRLCollectionViewGridLayout + +Copyright (c) 2014 Kevin Lundberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## MBProgressHUD + +Copyright (c) 2009-2015 Matej Bukovinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## SDWebImage + +Copyright (c) 2009 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +## SSKeychain + +Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.plist b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.plist new file mode 100644 index 0000000..4ed61ac --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-acknowledgements.plist @@ -0,0 +1,192 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2012 Nelson Tai <chiahsien@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + CHTCollectionViewWaterfallLayout + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014 Kevin Lundberg <kevin@klundberg.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + KRLCollectionViewGridLayout + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009-2015 Matej Bukovinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Title + MBProgressHUD + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009 Olivier Poitrey <rs@dailymotion.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + Title + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Title + SSKeychain + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-dummy.m b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-dummy.m new file mode 100644 index 0000000..a87dd07 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Ryff : NSObject +@end +@implementation PodsDummy_Pods_Ryff +@end diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-frameworks.sh b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-frameworks.sh new file mode 100755 index 0000000..5077aa1 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-frameworks.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + else + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries + local basename + basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'Pods-Ryff/AFNetworking.framework' + install_framework 'Pods-Ryff/CHTCollectionViewWaterfallLayout.framework' + install_framework 'Pods-Ryff/KRLCollectionViewGridLayout.framework' + install_framework 'Pods-Ryff/MBProgressHUD.framework' + install_framework 'Pods-Ryff/SDWebImage.framework' + install_framework 'Pods-Ryff/SSKeychain.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'Pods-Ryff/AFNetworking.framework' + install_framework 'Pods-Ryff/CHTCollectionViewWaterfallLayout.framework' + install_framework 'Pods-Ryff/KRLCollectionViewGridLayout.framework' + install_framework 'Pods-Ryff/MBProgressHUD.framework' + install_framework 'Pods-Ryff/SDWebImage.framework' + install_framework 'Pods-Ryff/SSKeychain.framework' +fi diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-resources.sh b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-resources.sh new file mode 100755 index 0000000..ea685a2 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-umbrella.h b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-umbrella.h new file mode 100644 index 0000000..a459e81 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_RyffVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_RyffVersionString[]; + diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.debug.xcconfig b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.debug.xcconfig new file mode 100644 index 0000000..23155b4 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/AFNetworking.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/CHTCollectionViewWaterfallLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/KRLCollectionViewGridLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/MBProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SDWebImage.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SSKeychain.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CHTCollectionViewWaterfallLayout" -framework "KRLCollectionViewGridLayout" -framework "MBProgressHUD" -framework "SDWebImage" -framework "SSKeychain" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Ryff +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.modulemap b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.modulemap new file mode 100644 index 0000000..73e9c82 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Ryff { + umbrella header "Pods-Ryff-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.release.xcconfig b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.release.xcconfig new file mode 100644 index 0000000..23155b4 --- /dev/null +++ b/Pods/Target Support Files/Pods-Ryff/Pods-Ryff.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/AFNetworking.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/CHTCollectionViewWaterfallLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/KRLCollectionViewGridLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/MBProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SDWebImage.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SSKeychain.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CHTCollectionViewWaterfallLayout" -framework "KRLCollectionViewGridLayout" -framework "MBProgressHUD" -framework "SDWebImage" -framework "SSKeychain" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Ryff +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-RyffTests/Info.plist b/Pods/Target Support Files/Pods-RyffTests/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.markdown new file mode 100644 index 0000000..472347a --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.markdown @@ -0,0 +1,142 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## CHTCollectionViewWaterfallLayout + +Copyright (c) 2012 Nelson Tai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## KRLCollectionViewGridLayout + +Copyright (c) 2014 Kevin Lundberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## MBProgressHUD + +Copyright (c) 2009-2015 Matej Bukovinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## SDWebImage + +Copyright (c) 2009 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +## SSKeychain + +Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.plist b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.plist new file mode 100644 index 0000000..4ed61ac --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-acknowledgements.plist @@ -0,0 +1,192 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2012 Nelson Tai <chiahsien@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + CHTCollectionViewWaterfallLayout + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014 Kevin Lundberg <kevin@klundberg.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + KRLCollectionViewGridLayout + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009-2015 Matej Bukovinski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Title + MBProgressHUD + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009 Olivier Poitrey <rs@dailymotion.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + Title + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2010-2014 Sam Soffes, http://soff.es + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Title + SSKeychain + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-dummy.m b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-dummy.m new file mode 100644 index 0000000..ca74283 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_RyffTests : NSObject +@end +@implementation PodsDummy_Pods_RyffTests +@end diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-frameworks.sh b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-frameworks.sh new file mode 100755 index 0000000..323eb90 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-frameworks.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + else + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries + local basename + basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'Pods-RyffTests/AFNetworking.framework' + install_framework 'Pods-RyffTests/CHTCollectionViewWaterfallLayout.framework' + install_framework 'Pods-RyffTests/KRLCollectionViewGridLayout.framework' + install_framework 'Pods-RyffTests/MBProgressHUD.framework' + install_framework 'Pods-RyffTests/SDWebImage.framework' + install_framework 'Pods-RyffTests/SSKeychain.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'Pods-RyffTests/AFNetworking.framework' + install_framework 'Pods-RyffTests/CHTCollectionViewWaterfallLayout.framework' + install_framework 'Pods-RyffTests/KRLCollectionViewGridLayout.framework' + install_framework 'Pods-RyffTests/MBProgressHUD.framework' + install_framework 'Pods-RyffTests/SDWebImage.framework' + install_framework 'Pods-RyffTests/SSKeychain.framework' +fi diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-resources.sh b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-resources.sh new file mode 100755 index 0000000..ea685a2 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-umbrella.h b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-umbrella.h new file mode 100644 index 0000000..287c522 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_RyffTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_RyffTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.debug.xcconfig b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.debug.xcconfig new file mode 100644 index 0000000..d478217 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/AFNetworking.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/CHTCollectionViewWaterfallLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/KRLCollectionViewGridLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/MBProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SDWebImage.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SSKeychain.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CHTCollectionViewWaterfallLayout" -framework "KRLCollectionViewGridLayout" -framework "MBProgressHUD" -framework "SDWebImage" -framework "SSKeychain" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-RyffTests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.modulemap b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.modulemap new file mode 100644 index 0000000..3b39816 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_RyffTests { + umbrella header "Pods-RyffTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.release.xcconfig b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.release.xcconfig new file mode 100644 index 0000000..d478217 --- /dev/null +++ b/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/AFNetworking.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/CHTCollectionViewWaterfallLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/KRLCollectionViewGridLayout.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/MBProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SDWebImage.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SSKeychain.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AFNetworking" -framework "CHTCollectionViewWaterfallLayout" -framework "KRLCollectionViewGridLayout" -framework "MBProgressHUD" -framework "SDWebImage" -framework "SSKeychain" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-RyffTests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/SDWebImage/Info.plist b/Pods/Target Support Files/SDWebImage/Info.plist new file mode 100644 index 0000000..1672e4c --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.7.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-Private.xcconfig b/Pods/Target Support Files/SDWebImage/SDWebImage-Private.xcconfig new file mode 100644 index 0000000..6d06b2a --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage-Private.xcconfig @@ -0,0 +1,6 @@ +#include "SDWebImage.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDWebImage" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${SDWEBIMAGE_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m b/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m new file mode 100644 index 0000000..86d2b5f --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SDWebImage : NSObject +@end +@implementation PodsDummy_SDWebImage +@end diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch b/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h b/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h new file mode 100644 index 0000000..5a051dd --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h @@ -0,0 +1,21 @@ +#import + +#import "NSData+ImageContentType.h" +#import "SDImageCache.h" +#import "SDWebImageCompat.h" +#import "SDWebImageDecoder.h" +#import "SDWebImageDownloader.h" +#import "SDWebImageDownloaderOperation.h" +#import "SDWebImageManager.h" +#import "SDWebImageOperation.h" +#import "SDWebImagePrefetcher.h" +#import "UIButton+WebCache.h" +#import "UIImage+GIF.h" +#import "UIImage+MultiFormat.h" +#import "UIImageView+HighlightedWebCache.h" +#import "UIImageView+WebCache.h" +#import "UIView+WebCacheOperation.h" + +FOUNDATION_EXPORT double SDWebImageVersionNumber; +FOUNDATION_EXPORT const unsigned char SDWebImageVersionString[]; + diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap b/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap new file mode 100644 index 0000000..91545be --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap @@ -0,0 +1,6 @@ +framework module SDWebImage { + umbrella header "SDWebImage-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig b/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig new file mode 100644 index 0000000..6ac563d --- /dev/null +++ b/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig @@ -0,0 +1 @@ +SDWEBIMAGE_OTHER_LDFLAGS = -framework "ImageIO" \ No newline at end of file diff --git a/Pods/Target Support Files/SSKeychain/Info.plist b/Pods/Target Support Files/SSKeychain/Info.plist new file mode 100644 index 0000000..723dad6 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.2.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain-Private.xcconfig b/Pods/Target Support Files/SSKeychain/SSKeychain-Private.xcconfig new file mode 100644 index 0000000..1f54ab8 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain-Private.xcconfig @@ -0,0 +1,6 @@ +#include "SSKeychain.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SSKeychain" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${SSKEYCHAIN_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain-dummy.m b/Pods/Target Support Files/SSKeychain/SSKeychain-dummy.m new file mode 100644 index 0000000..a3fa5c7 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SSKeychain : NSObject +@end +@implementation PodsDummy_SSKeychain +@end diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain-prefix.pch b/Pods/Target Support Files/SSKeychain/SSKeychain-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain-umbrella.h b/Pods/Target Support Files/SSKeychain/SSKeychain-umbrella.h new file mode 100644 index 0000000..2a38f20 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain-umbrella.h @@ -0,0 +1,8 @@ +#import + +#import "SSKeychain.h" +#import "SSKeychainQuery.h" + +FOUNDATION_EXPORT double SSKeychainVersionNumber; +FOUNDATION_EXPORT const unsigned char SSKeychainVersionString[]; + diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain.modulemap b/Pods/Target Support Files/SSKeychain/SSKeychain.modulemap new file mode 100644 index 0000000..093f7e9 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain.modulemap @@ -0,0 +1,6 @@ +framework module SSKeychain { + umbrella header "SSKeychain-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SSKeychain/SSKeychain.xcconfig b/Pods/Target Support Files/SSKeychain/SSKeychain.xcconfig new file mode 100644 index 0000000..c019ff8 --- /dev/null +++ b/Pods/Target Support Files/SSKeychain/SSKeychain.xcconfig @@ -0,0 +1 @@ +SSKEYCHAIN_OTHER_LDFLAGS = -framework "Foundation" -framework "Security" \ No newline at end of file diff --git a/README.md b/README.md index 51ee741..63155b0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Social Music ## About -[Ryff](https://github.com/RyffProject) is social network in which users collaboratively create music by mixing their own recordings with tracks posted by others. Users can follow each other or search with tags to find new people to follow, or browse trending riffs to stream to a local playlist. The universal iOS app provides an interface for creating a profile, finding other users, messaging users, listening to riffs, and recording/mixing audio to post. +[Ryff](https://github.com/RyffProject) is social network in which users collaboratively create music by mixing their own recordings with tracks posted by others. Users can follow each other or search with tags to find new people to follow, or browse trending riffs to stream to a local playlist. The universal iOS app provides an interface for creating a profile, finding other users, listening to posted tracks, and recording/mixing audio to post. @@ -15,13 +15,14 @@ This repository is the native iOS application, written in Objective-C and Swift /Workspace is general storage for inspiration or designs relating to the iOS app. -/Ryff contains the complete project and source code. Ryff conforms to MVC design pattern and is written with standard Cocoa style. +/Ryff contains the complete project and source code. ## Development Status -To Do -* More intricate interface for recording and mixing audio, using new APIs in iOS 8 like AVAudioEngine -* Messaging other users +In Development +* More intricate interface for recording and mixing audio, using AVAudioEngine +* Interface for finding popular and suggested tags to follow +* Search through posts and users tagged with a given tag Completed Features * Registration and log in @@ -30,8 +31,6 @@ Completed Features * Basic interface for recording audio to post * Create new posts with images * Newsfeed and infinite scroll with custom pull-to-refresh and pull-to-load-more controls -* Interface for finding popular and suggested tags to follow -* Search through posts and users tagged with a given tag * Create and edit a playlist and listen to riffs * Listen to audio in the background, stream to another device, control audio through control center * Local and push notifications for interactions with other users diff --git a/Ryff-Bridging-Header.h b/Ryff-Bridging-Header.h new file mode 100644 index 0000000..d2cb2c7 --- /dev/null +++ b/Ryff-Bridging-Header.h @@ -0,0 +1,27 @@ +// +// Ryff-Bridging-Header.h +// Ryff +// +// Created by Christopher Laganiere on 4/11/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +// Ryff Files +#import "RYDataManager.h" +#import "RYDiscoverServices.h" +#import "RYLoadMoreControl.h" +#import "RYMediaEditor.h" +#import "RYPlayControl.h" +#import "RYPost.h" +#import "RYRefreshControl.h" +#import "RYRegistrationServices.h" +#import "RYRiffAudioEngine.h" +#import "RYRiffAudioNode.h" +#import "RYServices.h" +#import "RYStyleSheet.h" +#import "RYTag.h" +#import "RYUser.h" +#import "RYUserFeedDataSource.h" + +// Frameworks +#import "BNRDynamicTypeManager.h" diff --git a/Ryff.xcodeproj/project.pbxproj b/Ryff.xcodeproj/project.pbxproj index 4994b84..a084a2d 100644 --- a/Ryff.xcodeproj/project.pbxproj +++ b/Ryff.xcodeproj/project.pbxproj @@ -7,278 +7,146 @@ objects = { /* Begin PBXBuildFile section */ - 830029B91B7FB2B300666D93 /* RYRiffAudioNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 830029B81B7FB2B300666D93 /* RYRiffAudioNode.m */; }; - 830029BB1B7FD17C00666D93 /* RYRiffCreateCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830029BA1B7FD17C00666D93 /* RYRiffCreateCollectionViewController.swift */; }; - 830029BD1B7FD3F900666D93 /* RYRiffCreateNodeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830029BC1B7FD3F900666D93 /* RYRiffCreateNodeCollectionViewCell.swift */; }; - 830185F419009C3A00093EFA /* RYLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 830185F319009C3A00093EFA /* RYLoginViewController.m */; }; - 830185FE1900AEB300093EFA /* UIColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 830185FD1900AEB300093EFA /* UIColor+Hex.m */; }; - 830186011900B1CD00093EFA /* tabBar.png in Resources */ = {isa = PBXBuildFile; fileRef = 830185FF1900B1CD00093EFA /* tabBar.png */; }; - 830186021900B1CD00093EFA /* tabBar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 830186001900B1CD00093EFA /* tabBar@2x.png */; }; - 83082FDD19B4F303000AFACB /* airplayIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 83082FDB19B4F303000AFACB /* airplayIcon.png */; }; - 83082FDE19B4F303000AFACB /* airplayIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83082FDC19B4F303000AFACB /* airplayIcon@2x.png */; }; - 83082FE119B52256000AFACB /* sliderSmall.png in Resources */ = {isa = PBXBuildFile; fileRef = 83082FDF19B52256000AFACB /* sliderSmall.png */; }; - 83082FE219B52256000AFACB /* sliderSmall@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83082FE019B52256000AFACB /* sliderSmall@2x.png */; }; - 83082FE819B55DF4000AFACB /* RYTagFeedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83082FE719B55DF4000AFACB /* RYTagFeedViewController.m */; }; - 83082FEB19B5652D000AFACB /* RYSearchTypeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83082FEA19B5652D000AFACB /* RYSearchTypeTableViewCell.m */; }; - 8309553819CA5EAC000A41B3 /* RYRiffDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8309553719CA5EAC000A41B3 /* RYRiffDetailsCell.xib */; }; - 830BBCB318F9F54900A9C53F /* SSKeychain.strings in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCAD18F9F54900A9C53F /* SSKeychain.strings */; }; - 830BBCB418F9F54900A9C53F /* SSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCB018F9F54900A9C53F /* SSKeychain.m */; }; - 830BBCB518F9F54900A9C53F /* SSKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCB218F9F54900A9C53F /* SSKeychainQuery.m */; }; - 830BBCBA18FA055900A9C53F /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCB918FA055900A9C53F /* MBProgressHUD.m */; }; - 830BBCC318FA081600A9C53F /* checkmark.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCC118FA081600A9C53F /* checkmark.png */; }; - 830BBCC418FA081600A9C53F /* checkmark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCC218FA081600A9C53F /* checkmark@2x.png */; }; - 830BBCC818FA0A5800A9C53F /* RYLocationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCC718FA0A5800A9C53F /* RYLocationServices.m */; }; + 3F24D8321B9B4ED300E78B05 /* RYNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */; }; + 3F32A8F81B9B87F000E79282 /* RYFadingVisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */; }; + 3F3744EC1B9B89B4005A9DD2 /* RYFadingVisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */; }; + 3F3744EE1B9B9442005A9DD2 /* UILayoutPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */; }; + 3F3744EF1B9B94CC005A9DD2 /* UILayoutPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */; }; + 3F3744F11B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */; }; + 3F387BC31B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */; }; + 3F387BC41B9B3C2B00B5CC74 /* RYAudioDeckViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */; }; + 3F387BC51B9B3C2B00B5CC74 /* RYCorePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */; }; + 3F387BC61B9B3C2B00B5CC74 /* RYCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */; }; + 3F387BC71B9B3C2B00B5CC74 /* RYDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */; }; + 3F387BC81B9B3C2B00B5CC74 /* RYDiscoverServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */; }; + 3F387BC91B9B3C2B00B5CC74 /* RYDiscoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */; }; + 3F387BCA1B9B3C2B00B5CC74 /* RYGroupTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */; }; + 3F387BCB1B9B3C2B00B5CC74 /* RYLoadMoreControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */; }; + 3F387BCC1B9B3C2B00B5CC74 /* RYLocationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */; }; + 3F387BCD1B9B3C2B00B5CC74 /* RYLoginTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */; }; + 3F387BCE1B9B3C2B00B5CC74 /* RYLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */; }; + 3F387BCF1B9B3C2B00B5CC74 /* RYMediaEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */; }; + 3F387BD01B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */; }; + 3F387BD11B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */; }; + 3F387BD21B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */; }; + 3F387BD31B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */; }; + 3F387BD41B9B3C2B00B5CC74 /* RYNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */; }; + 3F387BD51B9B3C2B00B5CC74 /* RYNotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */; }; + 3F387BD61B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */; }; + 3F387BD71B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */; }; + 3F387BD81B9B3C2B00B5CC74 /* RYPlayControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */; }; + 3F387BD91B9B3C2B00B5CC74 /* RYPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B811B9B3C2B00B5CC74 /* RYPost.m */; }; + 3F387BDA1B9B3C2B00B5CC74 /* RYPostsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */; }; + 3F387BDB1B9B3C2B00B5CC74 /* RYPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */; }; + 3F387BDC1B9B3C2B00B5CC74 /* RYPostTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */; }; + 3F387BDD1B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */; }; + 3F387BDF1B9B3C2B00B5CC74 /* RYProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */; }; + 3F387BE01B9B3C2B00B5CC74 /* RYProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */; }; + 3F387BE11B9B3C2B00B5CC74 /* RYRefreshControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */; }; + 3F387BE21B9B3C2B00B5CC74 /* RYRegistrationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */; }; + 3F387BE31B9B3C2B00B5CC74 /* RYRiffAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */; }; + 3F387BE41B9B3C2B00B5CC74 /* RYRiffAudioNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */; }; + 3F387BE51B9B3C2B00B5CC74 /* RYRiffCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */; }; + 3F387BE61B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */; }; + 3F387BE71B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */; }; + 3F387BE81B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */; }; + 3F387BE91B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */; }; + 3F387BEA1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */; }; + 3F387BEB1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */; }; + 3F387BEC1B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */; }; + 3F387BED1B9B3C2B00B5CC74 /* RYRiffStreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */; }; + 3F387BEE1B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */; }; + 3F387BEF1B9B3C2B00B5CC74 /* RYServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */; }; + 3F387BF01B9B3C2B00B5CC74 /* RYSocialTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */; }; + 3F387BF11B9B3C2B00B5CC74 /* RYStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */; }; + 3F387BF21B9B3C2B00B5CC74 /* RYTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */; }; + 3F387BF31B9B3C2B00B5CC74 /* RYTag.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */; }; + 3F387BF41B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */; }; + 3F387BF51B9B3C2B00B5CC74 /* RYTagFeedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */; }; + 3F387BF61B9B3C2B00B5CC74 /* RYTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */; }; + 3F387BF71B9B3C2B00B5CC74 /* RYTagListHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */; }; + 3F387BF81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */; }; + 3F387BF91B9B3C2B00B5CC74 /* RYUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */; }; + 3F387BFA1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */; }; + 3F387BFB1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */; }; + 3F387BFC1B9B3C2B00B5CC74 /* RYUserListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */; }; + 3F387C121B9B3F8900B5CC74 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */; }; + 3F387C131B9B3F8900B5CC74 /* RiffCreate.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */; }; + 3F387C141B9B3F8900B5CC74 /* RYRiffCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */; }; + 3F387C151B9B3F8900B5CC74 /* RYRiffCellAvatar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */; }; + 3F387C161B9B3F8900B5CC74 /* RYRiffDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */; }; + 3F387C1B1B9B3F9400B5CC74 /* Lato-Bol.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */; }; + 3F387C1C1B9B3F9400B5CC74 /* Lato-Lig.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */; }; + 3F387C1D1B9B3F9400B5CC74 /* Lato-Reg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */; }; + 3F387C1E1B9B3F9400B5CC74 /* Lato-RegIta.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */; }; + 3F387C321B9B3FB200B5CC74 /* NSObject+block.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */; }; + 3F387C331B9B3FB200B5CC74 /* UIColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */; }; + 3F387C341B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */; }; + 3F387C351B9B3FB200B5CC74 /* UIImage+Color.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */; }; + 3F387C361B9B3FB200B5CC74 /* UIImage+Size.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */; }; + 3F387C371B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */; }; + 3F387C381B9B3FB200B5CC74 /* UIView+Styling.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */; }; + 3F387C391B9B3FB200B5CC74 /* UIViewController+Extras.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */; }; + 3F387C3A1B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */; }; + 3F51B57F1B9BB435007A136D /* RYUserProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */; }; + 3F51B5801B9BB438007A136D /* RYProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */; }; + 3FE76E471B9B40BB00099CF5 /* BlockAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */; }; + 3FE76E4C1B9B40DF00099CF5 /* DWTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */; }; + 3FE76E521B9B40F300099CF5 /* PXAlertView+Customization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */; }; + 3FE76E531B9B40F300099CF5 /* PXAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E511B9B40F300099CF5 /* PXAlertView.m */; }; + 3FE76E581B9B40FF00099CF5 /* BNRDynamicTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */; }; + 3FE76E5B1B9B411C00099CF5 /* RYAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */; }; + 3FE76E621B9B412E00099CF5 /* dsym_upload.sh in Resources */ = {isa = PBXBuildFile; fileRef = 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */; }; + 3FE76E631B9B412E00099CF5 /* libCrittercism_v4_3_7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */; }; + 3FE76E641B9B414500099CF5 /* RYPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */; }; + 3FE76E651B9B414900099CF5 /* RYPostTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */; }; + 3FE76E691B9B443900099CF5 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3FE76E681B9B443900099CF5 /* Media.xcassets */; }; + 3FF2A4891B9CCDC500EBF74D /* RYPostTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */; }; + 3FF2A48A1B9CCDC500EBF74D /* RYPostTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */; }; + 3FF2A48C1B9CCFB300EBF74D /* RYStarredView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */; }; + 3FF2A48D1B9CCFB300EBF74D /* RYStarredView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */; }; + 3FF2A48F1B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */; }; + 3FF2A4901B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */; }; + 3FF2A4921B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */; }; + 3FF2A4931B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */; }; + 3FF2A4951B9CD1A000EBF74D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4941B9CD1A000EBF74D /* Constants.swift */; }; + 3FF2A4961B9CD1A000EBF74D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4941B9CD1A000EBF74D /* Constants.swift */; }; + 3FF2A49E1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */; }; 830BBCCA18FA0C2300A9C53F /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830BBCC918FA0C2300A9C53F /* CoreLocation.framework */; }; - 830BBCD218FA142000A9C53F /* BlockAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCD118FA142000A9C53F /* BlockAlertView.m */; }; - 830BBCD918FA196300A9C53F /* userBig.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCD718FA196300A9C53F /* userBig.png */; }; - 830BBCDA18FA196300A9C53F /* userBig@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCD818FA196300A9C53F /* userBig@2x.png */; }; - 830BBCDF18FA401700A9C53F /* friend.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCDB18FA401700A9C53F /* friend.png */; }; - 830BBCE018FA401700A9C53F /* friend@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 830BBCDC18FA401700A9C53F /* friend@2x.png */; }; - 830BBCE518FA57F200A9C53F /* RYCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCE418FA57F200A9C53F /* RYCoreViewController.m */; }; - 830BBCE818FA589F00A9C53F /* RYCorePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BBCE718FA589F00A9C53F /* RYCorePageViewController.m */; }; - 8310F5AA1981F92300250172 /* RYPlayControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 8310F5A91981F92300250172 /* RYPlayControl.m */; }; - 8312628D19AD120D00532CA3 /* RYSocialTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8312628C19AD120D00532CA3 /* RYSocialTextView.m */; }; - 831A88A9199EEEDD00C44CED /* next.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8891199EEEDD00C44CED /* next.png */; }; - 831A88AA199EEEDD00C44CED /* next@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8892199EEEDD00C44CED /* next@2x.png */; }; - 831A88AB199EEEDD00C44CED /* pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8893199EEEDD00C44CED /* pause.png */; }; - 831A88AC199EEEDD00C44CED /* pause@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8894199EEEDD00C44CED /* pause@2x.png */; }; - 831A88AD199EEEDD00C44CED /* play.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8895199EEEDD00C44CED /* play.png */; }; - 831A88AE199EEEDD00C44CED /* play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8896199EEEDD00C44CED /* play@2x.png */; }; - 831A88AF199EEEDD00C44CED /* playing.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8897199EEEDD00C44CED /* playing.png */; }; - 831A88B0199EEEDD00C44CED /* playing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8898199EEEDD00C44CED /* playing@2x.png */; }; - 831A88B1199EEEDD00C44CED /* plus.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A8899199EEEDD00C44CED /* plus.png */; }; - 831A88B2199EEEDD00C44CED /* plus@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889A199EEEDD00C44CED /* plus@2x.png */; }; - 831A88B3199EEEDD00C44CED /* remix.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889B199EEEDD00C44CED /* remix.png */; }; - 831A88B4199EEEDD00C44CED /* remix@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889C199EEEDD00C44CED /* remix@2x.png */; }; - 831A88B5199EEEDD00C44CED /* rss.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889D199EEEDD00C44CED /* rss.png */; }; - 831A88B6199EEEDD00C44CED /* rss@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889E199EEEDD00C44CED /* rss@2x.png */; }; - 831A88B7199EEEDD00C44CED /* star.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A889F199EEEDD00C44CED /* star.png */; }; - 831A88B8199EEEDD00C44CED /* star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A0199EEEDD00C44CED /* star@2x.png */; }; - 831A88B9199EEEDD00C44CED /* stream.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A1199EEEDD00C44CED /* stream.png */; }; - 831A88BA199EEEDD00C44CED /* stream@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A2199EEEDD00C44CED /* stream@2x.png */; }; - 831A88BB199EEEDD00C44CED /* tag.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A3199EEEDD00C44CED /* tag.png */; }; - 831A88BC199EEEDD00C44CED /* tag@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A4199EEEDD00C44CED /* tag@2x.png */; }; - 831A88BD199EEEDD00C44CED /* upvote.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A5199EEEDD00C44CED /* upvote.png */; }; - 831A88BE199EEEDD00C44CED /* upvote@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A6199EEEDD00C44CED /* upvote@2x.png */; }; - 831A88BF199EEEDD00C44CED /* x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A7199EEEDD00C44CED /* x.png */; }; - 831A88C0199EEEDD00C44CED /* x@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 831A88A8199EEEDD00C44CED /* x@2x.png */; }; - 831B96081964DEC6003A8616 /* RYDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 831B96071964DEC6003A8616 /* RYDataManager.m */; }; - 831B960B1964E428003A8616 /* RYTrackDownloadTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 831B960A1964E428003A8616 /* RYTrackDownloadTableViewCell.m */; }; - 831E5FFA19A03269007F3C31 /* RYNewsfeedNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 831E5FF919A03269007F3C31 /* RYNewsfeedNavigationController.m */; }; - 8322309319AFFCC200C60033 /* sliderFull.png in Resources */ = {isa = PBXBuildFile; fileRef = 8322308F19AFFCC200C60033 /* sliderFull.png */; }; - 8322309419AFFCC200C60033 /* sliderFull@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8322309019AFFCC200C60033 /* sliderFull@2x.png */; }; - 8322309519AFFCC200C60033 /* sliderSeek.png in Resources */ = {isa = PBXBuildFile; fileRef = 8322309119AFFCC200C60033 /* sliderSeek.png */; }; - 8322309619AFFCC200C60033 /* sliderSeek@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8322309219AFFCC200C60033 /* sliderSeek@2x.png */; }; - 8322309C19B00D0200C60033 /* PXAlertView+Customization.m in Sources */ = {isa = PBXBuildFile; fileRef = 8322309919B00D0200C60033 /* PXAlertView+Customization.m */; }; - 8322309D19B00D0200C60033 /* PXAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8322309B19B00D0200C60033 /* PXAlertView.m */; }; - 832658A519BA416C0047D93B /* RYRiffCellAvatar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 832658A419BA416C0047D93B /* RYRiffCellAvatar.xib */; }; - 832B89F91B32367700881AD8 /* FDWaveformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 832B89F81B32367700881AD8 /* FDWaveformView.m */; }; - 83302D8F19C7A20B008C5A54 /* RYTagListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83302D8E19C7A20B008C5A54 /* RYTagListViewController.m */; }; - 83302D9519C7A972008C5A54 /* RYDiscoverServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 83302D9419C7A972008C5A54 /* RYDiscoverServices.m */; }; - 83360CD119B6A7EB00136FCB /* RYNotificationsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83360CD019B6A7EB00136FCB /* RYNotificationsTableViewController.m */; }; - 83360CD419B6A7FF00136FCB /* RYNotificationsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83360CD319B6A7FF00136FCB /* RYNotificationsTableViewCell.m */; }; - 83360CDA19B6B76500136FCB /* RYNotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83360CD919B6B76500136FCB /* RYNotificationsManager.m */; }; - 83360CDD19B6B84E00136FCB /* RYNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 83360CDC19B6B84E00136FCB /* RYNotification.m */; }; - 833FC1AE1989E406002491C8 /* RYRiffDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 833FC1AD1989E406002491C8 /* RYRiffDetailsViewController.m */; }; - 833FC1B21989E4B0002491C8 /* RYRiffDetailsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 833FC1B11989E4B0002491C8 /* RYRiffDetailsTableViewCell.m */; }; - 834A0B4F19BED5A700E4D7E9 /* RYRegistrationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 834A0B4E19BED5A700E4D7E9 /* RYRegistrationServices.m */; }; - 834FEC0D19897E4B00C3D9B9 /* RYRiffCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 834FEC0C19897E4B00C3D9B9 /* RYRiffCell.xib */; }; - 834FEC1019897E6600C3D9B9 /* RYRiffCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 834FEC0F19897E6600C3D9B9 /* RYRiffCell.m */; }; - 8355167219512CF100CF2C23 /* RYRiffCreateOldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8355167119512CF100CF2C23 /* RYRiffCreateOldViewController.m */; }; - 835516761951315F00CF2C23 /* RYRiffCreateTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 835516751951315F00CF2C23 /* RYRiffCreateTableViewCell.m */; }; - 835E1AB51A4943D600FC679B /* RYRiffAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 835E1AB41A4943D600FC679B /* RYRiffAudioEngine.m */; }; - 835E1E0519D21A50007EBD74 /* dsym_upload.sh in Resources */ = {isa = PBXBuildFile; fileRef = 835E1E0319D21A50007EBD74 /* dsym_upload.sh */; }; - 835E1E0619D21A50007EBD74 /* libCrittercism_v4_3_7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 835E1E0419D21A50007EBD74 /* libCrittercism_v4_3_7.a */; }; - 835E1E0A19D2320D007EBD74 /* RYLoadMoreControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 835E1E0919D2320D007EBD74 /* RYLoadMoreControl.m */; }; - 835E482F19AE634B002A3AC2 /* options.png in Resources */ = {isa = PBXBuildFile; fileRef = 835E482D19AE634B002A3AC2 /* options.png */; }; - 835E483019AE634B002A3AC2 /* options@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 835E482E19AE634B002A3AC2 /* options@2x.png */; }; - 836461AE195FBF05005938F5 /* RYLoginTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 836461AD195FBF05005938F5 /* RYLoginTableViewCell.m */; }; - 836F484219A04BAB00E948BE /* NSObject+block.m in Sources */ = {isa = PBXBuildFile; fileRef = 836F483919A04BAB00E948BE /* NSObject+block.m */; }; - 836F484319A04BAB00E948BE /* UIImage+Color.m in Sources */ = {isa = PBXBuildFile; fileRef = 836F483B19A04BAB00E948BE /* UIImage+Color.m */; }; - 836F484419A04BAB00E948BE /* UIImage+Thumbnail.m in Sources */ = {isa = PBXBuildFile; fileRef = 836F483D19A04BAB00E948BE /* UIImage+Thumbnail.m */; }; - 836F484519A04BAB00E948BE /* UIView+Styling.m in Sources */ = {isa = PBXBuildFile; fileRef = 836F483F19A04BAB00E948BE /* UIView+Styling.m */; }; - 836F484619A04BAB00E948BE /* UIViewController+Extras.m in Sources */ = {isa = PBXBuildFile; fileRef = 836F484119A04BAB00E948BE /* UIViewController+Extras.m */; }; - 837367FC19A8344600D9559D /* globe.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367EE19A8344600D9559D /* globe.png */; }; - 837367FD19A8344600D9559D /* globe@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367EF19A8344600D9559D /* globe@2x.png */; }; - 837367FE19A8344600D9559D /* location.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F019A8344600D9559D /* location.png */; }; - 837367FF19A8344600D9559D /* location@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F119A8344600D9559D /* location@2x.png */; }; - 8373680019A8344600D9559D /* message.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F219A8344600D9559D /* message.png */; }; - 8373680119A8344600D9559D /* message@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F319A8344600D9559D /* message@2x.png */; }; - 8373680219A8344600D9559D /* notification.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F419A8344600D9559D /* notification.png */; }; - 8373680319A8344600D9559D /* notification@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F519A8344600D9559D /* notification@2x.png */; }; - 8373680419A8344600D9559D /* userAdd.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F619A8344600D9559D /* userAdd.png */; }; - 8373680519A8344600D9559D /* userAdd@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F719A8344600D9559D /* userAdd@2x.png */; }; - 8373680619A8344600D9559D /* userDelete.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F819A8344600D9559D /* userDelete.png */; }; - 8373680719A8344600D9559D /* userDelete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367F919A8344600D9559D /* userDelete@2x.png */; }; - 8373680819A8344600D9559D /* userIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367FA19A8344600D9559D /* userIcon.png */; }; - 8373680919A8344600D9559D /* userIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 837367FB19A8344600D9559D /* userIcon@2x.png */; }; - 837BA0E319CCAED8002AA13E /* RYUserListCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 837BA0E219CCAED8002AA13E /* RYUserListCollectionViewCell.m */; }; - 837BA0F719CCC619002AA13E /* BNRDynamicTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 837BA0F219CCC619002AA13E /* BNRDynamicTypeManager.m */; }; - 837BA0FA19CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 837BA0F919CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.m */; }; - 837BA10219CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 837BA10119CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.m */; }; - 837BA10A19CD12A8002AA13E /* UIViewController+RYSocialTransitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 837BA10919CD12A8002AA13E /* UIViewController+RYSocialTransitions.m */; }; - 837C98D819A82411002A9B34 /* RYUserListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 837C98D719A82411002A9B34 /* RYUserListViewController.m */; }; - 837CCD1719A3E12D00F95FCA /* RYTag.m in Sources */ = {isa = PBXBuildFile; fileRef = 837CCD1619A3E12D00F95FCA /* RYTag.m */; }; - 837E9AC61981E3360052E006 /* RYProfileInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 837E9AC51981E3360052E006 /* RYProfileInfoTableViewCell.m */; }; - 83814BCD19D0DCBF00F60FBF /* RYTagListHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83814BCC19D0DCBF00F60FBF /* RYTagListHeaderView.m */; }; - 8384965F19CBD62D0033EF92 /* check.png in Resources */ = {isa = PBXBuildFile; fileRef = 8384965D19CBD62D0033EF92 /* check.png */; }; - 8384966019CBD62D0033EF92 /* check@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8384965E19CBD62D0033EF92 /* check@2x.png */; }; - 838E5F4419E220510005CB34 /* RiffCreate.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83B73E5419E0F87E001C746E /* RiffCreate.storyboard */; }; - 8397133F1936DD1100913996 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8397133E1936DD1100913996 /* Main.storyboard */; }; - 8398EC8419A012D800130EFC /* RYNewsfeedContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8398EC8319A012D800130EFC /* RYNewsfeedContainerViewController.m */; }; - 83BF315919C9FFC200F5BE48 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF313919C9FFC200F5BE48 /* MKAnnotationView+WebCache.m */; }; - 83BF315A19C9FFC200F5BE48 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF313B19C9FFC200F5BE48 /* NSData+ImageContentType.m */; }; - 83BF315B19C9FFC200F5BE48 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF313D19C9FFC200F5BE48 /* SDImageCache.m */; }; - 83BF315C19C9FFC200F5BE48 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF313F19C9FFC200F5BE48 /* SDWebImageCompat.m */; }; - 83BF315D19C9FFC200F5BE48 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314119C9FFC200F5BE48 /* SDWebImageDecoder.m */; }; - 83BF315E19C9FFC200F5BE48 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314319C9FFC200F5BE48 /* SDWebImageDownloader.m */; }; - 83BF315F19C9FFC200F5BE48 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314519C9FFC200F5BE48 /* SDWebImageDownloaderOperation.m */; }; - 83BF316019C9FFC200F5BE48 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314719C9FFC200F5BE48 /* SDWebImageManager.m */; }; - 83BF316119C9FFC200F5BE48 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314A19C9FFC200F5BE48 /* SDWebImagePrefetcher.m */; }; - 83BF316219C9FFC200F5BE48 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314C19C9FFC200F5BE48 /* UIButton+WebCache.m */; }; - 83BF316319C9FFC200F5BE48 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF314E19C9FFC200F5BE48 /* UIImage+GIF.m */; }; - 83BF316419C9FFC200F5BE48 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF315019C9FFC200F5BE48 /* UIImage+MultiFormat.m */; }; - 83BF316519C9FFC200F5BE48 /* UIImage+WebP.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF315219C9FFC200F5BE48 /* UIImage+WebP.m */; }; - 83BF316619C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF315419C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.m */; }; - 83BF316719C9FFC200F5BE48 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF315619C9FFC200F5BE48 /* UIImageView+WebCache.m */; }; - 83BF316819C9FFC200F5BE48 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 83BF315819C9FFC200F5BE48 /* UIView+WebCacheOperation.m */; }; - 83C354B319BBAD41000A5BD4 /* RYRiffStreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83C354B219BBAD41000A5BD4 /* RYRiffStreamViewController.m */; }; - 83C354B919BC2AB3000A5BD4 /* availableStream.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C354B719BC2AB3000A5BD4 /* availableStream.png */; }; - 83C354BA19BC2AB3000A5BD4 /* availableStream@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C354B819BC2AB3000A5BD4 /* availableStream@2x.png */; }; - 83C354C219BCE548000A5BD4 /* UIImagePickerController+Orientations.m in Sources */ = {isa = PBXBuildFile; fileRef = 83C354C119BCE548000A5BD4 /* UIImagePickerController+Orientations.m */; }; - 83C6A5EE1960EB9600BB3D1A /* record.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6A5EC1960EB9600BB3D1A /* record.png */; }; - 83C6A5EF1960EB9600BB3D1A /* record@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6A5ED1960EB9600BB3D1A /* record@2x.png */; }; - 83C6A5F21960EC5200BB3D1A /* plus.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6A5F01960EC5200BB3D1A /* plus.png */; }; - 83C6A5F31960EC5200BB3D1A /* plus@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6A5F11960EC5200BB3D1A /* plus@2x.png */; }; - 83C6CA8318FAFF5200412469 /* back.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA7D18FAFF5200412469 /* back.png */; }; - 83C6CA8418FAFF5200412469 /* back@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA7E18FAFF5200412469 /* back@2x.png */; }; - 83C6CA8518FAFF5200412469 /* cloud.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA7F18FAFF5200412469 /* cloud.png */; }; - 83C6CA8618FAFF5200412469 /* cloud@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA8018FAFF5200412469 /* cloud@2x.png */; }; - 83C6CA8718FAFF5200412469 /* reset.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA8118FAFF5200412469 /* reset.png */; }; - 83C6CA8818FAFF5200412469 /* reset@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83C6CA8218FAFF5200412469 /* reset@2x.png */; }; - 83C8940B19C809E100127F68 /* RYTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 83C8940A19C809E100127F68 /* RYTagList.m */; }; - 83CA11F81995CD23002610E8 /* FLEXArgumentInputColorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA118F1995CD23002610E8 /* FLEXArgumentInputColorView.m */; }; - 83CA11F91995CD23002610E8 /* FLEXArgumentInputFontsPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11911995CD23002610E8 /* FLEXArgumentInputFontsPickerView.m */; }; - 83CA11FA1995CD23002610E8 /* FLEXArgumentInputFontView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11931995CD23002610E8 /* FLEXArgumentInputFontView.m */; }; - 83CA11FB1995CD23002610E8 /* FLEXArgumentInputJSONObjectView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11951995CD23002610E8 /* FLEXArgumentInputJSONObjectView.m */; }; - 83CA11FC1995CD23002610E8 /* FLEXArgumentInputNotSupportedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11971995CD23002610E8 /* FLEXArgumentInputNotSupportedView.m */; }; - 83CA11FD1995CD23002610E8 /* FLEXArgumentInputNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11991995CD23002610E8 /* FLEXArgumentInputNumberView.m */; }; - 83CA11FE1995CD23002610E8 /* FLEXArgumentInputStringView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA119B1995CD23002610E8 /* FLEXArgumentInputStringView.m */; }; - 83CA11FF1995CD23002610E8 /* FLEXArgumentInputStructView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA119D1995CD23002610E8 /* FLEXArgumentInputStructView.m */; }; - 83CA12001995CD23002610E8 /* FLEXArgumentInputSwitchView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA119F1995CD23002610E8 /* FLEXArgumentInputSwitchView.m */; }; - 83CA12011995CD23002610E8 /* FLEXArgumentInputTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11A11995CD23002610E8 /* FLEXArgumentInputTextView.m */; }; - 83CA12021995CD23002610E8 /* FLEXArgumentInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11A31995CD23002610E8 /* FLEXArgumentInputView.m */; }; - 83CA12031995CD23002610E8 /* FLEXArgumentInputViewFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11A51995CD23002610E8 /* FLEXArgumentInputViewFactory.m */; }; - 83CA12041995CD23002610E8 /* FLEXDefaultEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11A71995CD23002610E8 /* FLEXDefaultEditorViewController.m */; }; - 83CA12051995CD23002610E8 /* FLEXFieldEditorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11A91995CD23002610E8 /* FLEXFieldEditorView.m */; }; - 83CA12061995CD23002610E8 /* FLEXFieldEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11AB1995CD23002610E8 /* FLEXFieldEditorViewController.m */; }; - 83CA12071995CD23002610E8 /* FLEXIvarEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11AD1995CD23002610E8 /* FLEXIvarEditorViewController.m */; }; - 83CA12081995CD23002610E8 /* FLEXMethodCallingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11AF1995CD23002610E8 /* FLEXMethodCallingViewController.m */; }; - 83CA12091995CD23002610E8 /* FLEXPropertyEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11B11995CD23002610E8 /* FLEXPropertyEditorViewController.m */; }; - 83CA120A1995CD23002610E8 /* FLEXExplorerToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11B41995CD23002610E8 /* FLEXExplorerToolbar.m */; }; - 83CA120B1995CD23002610E8 /* FLEXExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11B61995CD23002610E8 /* FLEXExplorerViewController.m */; }; - 83CA120C1995CD23002610E8 /* FLEXManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11B91995CD23002610E8 /* FLEXManager.m */; }; - 83CA120D1995CD23002610E8 /* FLEXToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11BB1995CD23002610E8 /* FLEXToolbarItem.m */; }; - 83CA120E1995CD23002610E8 /* FLEXWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11BD1995CD23002610E8 /* FLEXWindow.m */; }; - 83CA120F1995CD23002610E8 /* FLEXClassesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11C01995CD23002610E8 /* FLEXClassesTableViewController.m */; }; - 83CA12101995CD23002610E8 /* FLEXFileBrowserSearchOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11C21995CD23002610E8 /* FLEXFileBrowserSearchOperation.m */; }; - 83CA12111995CD23002610E8 /* FLEXFileBrowserTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11C41995CD23002610E8 /* FLEXFileBrowserTableViewController.m */; }; - 83CA12121995CD23002610E8 /* FLEXGlobalsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11C61995CD23002610E8 /* FLEXGlobalsTableViewController.m */; }; - 83CA12131995CD23002610E8 /* FLEXInstancesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11C81995CD23002610E8 /* FLEXInstancesTableViewController.m */; }; - 83CA12141995CD23002610E8 /* FLEXLibrariesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11CA1995CD23002610E8 /* FLEXLibrariesTableViewController.m */; }; - 83CA12151995CD23002610E8 /* FLEXLiveObjectsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11CC1995CD23002610E8 /* FLEXLiveObjectsTableViewController.m */; }; - 83CA12161995CD23002610E8 /* FLEXWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11CE1995CD23002610E8 /* FLEXWebViewController.m */; }; - 83CA12171995CD23002610E8 /* FLEXArrayExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11D11995CD23002610E8 /* FLEXArrayExplorerViewController.m */; }; - 83CA12181995CD23002610E8 /* FLEXClassExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11D31995CD23002610E8 /* FLEXClassExplorerViewController.m */; }; - 83CA12191995CD23002610E8 /* FLEXDefaultsExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11D51995CD23002610E8 /* FLEXDefaultsExplorerViewController.m */; }; - 83CA121A1995CD23002610E8 /* FLEXDescriptionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11D71995CD23002610E8 /* FLEXDescriptionTableViewCell.m */; }; - 83CA121B1995CD23002610E8 /* FLEXDictionaryExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11D91995CD23002610E8 /* FLEXDictionaryExplorerViewController.m */; }; - 83CA121C1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11DB1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.m */; }; - 83CA121D1995CD23002610E8 /* FLEXImageExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11DD1995CD23002610E8 /* FLEXImageExplorerViewController.m */; }; - 83CA121E1995CD23002610E8 /* FLEXObjectExplorerFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11DF1995CD23002610E8 /* FLEXObjectExplorerFactory.m */; }; - 83CA121F1995CD23002610E8 /* FLEXObjectExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11E11995CD23002610E8 /* FLEXObjectExplorerViewController.m */; }; - 83CA12201995CD23002610E8 /* FLEXSetExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11E31995CD23002610E8 /* FLEXSetExplorerViewController.m */; }; - 83CA12211995CD23002610E8 /* FLEXViewControllerExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11E51995CD23002610E8 /* FLEXViewControllerExplorerViewController.m */; }; - 83CA12221995CD23002610E8 /* FLEXViewExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11E71995CD23002610E8 /* FLEXViewExplorerViewController.m */; }; - 83CA12231995CD23002610E8 /* FLEXHeapEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11EA1995CD23002610E8 /* FLEXHeapEnumerator.m */; }; - 83CA12241995CD23002610E8 /* FLEXResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11EC1995CD23002610E8 /* FLEXResources.m */; }; - 83CA12251995CD23002610E8 /* FLEXRuntimeUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11EE1995CD23002610E8 /* FLEXRuntimeUtility.m */; }; - 83CA12261995CD23002610E8 /* FLEXUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11F01995CD23002610E8 /* FLEXUtility.m */; }; - 83CA12271995CD23002610E8 /* FLEXHierarchyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11F31995CD23002610E8 /* FLEXHierarchyTableViewCell.m */; }; - 83CA12281995CD23002610E8 /* FLEXHierarchyTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11F51995CD23002610E8 /* FLEXHierarchyTableViewController.m */; }; - 83CA12291995CD23002610E8 /* FLEXImagePreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA11F71995CD23002610E8 /* FLEXImagePreviewViewController.m */; }; - 83CA122D19981070002610E8 /* RYAudioDeckViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA122C19981070002610E8 /* RYAudioDeckViewController.m */; }; - 83CA123019981087002610E8 /* RYAudioDeckManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA122F19981087002610E8 /* RYAudioDeckManager.m */; }; - 83CA123319981702002610E8 /* RYAudioDeckTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CA123219981702002610E8 /* RYAudioDeckTableViewCell.m */; }; - 83CCC90E197EFCBF00FD1B4B /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8EA197EFCBF00FD1B4B /* AFHTTPRequestOperation.m */; }; - 83CCC90F197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8EC197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.m */; }; - 83CCC910197EFCBF00FD1B4B /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8EE197EFCBF00FD1B4B /* AFHTTPSessionManager.m */; }; - 83CCC911197EFCBF00FD1B4B /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8F1197EFCBF00FD1B4B /* AFNetworkReachabilityManager.m */; }; - 83CCC912197EFCBF00FD1B4B /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8F3197EFCBF00FD1B4B /* AFSecurityPolicy.m */; }; - 83CCC913197EFCBF00FD1B4B /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8F5197EFCBF00FD1B4B /* AFURLConnectionOperation.m */; }; - 83CCC914197EFCBF00FD1B4B /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8F7197EFCBF00FD1B4B /* AFURLRequestSerialization.m */; }; - 83CCC915197EFCBF00FD1B4B /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8F9197EFCBF00FD1B4B /* AFURLResponseSerialization.m */; }; - 83CCC916197EFCBF00FD1B4B /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8FB197EFCBF00FD1B4B /* AFURLSessionManager.m */; }; - 83CCC917197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC8FE197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.m */; }; - 83CCC918197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC900197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.m */; }; - 83CCC919197EFCBF00FD1B4B /* UIAlertView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC902197EFCBF00FD1B4B /* UIAlertView+AFNetworking.m */; }; - 83CCC91A197EFCBF00FD1B4B /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC904197EFCBF00FD1B4B /* UIButton+AFNetworking.m */; }; - 83CCC91B197EFCBF00FD1B4B /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC906197EFCBF00FD1B4B /* UIImageView+AFNetworking.m */; }; - 83CCC91C197EFCBF00FD1B4B /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC909197EFCBF00FD1B4B /* UIProgressView+AFNetworking.m */; }; - 83CCC91D197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC90B197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.m */; }; - 83CCC91E197EFCBF00FD1B4B /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CCC90D197EFCBF00FD1B4B /* UIWebView+AFNetworking.m */; }; - 83DBCA7B18F99E3F00262496 /* RYRiffStreamingCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83DBCA7A18F99E3F00262496 /* RYRiffStreamingCoreViewController.m */; }; - 83DC3B7819BD0EC00036AD2A /* RYRefreshControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 83DC3B7719BD0EC00036AD2A /* RYRefreshControl.m */; }; - 83E3017219C7BAEE0085F17F /* RYTagCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E3017119C7BAEE0085F17F /* RYTagCollectionViewCell.m */; }; - 83E56B651953A0A900EF054C /* RYUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E56B631953A0A900EF054C /* RYUser.m */; }; - 83E56B681953A0DA00EF054C /* RYMediaEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E56B671953A0DA00EF054C /* RYMediaEditor.m */; }; - 83EB8BA619959F5C0007837D /* DWTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 83EB8BA519959F5C0007837D /* DWTagList.m */; }; - 83ED34CE19316E5D00FEB018 /* Lato-Lig.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34CC19316E5D00FEB018 /* Lato-Lig.ttf */; }; - 83ED34CF19316E5D00FEB018 /* Lato-RegIta.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34CD19316E5D00FEB018 /* Lato-RegIta.ttf */; }; - 83ED34E81931851600FEB018 /* AppIcon29x29.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34D81931851600FEB018 /* AppIcon29x29.png */; }; - 83ED34E91931851600FEB018 /* AppIcon29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34D91931851600FEB018 /* AppIcon29x29@2x.png */; }; - 83ED34EA1931851600FEB018 /* AppIcon40x40.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DA1931851600FEB018 /* AppIcon40x40.png */; }; - 83ED34EB1931851600FEB018 /* AppIcon40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DB1931851600FEB018 /* AppIcon40x40@2x.png */; }; - 83ED34EC1931851600FEB018 /* AppIcon50x50.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DC1931851600FEB018 /* AppIcon50x50.png */; }; - 83ED34ED1931851600FEB018 /* AppIcon50x50@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DD1931851600FEB018 /* AppIcon50x50@2x.png */; }; - 83ED34EE1931851600FEB018 /* AppIcon57x57.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DE1931851600FEB018 /* AppIcon57x57.png */; }; - 83ED34EF1931851600FEB018 /* AppIcon57x57@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34DF1931851600FEB018 /* AppIcon57x57@2x.png */; }; - 83ED34F01931851600FEB018 /* AppIcon60x60.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E01931851600FEB018 /* AppIcon60x60.png */; }; - 83ED34F11931851600FEB018 /* AppIcon60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E11931851600FEB018 /* AppIcon60x60@2x.png */; }; - 83ED34F21931851600FEB018 /* AppIcon72x72.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E21931851600FEB018 /* AppIcon72x72.png */; }; - 83ED34F31931851600FEB018 /* AppIcon72x72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E31931851600FEB018 /* AppIcon72x72@2x.png */; }; - 83ED34F41931851600FEB018 /* AppIcon76x76.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E41931851600FEB018 /* AppIcon76x76.png */; }; - 83ED34F51931851600FEB018 /* AppIcon76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E51931851600FEB018 /* AppIcon76x76@2x.png */; }; - 83ED34F61931851600FEB018 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E61931851600FEB018 /* iTunesArtwork.png */; }; - 83ED34F71931851600FEB018 /* iTunesArtwork@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83ED34E71931851600FEB018 /* iTunesArtwork@2x.png */; }; - 83FA50B71931524E00F1F3A7 /* Lato-Bol.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 83FA50B51931524E00F1F3A7 /* Lato-Bol.ttf */; }; - 83FA50B81931524E00F1F3A7 /* Lato-Reg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 83FA50B61931524E00F1F3A7 /* Lato-Reg.ttf */; }; - 83FADE4519AC405200182155 /* create.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FADE4319AC405200182155 /* create.png */; }; - 83FADE4619AC405200182155 /* create@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FADE4419AC405200182155 /* create@2x.png */; }; + 831178421BB70447007C2DC0 /* RYAudioDeckPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */; settings = {ASSET_TAGS = (); }; }; + 831178431BB70448007C2DC0 /* RYAudioDeckPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */; settings = {ASSET_TAGS = (); }; }; + 831178471BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831178441BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift */; settings = {ASSET_TAGS = (); }; }; + 831178481BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831178441BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift */; settings = {ASSET_TAGS = (); }; }; + 831178491BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831178451BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 8311784A1BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831178451BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 8311784E1BB7068B007C2DC0 /* RYAudioDeckViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8311784D1BB7068B007C2DC0 /* RYAudioDeckViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 8311784F1BB7068B007C2DC0 /* RYAudioDeckViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8311784D1BB7068B007C2DC0 /* RYAudioDeckViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 838165851B9E2110002C0FDB /* BNRDynamicTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */; }; + 8381658B1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */; }; + 8381658D1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */; }; + 8381658E1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */; }; + 838165971B9E370C002C0FDB /* RYAudioDeck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165961B9E370C002C0FDB /* RYAudioDeck.swift */; }; + 838165981B9E370C002C0FDB /* RYAudioDeck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165961B9E370C002C0FDB /* RYAudioDeck.swift */; }; + 83F4EEBD1B9D3921007CF11A /* NSMutableDictionary+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */; }; + 83F4EEC01B9D3A8F007CF11A /* NSDictionary+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */; }; 83FADE4C19AC54DA00182155 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FADE4B19AC54DA00182155 /* QuartzCore.framework */; }; 83FCD13C18F907C400A493F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13B18F907C400A493F0 /* Foundation.framework */; }; 83FCD13E18F907C400A493F0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13D18F907C400A493F0 /* CoreGraphics.framework */; }; 83FCD14018F907C400A493F0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13F18F907C400A493F0 /* UIKit.framework */; }; 83FCD14618F907C400A493F0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD14418F907C400A493F0 /* InfoPlist.strings */; }; 83FCD14818F907C400A493F0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD14718F907C400A493F0 /* main.m */; }; - 83FCD14C18F907C400A493F0 /* RYAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD14B18F907C400A493F0 /* RYAppDelegate.m */; }; - 83FCD14F18F907C400A493F0 /* MainIphone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD14D18F907C400A493F0 /* MainIphone.storyboard */; }; 83FCD15718F907C400A493F0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD15618F907C400A493F0 /* Images.xcassets */; }; 83FCD15E18F907C400A493F0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD15D18F907C400A493F0 /* XCTest.framework */; }; 83FCD15F18F907C400A493F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13B18F907C400A493F0 /* Foundation.framework */; }; 83FCD16018F907C400A493F0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13F18F907C400A493F0 /* UIKit.framework */; }; 83FCD16818F907C400A493F0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD16618F907C400A493F0 /* InfoPlist.strings */; }; 83FCD16A18F907C400A493F0 /* RyffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD16918F907C400A493F0 /* RyffTests.m */; }; - 83FCD17618F909DB00A493F0 /* RYProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD17518F909DB00A493F0 /* RYProfileViewController.m */; }; - 83FCD18F18F9144100A493F0 /* RYNewsfeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD18E18F9144100A493F0 /* RYNewsfeedTableViewController.m */; }; - 83FCD1A318F921EA00A493F0 /* RYServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD1A218F921EA00A493F0 /* RYServices.m */; }; - 83FCD1A818F9393F00A493F0 /* RYStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD1A718F9393F00A493F0 /* RYStyleSheet.m */; }; - 83FCD1AB18F93E6C00A493F0 /* user.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD1AA18F93E6C00A493F0 /* user.png */; }; - 83FCD1AF18F93F5500A493F0 /* artists.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD1AC18F93F5500A493F0 /* artists.png */; }; - 83FCD1B018F93F5500A493F0 /* artists@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD1AD18F93F5500A493F0 /* artists@2x.png */; }; - 83FCD1B118F93F5500A493F0 /* user@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD1AE18F93F5500A493F0 /* user@2x.png */; }; - 83FCD1B818F9405F00A493F0 /* RYCoreTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD1B718F9405F00A493F0 /* RYCoreTabBarViewController.m */; }; - 83FCD1BB18F9413400A493F0 /* RYPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD1BA18F9413400A493F0 /* RYPost.m */; }; + 83FF51031B9E1D0500FE9E73 /* RYAddToPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */; }; + 83FF51051B9E1D3800FE9E73 /* RYNowPlayingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */; }; + 83FF51061B9E1D3D00FE9E73 /* RYNowPlayingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */; }; + 83FF51071B9E1D4000FE9E73 /* RYAddToPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */; }; + 9795D935FF6483EC5F9A5340 /* Pods_Ryff.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + EC092E28FF5A6FF568A7BCC8 /* Pods_RyffTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E251082A40810E7130987A45 /* Pods_RyffTests.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -292,408 +160,191 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 830029B71B7FB2B300666D93 /* RYRiffAudioNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffAudioNode.h; sourceTree = ""; }; - 830029B81B7FB2B300666D93 /* RYRiffAudioNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffAudioNode.m; sourceTree = ""; }; - 830029BA1B7FD17C00666D93 /* RYRiffCreateCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RYRiffCreateCollectionViewController.swift; sourceTree = ""; }; - 830029BC1B7FD3F900666D93 /* RYRiffCreateNodeCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RYRiffCreateNodeCollectionViewCell.swift; sourceTree = ""; }; - 830185F219009C3A00093EFA /* RYLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYLoginViewController.h; sourceTree = ""; }; - 830185F319009C3A00093EFA /* RYLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYLoginViewController.m; sourceTree = ""; }; - 830185FC1900AEB300093EFA /* UIColor+Hex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Hex.h"; sourceTree = ""; }; - 830185FD1900AEB300093EFA /* UIColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Hex.m"; sourceTree = ""; }; - 830185FF1900B1CD00093EFA /* tabBar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tabBar.png; sourceTree = ""; }; - 830186001900B1CD00093EFA /* tabBar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tabBar@2x.png"; sourceTree = ""; }; - 83082FDB19B4F303000AFACB /* airplayIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = airplayIcon.png; sourceTree = ""; }; - 83082FDC19B4F303000AFACB /* airplayIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "airplayIcon@2x.png"; sourceTree = ""; }; - 83082FDF19B52256000AFACB /* sliderSmall.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sliderSmall.png; sourceTree = ""; }; - 83082FE019B52256000AFACB /* sliderSmall@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sliderSmall@2x.png"; sourceTree = ""; }; - 83082FE619B55DF4000AFACB /* RYTagFeedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTagFeedViewController.h; sourceTree = ""; }; - 83082FE719B55DF4000AFACB /* RYTagFeedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTagFeedViewController.m; sourceTree = ""; }; - 83082FE919B5652D000AFACB /* RYSearchTypeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYSearchTypeTableViewCell.h; sourceTree = ""; }; - 83082FEA19B5652D000AFACB /* RYSearchTypeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYSearchTypeTableViewCell.m; sourceTree = ""; }; - 8309553719CA5EAC000A41B3 /* RYRiffDetailsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffDetailsCell.xib; sourceTree = ""; }; - 830BBCAE18F9F54900A9C53F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SSKeychain.strings; sourceTree = ""; }; - 830BBCAF18F9F54900A9C53F /* SSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKeychain.h; sourceTree = ""; }; - 830BBCB018F9F54900A9C53F /* SSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSKeychain.m; sourceTree = ""; }; - 830BBCB118F9F54900A9C53F /* SSKeychainQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKeychainQuery.h; sourceTree = ""; }; - 830BBCB218F9F54900A9C53F /* SSKeychainQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSKeychainQuery.m; sourceTree = ""; }; - 830BBCB718FA055900A9C53F /* MBProgressHUD-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-Prefix.pch"; sourceTree = ""; }; - 830BBCB818FA055900A9C53F /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; - 830BBCB918FA055900A9C53F /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; - 830BBCC118FA081600A9C53F /* checkmark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkmark.png; sourceTree = ""; }; - 830BBCC218FA081600A9C53F /* checkmark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkmark@2x.png"; sourceTree = ""; }; - 830BBCC618FA0A5800A9C53F /* RYLocationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYLocationServices.h; sourceTree = ""; }; - 830BBCC718FA0A5800A9C53F /* RYLocationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYLocationServices.m; sourceTree = ""; }; + 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ryff.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Ryff/Pods-Ryff.debug.xcconfig"; sourceTree = ""; }; + 3F15B36E1B9A2EA6009F3790 /* SwiftCompatability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftCompatability.h; sourceTree = ""; }; + 3F24D8301B9B4ED300E78B05 /* RYNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNavigationController.h; path = Classes/RYNavigationController.h; sourceTree = ""; }; + 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNavigationController.m; path = Classes/RYNavigationController.m; sourceTree = ""; }; + 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYFadingVisualEffectView.swift; path = Classes/RYFadingVisualEffectView.swift; sourceTree = ""; }; + 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UILayoutPriority.swift; path = Categories/UILayoutPriority.swift; sourceTree = ""; }; + 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYUserProfileTableViewCell.swift; path = Classes/RYUserProfileTableViewCell.swift; sourceTree = ""; }; + 3F387B541B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYAudioDeckTableViewCell.h; path = Classes/RYAudioDeckTableViewCell.h; sourceTree = ""; }; + 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYAudioDeckTableViewCell.m; path = Classes/RYAudioDeckTableViewCell.m; sourceTree = ""; }; + 3F387B561B9B3C2B00B5CC74 /* RYAudioDeckViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYAudioDeckViewController.h; path = Classes/RYAudioDeckViewController.h; sourceTree = ""; }; + 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYAudioDeckViewController.m; path = Classes/RYAudioDeckViewController.m; sourceTree = ""; }; + 3F387B581B9B3C2B00B5CC74 /* RYCorePageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYCorePageViewController.h; path = Classes/RYCorePageViewController.h; sourceTree = ""; }; + 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYCorePageViewController.m; path = Classes/RYCorePageViewController.m; sourceTree = ""; }; + 3F387B5A1B9B3C2B00B5CC74 /* RYCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYCoreViewController.h; path = Classes/RYCoreViewController.h; sourceTree = ""; }; + 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYCoreViewController.m; path = Classes/RYCoreViewController.m; sourceTree = ""; }; + 3F387B5C1B9B3C2B00B5CC74 /* RYDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDataManager.h; path = Classes/RYDataManager.h; sourceTree = ""; }; + 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDataManager.m; path = Classes/RYDataManager.m; sourceTree = ""; }; + 3F387B5E1B9B3C2B00B5CC74 /* RYDiscoverServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDiscoverServices.h; path = Classes/RYDiscoverServices.h; sourceTree = ""; }; + 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDiscoverServices.m; path = Classes/RYDiscoverServices.m; sourceTree = ""; }; + 3F387B601B9B3C2B00B5CC74 /* RYDiscoverViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDiscoverViewController.h; path = Classes/RYDiscoverViewController.h; sourceTree = ""; }; + 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDiscoverViewController.m; path = Classes/RYDiscoverViewController.m; sourceTree = ""; }; + 3F387B621B9B3C2B00B5CC74 /* RYGroupTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYGroupTableViewCell.h; path = Classes/RYGroupTableViewCell.h; sourceTree = ""; }; + 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYGroupTableViewCell.m; path = Classes/RYGroupTableViewCell.m; sourceTree = ""; }; + 3F387B641B9B3C2B00B5CC74 /* RYLoadMoreControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoadMoreControl.h; path = Classes/RYLoadMoreControl.h; sourceTree = ""; }; + 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoadMoreControl.m; path = Classes/RYLoadMoreControl.m; sourceTree = ""; }; + 3F387B661B9B3C2B00B5CC74 /* RYLocationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLocationServices.h; path = Classes/RYLocationServices.h; sourceTree = ""; }; + 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLocationServices.m; path = Classes/RYLocationServices.m; sourceTree = ""; }; + 3F387B681B9B3C2B00B5CC74 /* RYLoginTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoginTableViewCell.h; path = Classes/RYLoginTableViewCell.h; sourceTree = ""; }; + 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoginTableViewCell.m; path = Classes/RYLoginTableViewCell.m; sourceTree = ""; }; + 3F387B6A1B9B3C2B00B5CC74 /* RYLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoginViewController.h; path = Classes/RYLoginViewController.h; sourceTree = ""; }; + 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoginViewController.m; path = Classes/RYLoginViewController.m; sourceTree = ""; }; + 3F387B6C1B9B3C2B00B5CC74 /* RYMediaEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYMediaEditor.h; path = Classes/RYMediaEditor.h; sourceTree = ""; }; + 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYMediaEditor.m; path = Classes/RYMediaEditor.m; sourceTree = ""; }; + 3F387B6E1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedContainerViewController.h; path = Classes/RYNewsfeedContainerViewController.h; sourceTree = ""; }; + 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedContainerViewController.m; path = Classes/RYNewsfeedContainerViewController.m; sourceTree = ""; }; + 3F387B701B9B3C2B00B5CC74 /* RYNewsfeedDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedDataSource.h; path = Classes/RYNewsfeedDataSource.h; sourceTree = ""; }; + 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedDataSource.m; path = Classes/RYNewsfeedDataSource.m; sourceTree = ""; }; + 3F387B721B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedNavigationController.h; path = Classes/RYNewsfeedNavigationController.h; sourceTree = ""; }; + 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedNavigationController.m; path = Classes/RYNewsfeedNavigationController.m; sourceTree = ""; }; + 3F387B741B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedTableViewController.h; path = Classes/RYNewsfeedTableViewController.h; sourceTree = ""; }; + 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedTableViewController.m; path = Classes/RYNewsfeedTableViewController.m; sourceTree = ""; }; + 3F387B761B9B3C2B00B5CC74 /* RYNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotification.h; path = Classes/RYNotification.h; sourceTree = ""; }; + 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotification.m; path = Classes/RYNotification.m; sourceTree = ""; }; + 3F387B781B9B3C2B00B5CC74 /* RYNotificationsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsManager.h; path = Classes/RYNotificationsManager.h; sourceTree = ""; }; + 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsManager.m; path = Classes/RYNotificationsManager.m; sourceTree = ""; }; + 3F387B7A1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsTableViewCell.h; path = Classes/RYNotificationsTableViewCell.h; sourceTree = ""; }; + 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsTableViewCell.m; path = Classes/RYNotificationsTableViewCell.m; sourceTree = ""; }; + 3F387B7C1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsTableViewController.h; path = Classes/RYNotificationsTableViewController.h; sourceTree = ""; }; + 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsTableViewController.m; path = Classes/RYNotificationsTableViewController.m; sourceTree = ""; }; + 3F387B7E1B9B3C2B00B5CC74 /* RYPlayControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPlayControl.h; path = Classes/RYPlayControl.h; sourceTree = ""; }; + 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPlayControl.m; path = Classes/RYPlayControl.m; sourceTree = ""; }; + 3F387B801B9B3C2B00B5CC74 /* RYPost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPost.h; path = Classes/RYPost.h; sourceTree = ""; }; + 3F387B811B9B3C2B00B5CC74 /* RYPost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPost.m; path = Classes/RYPost.m; sourceTree = ""; }; + 3F387B821B9B3C2B00B5CC74 /* RYPostsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPostsDataSource.h; path = Classes/RYPostsDataSource.h; sourceTree = ""; }; + 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPostsDataSource.m; path = Classes/RYPostsDataSource.m; sourceTree = ""; }; + 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostsViewController.swift; path = Classes/RYPostsViewController.swift; sourceTree = ""; }; + 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostTableViewCell.swift; path = Classes/RYPostTableViewCell.swift; sourceTree = ""; }; + 3F387B861B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYProfileInfoTableViewCell.h; path = Classes/RYProfileInfoTableViewCell.h; sourceTree = ""; }; + 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYProfileInfoTableViewCell.m; path = Classes/RYProfileInfoTableViewCell.m; sourceTree = ""; }; + 3F387B891B9B3C2B00B5CC74 /* RYProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYProfileViewController.h; path = Classes/RYProfileViewController.h; sourceTree = ""; }; + 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYProfileViewController.m; path = Classes/RYProfileViewController.m; sourceTree = ""; }; + 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYProfileViewController.swift; path = Classes/RYProfileViewController.swift; sourceTree = ""; }; + 3F387B8C1B9B3C2B00B5CC74 /* RYRefreshControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRefreshControl.h; path = Classes/RYRefreshControl.h; sourceTree = ""; }; + 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRefreshControl.m; path = Classes/RYRefreshControl.m; sourceTree = ""; }; + 3F387B8E1B9B3C2B00B5CC74 /* RYRegistrationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRegistrationServices.h; path = Classes/RYRegistrationServices.h; sourceTree = ""; }; + 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRegistrationServices.m; path = Classes/RYRegistrationServices.m; sourceTree = ""; }; + 3F387B901B9B3C2B00B5CC74 /* RYRiffAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffAudioEngine.h; path = Classes/RYRiffAudioEngine.h; sourceTree = ""; }; + 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffAudioEngine.m; path = Classes/RYRiffAudioEngine.m; sourceTree = ""; }; + 3F387B921B9B3C2B00B5CC74 /* RYRiffAudioNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffAudioNode.h; path = Classes/RYRiffAudioNode.h; sourceTree = ""; }; + 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffAudioNode.m; path = Classes/RYRiffAudioNode.m; sourceTree = ""; }; + 3F387B941B9B3C2B00B5CC74 /* RYRiffCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCell.h; path = Classes/RYRiffCell.h; sourceTree = ""; }; + 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCell.m; path = Classes/RYRiffCell.m; sourceTree = ""; }; + 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYRiffMixerViewController.swift; path = Classes/RYRiffMixerViewController.swift; sourceTree = ""; }; + 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYRiffMixerNodeCollectionViewCell.swift; path = Classes/RYRiffMixerNodeCollectionViewCell.swift; sourceTree = ""; }; + 3F387B981B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCreateOldViewController.h; path = Classes/RYRiffCreateOldViewController.h; sourceTree = ""; }; + 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCreateOldViewController.m; path = Classes/RYRiffCreateOldViewController.m; sourceTree = ""; }; + 3F387B9A1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCreateTableViewCell.h; path = Classes/RYRiffCreateTableViewCell.h; sourceTree = ""; }; + 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCreateTableViewCell.m; path = Classes/RYRiffCreateTableViewCell.m; sourceTree = ""; }; + 3F387B9C1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffDetailsTableViewCell.h; path = Classes/RYRiffDetailsTableViewCell.h; sourceTree = ""; }; + 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffDetailsTableViewCell.m; path = Classes/RYRiffDetailsTableViewCell.m; sourceTree = ""; }; + 3F387B9E1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffDetailsViewController.h; path = Classes/RYRiffDetailsViewController.h; sourceTree = ""; }; + 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffDetailsViewController.m; path = Classes/RYRiffDetailsViewController.m; sourceTree = ""; }; + 3F387BA01B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffStreamingCoreViewController.h; path = Classes/RYRiffStreamingCoreViewController.h; sourceTree = ""; }; + 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffStreamingCoreViewController.m; path = Classes/RYRiffStreamingCoreViewController.m; sourceTree = ""; }; + 3F387BA21B9B3C2B00B5CC74 /* RYRiffStreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffStreamViewController.h; path = Classes/RYRiffStreamViewController.h; sourceTree = ""; }; + 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffStreamViewController.m; path = Classes/RYRiffStreamViewController.m; sourceTree = ""; }; + 3F387BA41B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYSearchTypeTableViewCell.h; path = Classes/RYSearchTypeTableViewCell.h; sourceTree = ""; }; + 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYSearchTypeTableViewCell.m; path = Classes/RYSearchTypeTableViewCell.m; sourceTree = ""; }; + 3F387BA61B9B3C2B00B5CC74 /* RYServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYServices.h; path = Classes/RYServices.h; sourceTree = ""; }; + 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYServices.m; path = Classes/RYServices.m; sourceTree = ""; }; + 3F387BA81B9B3C2B00B5CC74 /* RYSocialTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYSocialTextView.h; path = Classes/RYSocialTextView.h; sourceTree = ""; }; + 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYSocialTextView.m; path = Classes/RYSocialTextView.m; sourceTree = ""; }; + 3F387BAA1B9B3C2B00B5CC74 /* RYStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYStyleSheet.h; path = Classes/RYStyleSheet.h; sourceTree = ""; }; + 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYStyleSheet.m; path = Classes/RYStyleSheet.m; sourceTree = ""; }; + 3F387BAC1B9B3C2B00B5CC74 /* RYTabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTabBarViewController.h; path = Classes/RYTabBarViewController.h; sourceTree = ""; }; + 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTabBarViewController.m; path = Classes/RYTabBarViewController.m; sourceTree = ""; }; + 3F387BAE1B9B3C2B00B5CC74 /* RYTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTag.h; path = Classes/RYTag.h; sourceTree = ""; }; + 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTag.m; path = Classes/RYTag.m; sourceTree = ""; }; + 3F387BB01B9B3C2B00B5CC74 /* RYTagCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagCollectionViewCell.h; path = Classes/RYTagCollectionViewCell.h; sourceTree = ""; }; + 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagCollectionViewCell.m; path = Classes/RYTagCollectionViewCell.m; sourceTree = ""; }; + 3F387BB21B9B3C2B00B5CC74 /* RYTagFeedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagFeedViewController.h; path = Classes/RYTagFeedViewController.h; sourceTree = ""; }; + 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagFeedViewController.m; path = Classes/RYTagFeedViewController.m; sourceTree = ""; }; + 3F387BB41B9B3C2B00B5CC74 /* RYTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagList.h; path = Classes/RYTagList.h; sourceTree = ""; }; + 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagList.m; path = Classes/RYTagList.m; sourceTree = ""; }; + 3F387BB61B9B3C2B00B5CC74 /* RYTagListHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagListHeaderView.h; path = Classes/RYTagListHeaderView.h; sourceTree = ""; }; + 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagListHeaderView.m; path = Classes/RYTagListHeaderView.m; sourceTree = ""; }; + 3F387BB81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTrackDownloadTableViewCell.h; path = Classes/RYTrackDownloadTableViewCell.h; sourceTree = ""; }; + 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTrackDownloadTableViewCell.m; path = Classes/RYTrackDownloadTableViewCell.m; sourceTree = ""; }; + 3F387BBA1B9B3C2B00B5CC74 /* RYUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUser.h; path = Classes/RYUser.h; sourceTree = ""; }; + 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUser.m; path = Classes/RYUser.m; sourceTree = ""; }; + 3F387BBC1B9B3C2B00B5CC74 /* RYUserFeedDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserFeedDataSource.h; path = Classes/RYUserFeedDataSource.h; sourceTree = ""; }; + 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserFeedDataSource.m; path = Classes/RYUserFeedDataSource.m; sourceTree = ""; }; + 3F387BBE1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserListCollectionViewCell.h; path = Classes/RYUserListCollectionViewCell.h; sourceTree = ""; }; + 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserListCollectionViewCell.m; path = Classes/RYUserListCollectionViewCell.m; sourceTree = ""; }; + 3F387BC01B9B3C2B00B5CC74 /* RYUserListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserListViewController.h; path = Classes/RYUserListViewController.h; sourceTree = ""; }; + 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserListViewController.m; path = Classes/RYUserListViewController.m; sourceTree = ""; }; + 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RiffCreate.storyboard; sourceTree = ""; }; + 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCell.xib; sourceTree = ""; }; + 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCellAvatar.xib; sourceTree = ""; }; + 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffDetailsCell.xib; sourceTree = ""; }; + 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Bol.ttf"; path = "Style/Lato-Bol.ttf"; sourceTree = ""; }; + 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Lig.ttf"; path = "Style/Lato-Lig.ttf"; sourceTree = ""; }; + 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Reg.ttf"; path = "Style/Lato-Reg.ttf"; sourceTree = ""; }; + 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-RegIta.ttf"; path = "Style/Lato-RegIta.ttf"; sourceTree = ""; }; + 3F387C201B9B3FB200B5CC74 /* NSObject+block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+block.h"; path = "Categories/NSObject+block.h"; sourceTree = ""; }; + 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSObject+block.m"; path = "Categories/NSObject+block.m"; sourceTree = ""; }; + 3F387C221B9B3FB200B5CC74 /* UIColor+Hex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIColor+Hex.h"; path = "Categories/UIColor+Hex.h"; sourceTree = ""; }; + 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIColor+Hex.m"; path = "Categories/UIColor+Hex.m"; sourceTree = ""; }; + 3F387C241B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIFontDescriptor+RYCustomFont.h"; path = "Categories/UIFontDescriptor+RYCustomFont.h"; sourceTree = ""; }; + 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIFontDescriptor+RYCustomFont.m"; path = "Categories/UIFontDescriptor+RYCustomFont.m"; sourceTree = ""; }; + 3F387C261B9B3FB200B5CC74 /* UIImage+Color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Color.h"; path = "Categories/UIImage+Color.h"; sourceTree = ""; }; + 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Color.m"; path = "Categories/UIImage+Color.m"; sourceTree = ""; }; + 3F387C281B9B3FB200B5CC74 /* UIImage+Size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Size.h"; path = "Categories/UIImage+Size.h"; sourceTree = ""; }; + 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Size.m"; path = "Categories/UIImage+Size.m"; sourceTree = ""; }; + 3F387C2A1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImagePickerController+Orientations.h"; path = "Categories/UIImagePickerController+Orientations.h"; sourceTree = ""; }; + 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+Orientations.m"; path = "Categories/UIImagePickerController+Orientations.m"; sourceTree = ""; }; + 3F387C2C1B9B3FB200B5CC74 /* UIView+Styling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+Styling.h"; path = "Categories/UIView+Styling.h"; sourceTree = ""; }; + 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+Styling.m"; path = "Categories/UIView+Styling.m"; sourceTree = ""; }; + 3F387C2E1B9B3FB200B5CC74 /* UIViewController+Extras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+Extras.h"; path = "Categories/UIViewController+Extras.h"; sourceTree = ""; }; + 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+Extras.m"; path = "Categories/UIViewController+Extras.m"; sourceTree = ""; }; + 3F387C301B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+RYSocialTransitions.h"; path = "Categories/UIViewController+RYSocialTransitions.h"; sourceTree = ""; }; + 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+RYSocialTransitions.m"; path = "Categories/UIViewController+RYSocialTransitions.m"; sourceTree = ""; }; + 3FE76E421B9B40BB00099CF5 /* BlockAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockAlertView.h; sourceTree = ""; }; + 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlockAlertView.m; sourceTree = ""; }; + 3FE76E451B9B40BB00099CF5 /* FDWaveformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FDWaveformView.h; sourceTree = ""; }; + 3FE76E461B9B40BB00099CF5 /* FDWaveformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDWaveformView.m; sourceTree = ""; }; + 3FE76E4A1B9B40DF00099CF5 /* DWTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWTagList.h; sourceTree = ""; }; + 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWTagList.m; sourceTree = ""; }; + 3FE76E4E1B9B40F300099CF5 /* PXAlertView+Customization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PXAlertView+Customization.h"; sourceTree = ""; }; + 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PXAlertView+Customization.m"; sourceTree = ""; }; + 3FE76E501B9B40F300099CF5 /* PXAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PXAlertView.h; sourceTree = ""; }; + 3FE76E511B9B40F300099CF5 /* PXAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PXAlertView.m; sourceTree = ""; }; + 3FE76E561B9B40FF00099CF5 /* BNRDynamicTypeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNRDynamicTypeManager.h; sourceTree = ""; }; + 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BNRDynamicTypeManager.m; sourceTree = ""; }; + 3FE76E591B9B411C00099CF5 /* RYAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYAppDelegate.h; sourceTree = ""; }; + 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYAppDelegate.m; sourceTree = ""; }; + 3FE76E5D1B9B412E00099CF5 /* CRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRFilter.h; sourceTree = ""; }; + 3FE76E5E1B9B412E00099CF5 /* Crittercism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Crittercism.h; sourceTree = ""; }; + 3FE76E5F1B9B412E00099CF5 /* CrittercismDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrittercismDelegate.h; sourceTree = ""; }; + 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = dsym_upload.sh; sourceTree = ""; }; + 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libCrittercism_v4_3_7.a; sourceTree = ""; }; + 3FE76E681B9B443900099CF5 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostTextView.swift; path = Classes/RYPostTextView.swift; sourceTree = ""; }; + 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYStarredView.swift; path = Classes/RYStarredView.swift; sourceTree = ""; }; + 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostDetailsViewController.swift; path = Classes/RYPostDetailsViewController.swift; sourceTree = ""; }; + 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Transitions.swift"; path = "Categories/UIViewController+Transitions.swift"; sourceTree = ""; }; + 3FF2A4941B9CD1A000EBF74D /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 3FF2A49C1B9CDF4F00EBF74D /* Ryff-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Ryff-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; + 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "KRLCollectionViewGridLayout+Ryff.swift"; path = "Categories/KRLCollectionViewGridLayout+Ryff.swift"; sourceTree = ""; }; + 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ryff.release.xcconfig"; path = "Pods/Target Support Files/Pods-Ryff/Pods-Ryff.release.xcconfig"; sourceTree = ""; }; + 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RyffTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.release.xcconfig"; sourceTree = ""; }; + 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RyffTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.debug.xcconfig"; sourceTree = ""; }; 830BBCC918FA0C2300A9C53F /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - 830BBCD018FA142000A9C53F /* BlockAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockAlertView.h; sourceTree = ""; }; - 830BBCD118FA142000A9C53F /* BlockAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlockAlertView.m; sourceTree = ""; }; - 830BBCD718FA196300A9C53F /* userBig.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = userBig.png; sourceTree = ""; }; - 830BBCD818FA196300A9C53F /* userBig@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "userBig@2x.png"; sourceTree = ""; }; - 830BBCDB18FA401700A9C53F /* friend.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = friend.png; sourceTree = ""; }; - 830BBCDC18FA401700A9C53F /* friend@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "friend@2x.png"; sourceTree = ""; }; - 830BBCE318FA57F200A9C53F /* RYCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYCoreViewController.h; path = ../UI/Custom/RYCoreViewController.h; sourceTree = ""; }; - 830BBCE418FA57F200A9C53F /* RYCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYCoreViewController.m; path = ../UI/Custom/RYCoreViewController.m; sourceTree = ""; }; - 830BBCE618FA589F00A9C53F /* RYCorePageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYCorePageViewController.h; sourceTree = ""; }; - 830BBCE718FA589F00A9C53F /* RYCorePageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYCorePageViewController.m; sourceTree = ""; }; - 8310F5A81981F92300250172 /* RYPlayControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYPlayControl.h; sourceTree = ""; }; - 8310F5A91981F92300250172 /* RYPlayControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYPlayControl.m; sourceTree = ""; }; - 8312628B19AD120D00532CA3 /* RYSocialTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYSocialTextView.h; sourceTree = ""; }; - 8312628C19AD120D00532CA3 /* RYSocialTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYSocialTextView.m; sourceTree = ""; }; - 831A8891199EEEDD00C44CED /* next.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next.png; sourceTree = ""; }; - 831A8892199EEEDD00C44CED /* next@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "next@2x.png"; sourceTree = ""; }; - 831A8893199EEEDD00C44CED /* pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause.png; sourceTree = ""; }; - 831A8894199EEEDD00C44CED /* pause@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pause@2x.png"; sourceTree = ""; }; - 831A8895199EEEDD00C44CED /* play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play.png; sourceTree = ""; }; - 831A8896199EEEDD00C44CED /* play@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play@2x.png"; sourceTree = ""; }; - 831A8897199EEEDD00C44CED /* playing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = playing.png; sourceTree = ""; }; - 831A8898199EEEDD00C44CED /* playing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "playing@2x.png"; sourceTree = ""; }; - 831A8899199EEEDD00C44CED /* plus.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = plus.png; sourceTree = ""; }; - 831A889A199EEEDD00C44CED /* plus@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "plus@2x.png"; sourceTree = ""; }; - 831A889B199EEEDD00C44CED /* remix.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remix.png; sourceTree = ""; }; - 831A889C199EEEDD00C44CED /* remix@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "remix@2x.png"; sourceTree = ""; }; - 831A889D199EEEDD00C44CED /* rss.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = rss.png; sourceTree = ""; }; - 831A889E199EEEDD00C44CED /* rss@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rss@2x.png"; sourceTree = ""; }; - 831A889F199EEEDD00C44CED /* star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = star.png; sourceTree = ""; }; - 831A88A0199EEEDD00C44CED /* star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "star@2x.png"; sourceTree = ""; }; - 831A88A1199EEEDD00C44CED /* stream.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stream.png; sourceTree = ""; }; - 831A88A2199EEEDD00C44CED /* stream@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stream@2x.png"; sourceTree = ""; }; - 831A88A3199EEEDD00C44CED /* tag.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tag.png; sourceTree = ""; }; - 831A88A4199EEEDD00C44CED /* tag@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tag@2x.png"; sourceTree = ""; }; - 831A88A5199EEEDD00C44CED /* upvote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = upvote.png; sourceTree = ""; }; - 831A88A6199EEEDD00C44CED /* upvote@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "upvote@2x.png"; sourceTree = ""; }; - 831A88A7199EEEDD00C44CED /* x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = x.png; sourceTree = ""; }; - 831A88A8199EEEDD00C44CED /* x@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "x@2x.png"; sourceTree = ""; }; - 831B96061964DEC6003A8616 /* RYDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYDataManager.h; sourceTree = ""; }; - 831B96071964DEC6003A8616 /* RYDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYDataManager.m; sourceTree = ""; }; - 831B96091964E428003A8616 /* RYTrackDownloadTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTrackDownloadTableViewCell.h; sourceTree = ""; }; - 831B960A1964E428003A8616 /* RYTrackDownloadTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTrackDownloadTableViewCell.m; sourceTree = ""; }; - 831E5FF819A03269007F3C31 /* RYNewsfeedNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNewsfeedNavigationController.h; sourceTree = ""; }; - 831E5FF919A03269007F3C31 /* RYNewsfeedNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNewsfeedNavigationController.m; sourceTree = ""; }; - 8322308F19AFFCC200C60033 /* sliderFull.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sliderFull.png; sourceTree = ""; }; - 8322309019AFFCC200C60033 /* sliderFull@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sliderFull@2x.png"; sourceTree = ""; }; - 8322309119AFFCC200C60033 /* sliderSeek.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sliderSeek.png; sourceTree = ""; }; - 8322309219AFFCC200C60033 /* sliderSeek@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sliderSeek@2x.png"; sourceTree = ""; }; - 8322309819B00D0200C60033 /* PXAlertView+Customization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PXAlertView+Customization.h"; sourceTree = ""; }; - 8322309919B00D0200C60033 /* PXAlertView+Customization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PXAlertView+Customization.m"; sourceTree = ""; }; - 8322309A19B00D0200C60033 /* PXAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PXAlertView.h; sourceTree = ""; }; - 8322309B19B00D0200C60033 /* PXAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PXAlertView.m; sourceTree = ""; }; - 832658A419BA416C0047D93B /* RYRiffCellAvatar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCellAvatar.xib; sourceTree = ""; }; - 832B89F71B32367700881AD8 /* FDWaveformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FDWaveformView.h; sourceTree = ""; }; - 832B89F81B32367700881AD8 /* FDWaveformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDWaveformView.m; sourceTree = ""; }; - 83302D8D19C7A20B008C5A54 /* RYTagListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTagListViewController.h; sourceTree = ""; }; - 83302D8E19C7A20B008C5A54 /* RYTagListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTagListViewController.m; sourceTree = ""; }; - 83302D9319C7A972008C5A54 /* RYDiscoverServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYDiscoverServices.h; sourceTree = ""; }; - 83302D9419C7A972008C5A54 /* RYDiscoverServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYDiscoverServices.m; sourceTree = ""; }; - 83360CCF19B6A7EB00136FCB /* RYNotificationsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNotificationsTableViewController.h; sourceTree = ""; }; - 83360CD019B6A7EB00136FCB /* RYNotificationsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNotificationsTableViewController.m; sourceTree = ""; }; - 83360CD219B6A7FF00136FCB /* RYNotificationsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNotificationsTableViewCell.h; sourceTree = ""; }; - 83360CD319B6A7FF00136FCB /* RYNotificationsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNotificationsTableViewCell.m; sourceTree = ""; }; - 83360CD819B6B76500136FCB /* RYNotificationsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNotificationsManager.h; sourceTree = ""; }; - 83360CD919B6B76500136FCB /* RYNotificationsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNotificationsManager.m; sourceTree = ""; }; - 83360CDB19B6B84E00136FCB /* RYNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNotification.h; sourceTree = ""; }; - 83360CDC19B6B84E00136FCB /* RYNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNotification.m; sourceTree = ""; }; - 833FC1AC1989E406002491C8 /* RYRiffDetailsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffDetailsViewController.h; path = ../RYRiffDetailsViewController.h; sourceTree = ""; }; - 833FC1AD1989E406002491C8 /* RYRiffDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffDetailsViewController.m; path = ../RYRiffDetailsViewController.m; sourceTree = ""; }; - 833FC1B01989E4B0002491C8 /* RYRiffDetailsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffDetailsTableViewCell.h; sourceTree = ""; }; - 833FC1B11989E4B0002491C8 /* RYRiffDetailsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffDetailsTableViewCell.m; sourceTree = ""; }; - 834A0B4D19BED5A700E4D7E9 /* RYRegistrationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRegistrationServices.h; sourceTree = ""; }; - 834A0B4E19BED5A700E4D7E9 /* RYRegistrationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRegistrationServices.m; sourceTree = ""; }; - 834FEC0C19897E4B00C3D9B9 /* RYRiffCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCell.xib; sourceTree = ""; }; - 834FEC0E19897E6600C3D9B9 /* RYRiffCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffCell.h; sourceTree = ""; }; - 834FEC0F19897E6600C3D9B9 /* RYRiffCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffCell.m; sourceTree = ""; }; - 8355167019512CF100CF2C23 /* RYRiffCreateOldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffCreateOldViewController.h; sourceTree = ""; }; - 8355167119512CF100CF2C23 /* RYRiffCreateOldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffCreateOldViewController.m; sourceTree = ""; }; - 835516741951315F00CF2C23 /* RYRiffCreateTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffCreateTableViewCell.h; sourceTree = ""; }; - 835516751951315F00CF2C23 /* RYRiffCreateTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffCreateTableViewCell.m; sourceTree = ""; }; - 835E1AB31A4943D600FC679B /* RYRiffAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffAudioEngine.h; sourceTree = ""; }; - 835E1AB41A4943D600FC679B /* RYRiffAudioEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffAudioEngine.m; sourceTree = ""; }; - 835E1E0019D21A50007EBD74 /* CRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRFilter.h; sourceTree = ""; }; - 835E1E0119D21A50007EBD74 /* Crittercism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Crittercism.h; sourceTree = ""; }; - 835E1E0219D21A50007EBD74 /* CrittercismDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrittercismDelegate.h; sourceTree = ""; }; - 835E1E0319D21A50007EBD74 /* dsym_upload.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = dsym_upload.sh; sourceTree = ""; }; - 835E1E0419D21A50007EBD74 /* libCrittercism_v4_3_7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libCrittercism_v4_3_7.a; sourceTree = ""; }; - 835E1E0819D2320D007EBD74 /* RYLoadMoreControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYLoadMoreControl.h; sourceTree = ""; }; - 835E1E0919D2320D007EBD74 /* RYLoadMoreControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYLoadMoreControl.m; sourceTree = ""; }; - 835E482D19AE634B002A3AC2 /* options.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = options.png; sourceTree = ""; }; - 835E482E19AE634B002A3AC2 /* options@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "options@2x.png"; sourceTree = ""; }; - 836461AC195FBF05005938F5 /* RYLoginTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYLoginTableViewCell.h; sourceTree = ""; }; - 836461AD195FBF05005938F5 /* RYLoginTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYLoginTableViewCell.m; sourceTree = ""; }; - 836F483819A04BAB00E948BE /* NSObject+block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+block.h"; sourceTree = ""; }; - 836F483919A04BAB00E948BE /* NSObject+block.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+block.m"; sourceTree = ""; }; - 836F483A19A04BAB00E948BE /* UIImage+Color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Color.h"; sourceTree = ""; }; - 836F483B19A04BAB00E948BE /* UIImage+Color.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Color.m"; sourceTree = ""; }; - 836F483C19A04BAB00E948BE /* UIImage+Thumbnail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Thumbnail.h"; sourceTree = ""; }; - 836F483D19A04BAB00E948BE /* UIImage+Thumbnail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Thumbnail.m"; sourceTree = ""; }; - 836F483E19A04BAB00E948BE /* UIView+Styling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Styling.h"; sourceTree = ""; }; - 836F483F19A04BAB00E948BE /* UIView+Styling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Styling.m"; sourceTree = ""; }; - 836F484019A04BAB00E948BE /* UIViewController+Extras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+Extras.h"; sourceTree = ""; }; - 836F484119A04BAB00E948BE /* UIViewController+Extras.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+Extras.m"; sourceTree = ""; }; - 837367EE19A8344600D9559D /* globe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = globe.png; sourceTree = ""; }; - 837367EF19A8344600D9559D /* globe@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "globe@2x.png"; sourceTree = ""; }; - 837367F019A8344600D9559D /* location.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = location.png; sourceTree = ""; }; - 837367F119A8344600D9559D /* location@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "location@2x.png"; sourceTree = ""; }; - 837367F219A8344600D9559D /* message.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = message.png; sourceTree = ""; }; - 837367F319A8344600D9559D /* message@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "message@2x.png"; sourceTree = ""; }; - 837367F419A8344600D9559D /* notification.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = notification.png; sourceTree = ""; }; - 837367F519A8344600D9559D /* notification@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "notification@2x.png"; sourceTree = ""; }; - 837367F619A8344600D9559D /* userAdd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = userAdd.png; sourceTree = ""; }; - 837367F719A8344600D9559D /* userAdd@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "userAdd@2x.png"; sourceTree = ""; }; - 837367F819A8344600D9559D /* userDelete.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = userDelete.png; sourceTree = ""; }; - 837367F919A8344600D9559D /* userDelete@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "userDelete@2x.png"; sourceTree = ""; }; - 837367FA19A8344600D9559D /* userIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = userIcon.png; sourceTree = ""; }; - 837367FB19A8344600D9559D /* userIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "userIcon@2x.png"; sourceTree = ""; }; - 837BA0E119CCAED8002AA13E /* RYUserListCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYUserListCollectionViewCell.h; sourceTree = ""; }; - 837BA0E219CCAED8002AA13E /* RYUserListCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYUserListCollectionViewCell.m; sourceTree = ""; }; - 837BA0F119CCC619002AA13E /* BNRDynamicTypeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNRDynamicTypeManager.h; sourceTree = ""; }; - 837BA0F219CCC619002AA13E /* BNRDynamicTypeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BNRDynamicTypeManager.m; sourceTree = ""; }; - 837BA0F819CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIFontDescriptor+RYCustomFont.h"; sourceTree = ""; }; - 837BA0F919CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIFontDescriptor+RYCustomFont.m"; sourceTree = ""; }; - 837BA10019CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHTCollectionViewWaterfallLayout.h; sourceTree = ""; }; - 837BA10119CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CHTCollectionViewWaterfallLayout.m; sourceTree = ""; }; - 837BA10819CD12A8002AA13E /* UIViewController+RYSocialTransitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+RYSocialTransitions.h"; sourceTree = ""; }; - 837BA10919CD12A8002AA13E /* UIViewController+RYSocialTransitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+RYSocialTransitions.m"; sourceTree = ""; }; - 837C98D619A82411002A9B34 /* RYUserListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYUserListViewController.h; sourceTree = ""; }; - 837C98D719A82411002A9B34 /* RYUserListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYUserListViewController.m; sourceTree = ""; }; - 837CCD1519A3E12D00F95FCA /* RYTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTag.h; sourceTree = ""; }; - 837CCD1619A3E12D00F95FCA /* RYTag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTag.m; sourceTree = ""; }; - 837E9AC41981E3360052E006 /* RYProfileInfoTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYProfileInfoTableViewCell.h; sourceTree = ""; }; - 837E9AC51981E3360052E006 /* RYProfileInfoTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYProfileInfoTableViewCell.m; sourceTree = ""; }; - 83814BCB19D0DCBF00F60FBF /* RYTagListHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTagListHeaderView.h; sourceTree = ""; }; - 83814BCC19D0DCBF00F60FBF /* RYTagListHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTagListHeaderView.m; sourceTree = ""; }; - 8384965D19CBD62D0033EF92 /* check.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = check.png; sourceTree = ""; }; - 8384965E19CBD62D0033EF92 /* check@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "check@2x.png"; sourceTree = ""; }; - 8397133E1936DD1100913996 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; - 8398EC8219A012D800130EFC /* RYNewsfeedContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNewsfeedContainerViewController.h; sourceTree = ""; }; - 8398EC8319A012D800130EFC /* RYNewsfeedContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNewsfeedContainerViewController.m; sourceTree = ""; }; - 83B73E4D19DF526E001C746E /* Ryff-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Ryff-Bridging-Header.h"; path = "UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h"; sourceTree = ""; }; - 83B73E5419E0F87E001C746E /* RiffCreate.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RiffCreate.storyboard; sourceTree = ""; }; - 83BF313819C9FFC200F5BE48 /* MKAnnotationView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MKAnnotationView+WebCache.h"; sourceTree = ""; }; - 83BF313919C9FFC200F5BE48 /* MKAnnotationView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MKAnnotationView+WebCache.m"; sourceTree = ""; }; - 83BF313A19C9FFC200F5BE48 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+ImageContentType.h"; sourceTree = ""; }; - 83BF313B19C9FFC200F5BE48 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+ImageContentType.m"; sourceTree = ""; }; - 83BF313C19C9FFC200F5BE48 /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCache.h; sourceTree = ""; }; - 83BF313D19C9FFC200F5BE48 /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCache.m; sourceTree = ""; }; - 83BF313E19C9FFC200F5BE48 /* SDWebImageCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageCompat.h; sourceTree = ""; }; - 83BF313F19C9FFC200F5BE48 /* SDWebImageCompat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCompat.m; sourceTree = ""; }; - 83BF314019C9FFC200F5BE48 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDecoder.h; sourceTree = ""; }; - 83BF314119C9FFC200F5BE48 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoder.m; sourceTree = ""; }; - 83BF314219C9FFC200F5BE48 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloader.h; sourceTree = ""; }; - 83BF314319C9FFC200F5BE48 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloader.m; sourceTree = ""; }; - 83BF314419C9FFC200F5BE48 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderOperation.h; sourceTree = ""; }; - 83BF314519C9FFC200F5BE48 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 83BF314619C9FFC200F5BE48 /* SDWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManager.h; sourceTree = ""; }; - 83BF314719C9FFC200F5BE48 /* SDWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageManager.m; sourceTree = ""; }; - 83BF314819C9FFC200F5BE48 /* SDWebImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageOperation.h; sourceTree = ""; }; - 83BF314919C9FFC200F5BE48 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImagePrefetcher.h; sourceTree = ""; }; - 83BF314A19C9FFC200F5BE48 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcher.m; sourceTree = ""; }; - 83BF314B19C9FFC200F5BE48 /* UIButton+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+WebCache.h"; sourceTree = ""; }; - 83BF314C19C9FFC200F5BE48 /* UIButton+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+WebCache.m"; sourceTree = ""; }; - 83BF314D19C9FFC200F5BE48 /* UIImage+GIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+GIF.h"; sourceTree = ""; }; - 83BF314E19C9FFC200F5BE48 /* UIImage+GIF.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+GIF.m"; sourceTree = ""; }; - 83BF314F19C9FFC200F5BE48 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+MultiFormat.h"; sourceTree = ""; }; - 83BF315019C9FFC200F5BE48 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+MultiFormat.m"; sourceTree = ""; }; - 83BF315119C9FFC200F5BE48 /* UIImage+WebP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+WebP.h"; sourceTree = ""; }; - 83BF315219C9FFC200F5BE48 /* UIImage+WebP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+WebP.m"; sourceTree = ""; }; - 83BF315319C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 83BF315419C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 83BF315519C9FFC200F5BE48 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+WebCache.h"; sourceTree = ""; }; - 83BF315619C9FFC200F5BE48 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+WebCache.m"; sourceTree = ""; }; - 83BF315719C9FFC200F5BE48 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+WebCacheOperation.h"; sourceTree = ""; }; - 83BF315819C9FFC200F5BE48 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+WebCacheOperation.m"; sourceTree = ""; }; - 83C354B119BBAD41000A5BD4 /* RYRiffStreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffStreamViewController.h; sourceTree = ""; }; - 83C354B219BBAD41000A5BD4 /* RYRiffStreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffStreamViewController.m; sourceTree = ""; }; - 83C354B719BC2AB3000A5BD4 /* availableStream.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = availableStream.png; sourceTree = ""; }; - 83C354B819BC2AB3000A5BD4 /* availableStream@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "availableStream@2x.png"; sourceTree = ""; }; - 83C354C019BCE548000A5BD4 /* UIImagePickerController+Orientations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImagePickerController+Orientations.h"; sourceTree = ""; }; - 83C354C119BCE548000A5BD4 /* UIImagePickerController+Orientations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImagePickerController+Orientations.m"; sourceTree = ""; }; - 83C6A5EC1960EB9600BB3D1A /* record.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = record.png; sourceTree = ""; }; - 83C6A5ED1960EB9600BB3D1A /* record@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "record@2x.png"; sourceTree = ""; }; - 83C6A5F01960EC5200BB3D1A /* plus.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = plus.png; sourceTree = ""; }; - 83C6A5F11960EC5200BB3D1A /* plus@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "plus@2x.png"; sourceTree = ""; }; - 83C6CA7D18FAFF5200412469 /* back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = back.png; sourceTree = ""; }; - 83C6CA7E18FAFF5200412469 /* back@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "back@2x.png"; sourceTree = ""; }; - 83C6CA7F18FAFF5200412469 /* cloud.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cloud.png; sourceTree = ""; }; - 83C6CA8018FAFF5200412469 /* cloud@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cloud@2x.png"; sourceTree = ""; }; - 83C6CA8118FAFF5200412469 /* reset.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = reset.png; sourceTree = ""; }; - 83C6CA8218FAFF5200412469 /* reset@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "reset@2x.png"; sourceTree = ""; }; - 83C8940919C809E100127F68 /* RYTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTagList.h; sourceTree = ""; }; - 83C8940A19C809E100127F68 /* RYTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTagList.m; sourceTree = ""; }; - 83CA118E1995CD23002610E8 /* FLEXArgumentInputColorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputColorView.h; sourceTree = ""; }; - 83CA118F1995CD23002610E8 /* FLEXArgumentInputColorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputColorView.m; sourceTree = ""; }; - 83CA11901995CD23002610E8 /* FLEXArgumentInputFontsPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputFontsPickerView.h; sourceTree = ""; }; - 83CA11911995CD23002610E8 /* FLEXArgumentInputFontsPickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputFontsPickerView.m; sourceTree = ""; }; - 83CA11921995CD23002610E8 /* FLEXArgumentInputFontView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputFontView.h; sourceTree = ""; }; - 83CA11931995CD23002610E8 /* FLEXArgumentInputFontView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputFontView.m; sourceTree = ""; }; - 83CA11941995CD23002610E8 /* FLEXArgumentInputJSONObjectView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputJSONObjectView.h; sourceTree = ""; }; - 83CA11951995CD23002610E8 /* FLEXArgumentInputJSONObjectView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputJSONObjectView.m; sourceTree = ""; }; - 83CA11961995CD23002610E8 /* FLEXArgumentInputNotSupportedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputNotSupportedView.h; sourceTree = ""; }; - 83CA11971995CD23002610E8 /* FLEXArgumentInputNotSupportedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputNotSupportedView.m; sourceTree = ""; }; - 83CA11981995CD23002610E8 /* FLEXArgumentInputNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputNumberView.h; sourceTree = ""; }; - 83CA11991995CD23002610E8 /* FLEXArgumentInputNumberView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputNumberView.m; sourceTree = ""; }; - 83CA119A1995CD23002610E8 /* FLEXArgumentInputStringView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputStringView.h; sourceTree = ""; }; - 83CA119B1995CD23002610E8 /* FLEXArgumentInputStringView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputStringView.m; sourceTree = ""; }; - 83CA119C1995CD23002610E8 /* FLEXArgumentInputStructView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputStructView.h; sourceTree = ""; }; - 83CA119D1995CD23002610E8 /* FLEXArgumentInputStructView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputStructView.m; sourceTree = ""; }; - 83CA119E1995CD23002610E8 /* FLEXArgumentInputSwitchView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputSwitchView.h; sourceTree = ""; }; - 83CA119F1995CD23002610E8 /* FLEXArgumentInputSwitchView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputSwitchView.m; sourceTree = ""; }; - 83CA11A01995CD23002610E8 /* FLEXArgumentInputTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputTextView.h; sourceTree = ""; }; - 83CA11A11995CD23002610E8 /* FLEXArgumentInputTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputTextView.m; sourceTree = ""; }; - 83CA11A21995CD23002610E8 /* FLEXArgumentInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputView.h; sourceTree = ""; }; - 83CA11A31995CD23002610E8 /* FLEXArgumentInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputView.m; sourceTree = ""; }; - 83CA11A41995CD23002610E8 /* FLEXArgumentInputViewFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputViewFactory.h; sourceTree = ""; }; - 83CA11A51995CD23002610E8 /* FLEXArgumentInputViewFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputViewFactory.m; sourceTree = ""; }; - 83CA11A61995CD23002610E8 /* FLEXDefaultEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDefaultEditorViewController.h; sourceTree = ""; }; - 83CA11A71995CD23002610E8 /* FLEXDefaultEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDefaultEditorViewController.m; sourceTree = ""; }; - 83CA11A81995CD23002610E8 /* FLEXFieldEditorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFieldEditorView.h; sourceTree = ""; }; - 83CA11A91995CD23002610E8 /* FLEXFieldEditorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFieldEditorView.m; sourceTree = ""; }; - 83CA11AA1995CD23002610E8 /* FLEXFieldEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFieldEditorViewController.h; sourceTree = ""; }; - 83CA11AB1995CD23002610E8 /* FLEXFieldEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFieldEditorViewController.m; sourceTree = ""; }; - 83CA11AC1995CD23002610E8 /* FLEXIvarEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXIvarEditorViewController.h; sourceTree = ""; }; - 83CA11AD1995CD23002610E8 /* FLEXIvarEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXIvarEditorViewController.m; sourceTree = ""; }; - 83CA11AE1995CD23002610E8 /* FLEXMethodCallingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMethodCallingViewController.h; sourceTree = ""; }; - 83CA11AF1995CD23002610E8 /* FLEXMethodCallingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMethodCallingViewController.m; sourceTree = ""; }; - 83CA11B01995CD23002610E8 /* FLEXPropertyEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXPropertyEditorViewController.h; sourceTree = ""; }; - 83CA11B11995CD23002610E8 /* FLEXPropertyEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXPropertyEditorViewController.m; sourceTree = ""; }; - 83CA11B31995CD23002610E8 /* FLEXExplorerToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXExplorerToolbar.h; sourceTree = ""; }; - 83CA11B41995CD23002610E8 /* FLEXExplorerToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXExplorerToolbar.m; sourceTree = ""; }; - 83CA11B51995CD23002610E8 /* FLEXExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXExplorerViewController.h; sourceTree = ""; }; - 83CA11B61995CD23002610E8 /* FLEXExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXExplorerViewController.m; sourceTree = ""; }; - 83CA11B71995CD23002610E8 /* FLEXManager+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "FLEXManager+Private.h"; sourceTree = ""; }; - 83CA11B81995CD23002610E8 /* FLEXManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXManager.h; sourceTree = ""; }; - 83CA11B91995CD23002610E8 /* FLEXManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXManager.m; sourceTree = ""; }; - 83CA11BA1995CD23002610E8 /* FLEXToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXToolbarItem.h; sourceTree = ""; }; - 83CA11BB1995CD23002610E8 /* FLEXToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXToolbarItem.m; sourceTree = ""; }; - 83CA11BC1995CD23002610E8 /* FLEXWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWindow.h; sourceTree = ""; }; - 83CA11BD1995CD23002610E8 /* FLEXWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWindow.m; sourceTree = ""; }; - 83CA11BF1995CD23002610E8 /* FLEXClassesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXClassesTableViewController.h; sourceTree = ""; }; - 83CA11C01995CD23002610E8 /* FLEXClassesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXClassesTableViewController.m; sourceTree = ""; }; - 83CA11C11995CD23002610E8 /* FLEXFileBrowserSearchOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFileBrowserSearchOperation.h; sourceTree = ""; }; - 83CA11C21995CD23002610E8 /* FLEXFileBrowserSearchOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFileBrowserSearchOperation.m; sourceTree = ""; }; - 83CA11C31995CD23002610E8 /* FLEXFileBrowserTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFileBrowserTableViewController.h; sourceTree = ""; }; - 83CA11C41995CD23002610E8 /* FLEXFileBrowserTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFileBrowserTableViewController.m; sourceTree = ""; }; - 83CA11C51995CD23002610E8 /* FLEXGlobalsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXGlobalsTableViewController.h; sourceTree = ""; }; - 83CA11C61995CD23002610E8 /* FLEXGlobalsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXGlobalsTableViewController.m; sourceTree = ""; }; - 83CA11C71995CD23002610E8 /* FLEXInstancesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXInstancesTableViewController.h; sourceTree = ""; }; - 83CA11C81995CD23002610E8 /* FLEXInstancesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXInstancesTableViewController.m; sourceTree = ""; }; - 83CA11C91995CD23002610E8 /* FLEXLibrariesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXLibrariesTableViewController.h; sourceTree = ""; }; - 83CA11CA1995CD23002610E8 /* FLEXLibrariesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXLibrariesTableViewController.m; sourceTree = ""; }; - 83CA11CB1995CD23002610E8 /* FLEXLiveObjectsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXLiveObjectsTableViewController.h; sourceTree = ""; }; - 83CA11CC1995CD23002610E8 /* FLEXLiveObjectsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXLiveObjectsTableViewController.m; sourceTree = ""; }; - 83CA11CD1995CD23002610E8 /* FLEXWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWebViewController.h; sourceTree = ""; }; - 83CA11CE1995CD23002610E8 /* FLEXWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWebViewController.m; sourceTree = ""; }; - 83CA11D01995CD23002610E8 /* FLEXArrayExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArrayExplorerViewController.h; sourceTree = ""; }; - 83CA11D11995CD23002610E8 /* FLEXArrayExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArrayExplorerViewController.m; sourceTree = ""; }; - 83CA11D21995CD23002610E8 /* FLEXClassExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXClassExplorerViewController.h; sourceTree = ""; }; - 83CA11D31995CD23002610E8 /* FLEXClassExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXClassExplorerViewController.m; sourceTree = ""; }; - 83CA11D41995CD23002610E8 /* FLEXDefaultsExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDefaultsExplorerViewController.h; sourceTree = ""; }; - 83CA11D51995CD23002610E8 /* FLEXDefaultsExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDefaultsExplorerViewController.m; sourceTree = ""; }; - 83CA11D61995CD23002610E8 /* FLEXDescriptionTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDescriptionTableViewCell.h; sourceTree = ""; }; - 83CA11D71995CD23002610E8 /* FLEXDescriptionTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDescriptionTableViewCell.m; sourceTree = ""; }; - 83CA11D81995CD23002610E8 /* FLEXDictionaryExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDictionaryExplorerViewController.h; sourceTree = ""; }; - 83CA11D91995CD23002610E8 /* FLEXDictionaryExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDictionaryExplorerViewController.m; sourceTree = ""; }; - 83CA11DA1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXGlobalsTableViewControllerEntry.h; sourceTree = ""; }; - 83CA11DB1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXGlobalsTableViewControllerEntry.m; sourceTree = ""; }; - 83CA11DC1995CD23002610E8 /* FLEXImageExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXImageExplorerViewController.h; sourceTree = ""; }; - 83CA11DD1995CD23002610E8 /* FLEXImageExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXImageExplorerViewController.m; sourceTree = ""; }; - 83CA11DE1995CD23002610E8 /* FLEXObjectExplorerFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXObjectExplorerFactory.h; sourceTree = ""; }; - 83CA11DF1995CD23002610E8 /* FLEXObjectExplorerFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXObjectExplorerFactory.m; sourceTree = ""; }; - 83CA11E01995CD23002610E8 /* FLEXObjectExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXObjectExplorerViewController.h; sourceTree = ""; }; - 83CA11E11995CD23002610E8 /* FLEXObjectExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXObjectExplorerViewController.m; sourceTree = ""; }; - 83CA11E21995CD23002610E8 /* FLEXSetExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSetExplorerViewController.h; sourceTree = ""; }; - 83CA11E31995CD23002610E8 /* FLEXSetExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSetExplorerViewController.m; sourceTree = ""; }; - 83CA11E41995CD23002610E8 /* FLEXViewControllerExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXViewControllerExplorerViewController.h; sourceTree = ""; }; - 83CA11E51995CD23002610E8 /* FLEXViewControllerExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXViewControllerExplorerViewController.m; sourceTree = ""; }; - 83CA11E61995CD23002610E8 /* FLEXViewExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXViewExplorerViewController.h; sourceTree = ""; }; - 83CA11E71995CD23002610E8 /* FLEXViewExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXViewExplorerViewController.m; sourceTree = ""; }; - 83CA11E91995CD23002610E8 /* FLEXHeapEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHeapEnumerator.h; sourceTree = ""; }; - 83CA11EA1995CD23002610E8 /* FLEXHeapEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHeapEnumerator.m; sourceTree = ""; }; - 83CA11EB1995CD23002610E8 /* FLEXResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXResources.h; sourceTree = ""; }; - 83CA11EC1995CD23002610E8 /* FLEXResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXResources.m; sourceTree = ""; }; - 83CA11ED1995CD23002610E8 /* FLEXRuntimeUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeUtility.h; sourceTree = ""; }; - 83CA11EE1995CD23002610E8 /* FLEXRuntimeUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeUtility.m; sourceTree = ""; }; - 83CA11EF1995CD23002610E8 /* FLEXUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXUtility.h; sourceTree = ""; }; - 83CA11F01995CD23002610E8 /* FLEXUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXUtility.m; sourceTree = ""; }; - 83CA11F21995CD23002610E8 /* FLEXHierarchyTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHierarchyTableViewCell.h; sourceTree = ""; }; - 83CA11F31995CD23002610E8 /* FLEXHierarchyTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHierarchyTableViewCell.m; sourceTree = ""; }; - 83CA11F41995CD23002610E8 /* FLEXHierarchyTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHierarchyTableViewController.h; sourceTree = ""; }; - 83CA11F51995CD23002610E8 /* FLEXHierarchyTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHierarchyTableViewController.m; sourceTree = ""; }; - 83CA11F61995CD23002610E8 /* FLEXImagePreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXImagePreviewViewController.h; sourceTree = ""; }; - 83CA11F71995CD23002610E8 /* FLEXImagePreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXImagePreviewViewController.m; sourceTree = ""; }; - 83CA122B19981070002610E8 /* RYAudioDeckViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYAudioDeckViewController.h; sourceTree = ""; }; - 83CA122C19981070002610E8 /* RYAudioDeckViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYAudioDeckViewController.m; sourceTree = ""; }; - 83CA122E19981087002610E8 /* RYAudioDeckManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYAudioDeckManager.h; sourceTree = ""; }; - 83CA122F19981087002610E8 /* RYAudioDeckManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYAudioDeckManager.m; sourceTree = ""; }; - 83CA123119981702002610E8 /* RYAudioDeckTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYAudioDeckTableViewCell.h; sourceTree = ""; }; - 83CA123219981702002610E8 /* RYAudioDeckTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYAudioDeckTableViewCell.m; sourceTree = ""; }; - 83CCC8E9197EFCBF00FD1B4B /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperation.h; sourceTree = ""; }; - 83CCC8EA197EFCBF00FD1B4B /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperation.m; sourceTree = ""; }; - 83CCC8EB197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPRequestOperationManager.h; sourceTree = ""; }; - 83CCC8EC197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPRequestOperationManager.m; sourceTree = ""; }; - 83CCC8ED197EFCBF00FD1B4B /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFHTTPSessionManager.h; sourceTree = ""; }; - 83CCC8EE197EFCBF00FD1B4B /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFHTTPSessionManager.m; sourceTree = ""; }; - 83CCC8EF197EFCBF00FD1B4B /* AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworking.h; sourceTree = ""; }; - 83CCC8F0197EFCBF00FD1B4B /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkReachabilityManager.h; sourceTree = ""; }; - 83CCC8F1197EFCBF00FD1B4B /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkReachabilityManager.m; sourceTree = ""; }; - 83CCC8F2197EFCBF00FD1B4B /* AFSecurityPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFSecurityPolicy.h; sourceTree = ""; }; - 83CCC8F3197EFCBF00FD1B4B /* AFSecurityPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFSecurityPolicy.m; sourceTree = ""; }; - 83CCC8F4197EFCBF00FD1B4B /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLConnectionOperation.h; sourceTree = ""; }; - 83CCC8F5197EFCBF00FD1B4B /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLConnectionOperation.m; sourceTree = ""; }; - 83CCC8F6197EFCBF00FD1B4B /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLRequestSerialization.h; sourceTree = ""; }; - 83CCC8F7197EFCBF00FD1B4B /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLRequestSerialization.m; sourceTree = ""; }; - 83CCC8F8197EFCBF00FD1B4B /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLResponseSerialization.h; sourceTree = ""; }; - 83CCC8F9197EFCBF00FD1B4B /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLResponseSerialization.m; sourceTree = ""; }; - 83CCC8FA197EFCBF00FD1B4B /* AFURLSessionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFURLSessionManager.h; sourceTree = ""; }; - 83CCC8FB197EFCBF00FD1B4B /* AFURLSessionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFURLSessionManager.m; sourceTree = ""; }; - 83CCC8FD197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AFNetworkActivityIndicatorManager.h; sourceTree = ""; }; - 83CCC8FE197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFNetworkActivityIndicatorManager.m; sourceTree = ""; }; - 83CCC8FF197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; - 83CCC900197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; - 83CCC901197EFCBF00FD1B4B /* UIAlertView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIAlertView+AFNetworking.h"; sourceTree = ""; }; - 83CCC902197EFCBF00FD1B4B /* UIAlertView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIAlertView+AFNetworking.m"; sourceTree = ""; }; - 83CCC903197EFCBF00FD1B4B /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+AFNetworking.h"; sourceTree = ""; }; - 83CCC904197EFCBF00FD1B4B /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+AFNetworking.m"; sourceTree = ""; }; - 83CCC905197EFCBF00FD1B4B /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; - 83CCC906197EFCBF00FD1B4B /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; - 83CCC907197EFCBF00FD1B4B /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIKit+AFNetworking.h"; sourceTree = ""; }; - 83CCC908197EFCBF00FD1B4B /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIProgressView+AFNetworking.h"; sourceTree = ""; }; - 83CCC909197EFCBF00FD1B4B /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIProgressView+AFNetworking.m"; sourceTree = ""; }; - 83CCC90A197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; - 83CCC90B197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; - 83CCC90C197EFCBF00FD1B4B /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWebView+AFNetworking.h"; sourceTree = ""; }; - 83CCC90D197EFCBF00FD1B4B /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+AFNetworking.m"; sourceTree = ""; }; - 83DBCA7918F99E3F00262496 /* RYRiffStreamingCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRiffStreamingCoreViewController.h; sourceTree = ""; }; - 83DBCA7A18F99E3F00262496 /* RYRiffStreamingCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRiffStreamingCoreViewController.m; sourceTree = ""; }; - 83DC3B7619BD0EC00036AD2A /* RYRefreshControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYRefreshControl.h; sourceTree = ""; }; - 83DC3B7719BD0EC00036AD2A /* RYRefreshControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYRefreshControl.m; sourceTree = ""; }; - 83E3017019C7BAEE0085F17F /* RYTagCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYTagCollectionViewCell.h; sourceTree = ""; }; - 83E3017119C7BAEE0085F17F /* RYTagCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYTagCollectionViewCell.m; sourceTree = ""; }; - 83E56B621953A0A900EF054C /* RYUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYUser.h; sourceTree = ""; }; - 83E56B631953A0A900EF054C /* RYUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYUser.m; sourceTree = ""; }; - 83E56B661953A0DA00EF054C /* RYMediaEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYMediaEditor.h; sourceTree = ""; }; - 83E56B671953A0DA00EF054C /* RYMediaEditor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYMediaEditor.m; sourceTree = ""; }; - 83EB8BA419959F5C0007837D /* DWTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWTagList.h; sourceTree = ""; }; - 83EB8BA519959F5C0007837D /* DWTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWTagList.m; sourceTree = ""; }; - 83ED34CC19316E5D00FEB018 /* Lato-Lig.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Lato-Lig.ttf"; sourceTree = ""; }; - 83ED34CD19316E5D00FEB018 /* Lato-RegIta.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Lato-RegIta.ttf"; sourceTree = ""; }; - 83ED34D81931851600FEB018 /* AppIcon29x29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon29x29.png; sourceTree = ""; }; - 83ED34D91931851600FEB018 /* AppIcon29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon29x29@2x.png"; sourceTree = ""; }; - 83ED34DA1931851600FEB018 /* AppIcon40x40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon40x40.png; sourceTree = ""; }; - 83ED34DB1931851600FEB018 /* AppIcon40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon40x40@2x.png"; sourceTree = ""; }; - 83ED34DC1931851600FEB018 /* AppIcon50x50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon50x50.png; sourceTree = ""; }; - 83ED34DD1931851600FEB018 /* AppIcon50x50@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon50x50@2x.png"; sourceTree = ""; }; - 83ED34DE1931851600FEB018 /* AppIcon57x57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon57x57.png; sourceTree = ""; }; - 83ED34DF1931851600FEB018 /* AppIcon57x57@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon57x57@2x.png"; sourceTree = ""; }; - 83ED34E01931851600FEB018 /* AppIcon60x60.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon60x60.png; sourceTree = ""; }; - 83ED34E11931851600FEB018 /* AppIcon60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon60x60@2x.png"; sourceTree = ""; }; - 83ED34E21931851600FEB018 /* AppIcon72x72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon72x72.png; sourceTree = ""; }; - 83ED34E31931851600FEB018 /* AppIcon72x72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon72x72@2x.png"; sourceTree = ""; }; - 83ED34E41931851600FEB018 /* AppIcon76x76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AppIcon76x76.png; sourceTree = ""; }; - 83ED34E51931851600FEB018 /* AppIcon76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIcon76x76@2x.png"; sourceTree = ""; }; - 83ED34E61931851600FEB018 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iTunesArtwork.png; sourceTree = ""; }; - 83ED34E71931851600FEB018 /* iTunesArtwork@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iTunesArtwork@2x.png"; sourceTree = ""; }; - 83FA50B51931524E00F1F3A7 /* Lato-Bol.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Lato-Bol.ttf"; sourceTree = ""; }; - 83FA50B61931524E00F1F3A7 /* Lato-Reg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Lato-Reg.ttf"; sourceTree = ""; }; - 83FADE4319AC405200182155 /* create.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create.png; sourceTree = ""; }; - 83FADE4419AC405200182155 /* create@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "create@2x.png"; sourceTree = ""; }; + 831178441BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckConsoleView.swift; path = Classes/RYAudioDeckConsoleView.swift; sourceTree = ""; }; + 831178451BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckTableViewCell.swift; path = Classes/RYAudioDeckTableViewCell.swift; sourceTree = ""; }; + 8311784D1BB7068B007C2DC0 /* RYAudioDeckViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckViewController.swift; path = Classes/RYAudioDeckViewController.swift; sourceTree = ""; }; + 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckViewController.swift; path = Classes/RYAudioDeckViewController.swift; sourceTree = ""; }; + 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIKit+BNRDynamicTypeManager.swift"; path = "Categories/UIKit+BNRDynamicTypeManager.swift"; sourceTree = ""; }; + 838165961B9E370C002C0FDB /* RYAudioDeck.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeck.swift; path = Classes/RYAudioDeck.swift; sourceTree = ""; }; + 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckPlaylist.swift; path = Classes/RYAudioDeckPlaylist.swift; sourceTree = ""; }; + 83F4EEBB1B9D3921007CF11A /* NSMutableDictionary+Safety.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableDictionary+Safety.h"; path = "Categories/NSMutableDictionary+Safety.h"; sourceTree = ""; }; + 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+Safety.m"; path = "Categories/NSMutableDictionary+Safety.m"; sourceTree = ""; }; + 83F4EEBE1B9D3A8F007CF11A /* NSDictionary+Safety.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Safety.h"; path = "Categories/NSDictionary+Safety.h"; sourceTree = ""; }; + 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Safety.m"; path = "Categories/NSDictionary+Safety.m"; sourceTree = ""; }; 83FADE4B19AC54DA00182155 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 83FCD13818F907C400A493F0 /* Ryff.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ryff.app; sourceTree = BUILT_PRODUCTS_DIR; }; 83FCD13B18F907C400A493F0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -703,31 +354,16 @@ 83FCD14518F907C400A493F0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 83FCD14718F907C400A493F0 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 83FCD14918F907C400A493F0 /* Ryff-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Ryff-Prefix.pch"; sourceTree = ""; }; - 83FCD14A18F907C400A493F0 /* RYAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RYAppDelegate.h; sourceTree = ""; }; - 83FCD14B18F907C400A493F0 /* RYAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RYAppDelegate.m; sourceTree = ""; }; - 83FCD14E18F907C400A493F0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainIphone.storyboard; sourceTree = ""; }; 83FCD15618F907C400A493F0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 83FCD15C18F907C400A493F0 /* RyffTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RyffTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 83FCD15D18F907C400A493F0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 83FCD16518F907C400A493F0 /* RyffTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RyffTests-Info.plist"; sourceTree = ""; }; 83FCD16718F907C400A493F0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 83FCD16918F907C400A493F0 /* RyffTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RyffTests.m; sourceTree = ""; }; - 83FCD17418F909DB00A493F0 /* RYProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYProfileViewController.h; sourceTree = ""; }; - 83FCD17518F909DB00A493F0 /* RYProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYProfileViewController.m; sourceTree = ""; }; - 83FCD18D18F9144100A493F0 /* RYNewsfeedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYNewsfeedTableViewController.h; sourceTree = ""; }; - 83FCD18E18F9144100A493F0 /* RYNewsfeedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYNewsfeedTableViewController.m; sourceTree = ""; }; - 83FCD1A118F921EA00A493F0 /* RYServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYServices.h; path = ../RYServices.h; sourceTree = ""; }; - 83FCD1A218F921EA00A493F0 /* RYServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYServices.m; path = ../RYServices.m; sourceTree = ""; }; - 83FCD1A618F9393F00A493F0 /* RYStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYStyleSheet.h; sourceTree = ""; }; - 83FCD1A718F9393F00A493F0 /* RYStyleSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYStyleSheet.m; sourceTree = ""; }; - 83FCD1AA18F93E6C00A493F0 /* user.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = user.png; sourceTree = ""; }; - 83FCD1AC18F93F5500A493F0 /* artists.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = artists.png; sourceTree = ""; }; - 83FCD1AD18F93F5500A493F0 /* artists@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "artists@2x.png"; sourceTree = ""; }; - 83FCD1AE18F93F5500A493F0 /* user@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "user@2x.png"; sourceTree = ""; }; - 83FCD1B618F9405F00A493F0 /* RYCoreTabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYCoreTabBarViewController.h; sourceTree = ""; }; - 83FCD1B718F9405F00A493F0 /* RYCoreTabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYCoreTabBarViewController.m; sourceTree = ""; }; - 83FCD1B918F9413400A493F0 /* RYPost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPost.h; path = ../../Newsfeed/RYPost.h; sourceTree = ""; }; - 83FCD1BA18F9413400A493F0 /* RYPost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPost.m; path = ../../Newsfeed/RYPost.m; sourceTree = ""; }; + 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAddToPlaylistView.swift; path = Classes/RYAddToPlaylistView.swift; sourceTree = ""; }; + 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYNowPlayingView.swift; path = Classes/RYNowPlayingView.swift; sourceTree = ""; }; + CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Ryff.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E251082A40810E7130987A45 /* Pods_RyffTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RyffTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -736,11 +372,12 @@ buildActionMask = 2147483647; files = ( 83FADE4C19AC54DA00182155 /* QuartzCore.framework in Frameworks */, + 3FE76E631B9B412E00099CF5 /* libCrittercism_v4_3_7.a in Frameworks */, 830BBCCA18FA0C2300A9C53F /* CoreLocation.framework in Frameworks */, 83FCD13E18F907C400A493F0 /* CoreGraphics.framework in Frameworks */, - 835E1E0619D21A50007EBD74 /* libCrittercism_v4_3_7.a in Frameworks */, 83FCD14018F907C400A493F0 /* UIKit.framework in Frameworks */, 83FCD13C18F907C400A493F0 /* Foundation.framework in Frameworks */, + 9795D935FF6483EC5F9A5340 /* Pods_Ryff.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -751,685 +388,409 @@ 83FCD15E18F907C400A493F0 /* XCTest.framework in Frameworks */, 83FCD16018F907C400A493F0 /* UIKit.framework in Frameworks */, 83FCD15F18F907C400A493F0 /* Foundation.framework in Frameworks */, + EC092E28FF5A6FF568A7BCC8 /* Pods_RyffTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 830185F119009C2B00093EFA /* Login */ = { + 3F387BFD1B9B3C3700B5CC74 /* Data */ = { isa = PBXGroup; children = ( - 830185F219009C3A00093EFA /* RYLoginViewController.h */, - 830185F319009C3A00093EFA /* RYLoginViewController.m */, - 836461AC195FBF05005938F5 /* RYLoginTableViewCell.h */, - 836461AD195FBF05005938F5 /* RYLoginTableViewCell.m */, + 3F387BFE1B9B3C3E00B5CC74 /* Objects */, + 3F387C0A1B9B3F1400B5CC74 /* Data Models */, + 3F387BFF1B9B3C6900B5CC74 /* Data Managers */, + 3F387C001B9B3CBD00B5CC74 /* Services */, ); - name = Login; - path = Register/Login; + name = Data; sourceTree = ""; }; - 83082FE519B55DDD000AFACB /* TagFeed */ = { + 3F387BFE1B9B3C3E00B5CC74 /* Objects */ = { isa = PBXGroup; children = ( - 83082FE619B55DF4000AFACB /* RYTagFeedViewController.h */, - 83082FE719B55DF4000AFACB /* RYTagFeedViewController.m */, - 83082FE919B5652D000AFACB /* RYSearchTypeTableViewCell.h */, - 83082FEA19B5652D000AFACB /* RYSearchTypeTableViewCell.m */, - ); - path = TagFeed; + 3F387B761B9B3C2B00B5CC74 /* RYNotification.h */, + 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */, + 3F387B801B9B3C2B00B5CC74 /* RYPost.h */, + 3F387B811B9B3C2B00B5CC74 /* RYPost.m */, + 3F387BAE1B9B3C2B00B5CC74 /* RYTag.h */, + 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */, + 3F387BBA1B9B3C2B00B5CC74 /* RYUser.h */, + 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */, + ); + name = Objects; sourceTree = ""; }; - 830BBCAC18F9F54900A9C53F /* SSKeychain */ = { + 3F387BFF1B9B3C6900B5CC74 /* Data Managers */ = { isa = PBXGroup; children = ( - 830BBCAD18F9F54900A9C53F /* SSKeychain.strings */, - 830BBCAF18F9F54900A9C53F /* SSKeychain.h */, - 830BBCB018F9F54900A9C53F /* SSKeychain.m */, - 830BBCB118F9F54900A9C53F /* SSKeychainQuery.h */, - 830BBCB218F9F54900A9C53F /* SSKeychainQuery.m */, - ); - name = SSKeychain; - path = ../Data/SSKeychain; + 3F387B5C1B9B3C2B00B5CC74 /* RYDataManager.h */, + 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */, + 3F387B6C1B9B3C2B00B5CC74 /* RYMediaEditor.h */, + 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */, + 3F387B781B9B3C2B00B5CC74 /* RYNotificationsManager.h */, + 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */, + 3F387BB41B9B3C2B00B5CC74 /* RYTagList.h */, + 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */, + ); + name = "Data Managers"; sourceTree = ""; }; - 830BBCB618FA055900A9C53F /* MBProgressHUD */ = { + 3F387C001B9B3CBD00B5CC74 /* Services */ = { isa = PBXGroup; children = ( - 830BBCB718FA055900A9C53F /* MBProgressHUD-Prefix.pch */, - 830BBCB818FA055900A9C53F /* MBProgressHUD.h */, - 830BBCB918FA055900A9C53F /* MBProgressHUD.m */, - ); - name = MBProgressHUD; - path = ../UI/Custom/MBProgressHUD; + 3F387B5E1B9B3C2B00B5CC74 /* RYDiscoverServices.h */, + 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */, + 3F387B8E1B9B3C2B00B5CC74 /* RYRegistrationServices.h */, + 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */, + 3F387BA61B9B3C2B00B5CC74 /* RYServices.h */, + 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */, + 3F387B661B9B3C2B00B5CC74 /* RYLocationServices.h */, + 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */, + ); + name = Services; sourceTree = ""; }; - 830BBCC518FA0A4500A9C53F /* Location */ = { + 3F387C011B9B3D6A00B5CC74 /* User Interface */ = { isa = PBXGroup; children = ( - 830BBCC618FA0A5800A9C53F /* RYLocationServices.h */, - 830BBCC718FA0A5800A9C53F /* RYLocationServices.m */, - ); - path = Location; + 3F24D8301B9B4ED300E78B05 /* RYNavigationController.h */, + 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */, + 3F387C021B9B3DA000B5CC74 /* Posts */, + 3F387C061B9B3E4400B5CC74 /* Audio Deck */, + 3F387C071B9B3E8800B5CC74 /* Registration */, + 3F387C081B9B3EAF00B5CC74 /* Discover */, + 3F387C091B9B3EE500B5CC74 /* Notifications */, + 3F387C031B9B3DA900B5CC74 /* Custom Views */, + 3F387B581B9B3C2B00B5CC74 /* RYCorePageViewController.h */, + 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */, + 3F387B5A1B9B3C2B00B5CC74 /* RYCoreViewController.h */, + 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */, + 3F387B621B9B3C2B00B5CC74 /* RYGroupTableViewCell.h */, + 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */, + 3F387B981B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.h */, + 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */, + 3F387B9A1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.h */, + 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */, + 3F387BB81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.h */, + 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */, + ); + name = "User Interface"; sourceTree = ""; }; - 830BBCCF18FA142000A9C53F /* BlockAlert */ = { + 3F387C021B9B3DA000B5CC74 /* Posts */ = { isa = PBXGroup; children = ( - 830BBCD018FA142000A9C53F /* BlockAlertView.h */, - 830BBCD118FA142000A9C53F /* BlockAlertView.m */, - ); - name = BlockAlert; - path = ../UI/Custom/BlockAlert; + 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */, + 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */, + 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */, + 3F387C051B9B3E2600B5CC74 /* Profile */, + 3F387C041B9B3E2100B5CC74 /* Newsfeed */, + 3F387B941B9B3C2B00B5CC74 /* RYRiffCell.h */, + 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */, + 3F387BA01B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.h */, + 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */, + 3F387BA21B9B3C2B00B5CC74 /* RYRiffStreamViewController.h */, + 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */, + ); + name = Posts; sourceTree = ""; }; - 8310F5A71981F8BF00250172 /* Custom UI Objects */ = { + 3F387C031B9B3DA900B5CC74 /* Custom Views */ = { isa = PBXGroup; children = ( - 8310F5A81981F92300250172 /* RYPlayControl.h */, - 8310F5A91981F92300250172 /* RYPlayControl.m */, - 8312628B19AD120D00532CA3 /* RYSocialTextView.h */, - 8312628C19AD120D00532CA3 /* RYSocialTextView.m */, - 83DC3B7619BD0EC00036AD2A /* RYRefreshControl.h */, - 83DC3B7719BD0EC00036AD2A /* RYRefreshControl.m */, - 835E1E0819D2320D007EBD74 /* RYLoadMoreControl.h */, - 835E1E0919D2320D007EBD74 /* RYLoadMoreControl.m */, - ); - path = "Custom UI Objects"; + 3F387B641B9B3C2B00B5CC74 /* RYLoadMoreControl.h */, + 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */, + 3F387B7E1B9B3C2B00B5CC74 /* RYPlayControl.h */, + 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */, + 3F387B8C1B9B3C2B00B5CC74 /* RYRefreshControl.h */, + 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */, + 3F387BA81B9B3C2B00B5CC74 /* RYSocialTextView.h */, + 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */, + 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */, + 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */, + 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */, + 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */, + 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */, + ); + name = "Custom Views"; sourceTree = ""; }; - 831A8890199EEEDD00C44CED /* 1.0 images */ = { + 3F387C041B9B3E2100B5CC74 /* Newsfeed */ = { isa = PBXGroup; children = ( - 8384965D19CBD62D0033EF92 /* check.png */, - 8384965E19CBD62D0033EF92 /* check@2x.png */, - 83C354B719BC2AB3000A5BD4 /* availableStream.png */, - 83C354B819BC2AB3000A5BD4 /* availableStream@2x.png */, - 835E482D19AE634B002A3AC2 /* options.png */, - 835E482E19AE634B002A3AC2 /* options@2x.png */, - 83FADE4319AC405200182155 /* create.png */, - 83FADE4419AC405200182155 /* create@2x.png */, - 837367EE19A8344600D9559D /* globe.png */, - 837367EF19A8344600D9559D /* globe@2x.png */, - 837367F019A8344600D9559D /* location.png */, - 837367F119A8344600D9559D /* location@2x.png */, - 837367F219A8344600D9559D /* message.png */, - 837367F319A8344600D9559D /* message@2x.png */, - 837367F419A8344600D9559D /* notification.png */, - 837367F519A8344600D9559D /* notification@2x.png */, - 837367F619A8344600D9559D /* userAdd.png */, - 837367F719A8344600D9559D /* userAdd@2x.png */, - 837367F819A8344600D9559D /* userDelete.png */, - 837367F919A8344600D9559D /* userDelete@2x.png */, - 837367FA19A8344600D9559D /* userIcon.png */, - 837367FB19A8344600D9559D /* userIcon@2x.png */, - 831A8891199EEEDD00C44CED /* next.png */, - 831A8892199EEEDD00C44CED /* next@2x.png */, - 831A8893199EEEDD00C44CED /* pause.png */, - 831A8894199EEEDD00C44CED /* pause@2x.png */, - 831A8895199EEEDD00C44CED /* play.png */, - 831A8896199EEEDD00C44CED /* play@2x.png */, - 831A8897199EEEDD00C44CED /* playing.png */, - 831A8898199EEEDD00C44CED /* playing@2x.png */, - 831A8899199EEEDD00C44CED /* plus.png */, - 831A889A199EEEDD00C44CED /* plus@2x.png */, - 831A889B199EEEDD00C44CED /* remix.png */, - 831A889C199EEEDD00C44CED /* remix@2x.png */, - 831A889D199EEEDD00C44CED /* rss.png */, - 831A889E199EEEDD00C44CED /* rss@2x.png */, - 831A889F199EEEDD00C44CED /* star.png */, - 831A88A0199EEEDD00C44CED /* star@2x.png */, - 831A88A1199EEEDD00C44CED /* stream.png */, - 831A88A2199EEEDD00C44CED /* stream@2x.png */, - 831A88A3199EEEDD00C44CED /* tag.png */, - 831A88A4199EEEDD00C44CED /* tag@2x.png */, - 831A88A5199EEEDD00C44CED /* upvote.png */, - 831A88A6199EEEDD00C44CED /* upvote@2x.png */, - 831A88A7199EEEDD00C44CED /* x.png */, - 831A88A8199EEEDD00C44CED /* x@2x.png */, - ); - path = "1.0 images"; + 3F387B6E1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.h */, + 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */, + 3F387B721B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.h */, + 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */, + 3F387B741B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.h */, + 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */, + ); + name = Newsfeed; sourceTree = ""; }; - 8322309719B00D0200C60033 /* PXAlertView */ = { + 3F387C051B9B3E2600B5CC74 /* Profile */ = { isa = PBXGroup; children = ( - 8322309819B00D0200C60033 /* PXAlertView+Customization.h */, - 8322309919B00D0200C60033 /* PXAlertView+Customization.m */, - 8322309A19B00D0200C60033 /* PXAlertView.h */, - 8322309B19B00D0200C60033 /* PXAlertView.m */, + 3F387B861B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.h */, + 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */, + 3F387B891B9B3C2B00B5CC74 /* RYProfileViewController.h */, + 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */, + 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */, + 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */, ); - path = PXAlertView; + name = Profile; sourceTree = ""; }; - 832B89F61B32367700881AD8 /* FDWaveformView */ = { + 3F387C061B9B3E4400B5CC74 /* Audio Deck */ = { isa = PBXGroup; children = ( - 832B89F71B32367700881AD8 /* FDWaveformView.h */, - 832B89F81B32367700881AD8 /* FDWaveformView.m */, - ); - name = FDWaveformView; - path = Ryff/UI/Custom/FDWaveformView; - sourceTree = SOURCE_ROOT; - }; - 83302D8C19C7A1F7008C5A54 /* Discover */ = { - isa = PBXGroup; - children = ( - 83C8940919C809E100127F68 /* RYTagList.h */, - 83C8940A19C809E100127F68 /* RYTagList.m */, - 83302D8D19C7A20B008C5A54 /* RYTagListViewController.h */, - 83302D8E19C7A20B008C5A54 /* RYTagListViewController.m */, - 83E3017019C7BAEE0085F17F /* RYTagCollectionViewCell.h */, - 83E3017119C7BAEE0085F17F /* RYTagCollectionViewCell.m */, - 83814BCB19D0DCBF00F60FBF /* RYTagListHeaderView.h */, - 83814BCC19D0DCBF00F60FBF /* RYTagListHeaderView.m */, - ); - name = Discover; - path = TagList; + 8311784D1BB7068B007C2DC0 /* RYAudioDeckViewController.swift */, + 831178441BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift */, + 831178451BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift */, + 3F387B561B9B3C2B00B5CC74 /* RYAudioDeckViewController.h */, + 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */, + 3F387B541B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.h */, + 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */, + ); + name = "Audio Deck"; sourceTree = ""; }; - 83360CCE19B6A7C800136FCB /* Notifications */ = { + 3F387C071B9B3E8800B5CC74 /* Registration */ = { isa = PBXGroup; children = ( - 83360CCF19B6A7EB00136FCB /* RYNotificationsTableViewController.h */, - 83360CD019B6A7EB00136FCB /* RYNotificationsTableViewController.m */, - 83360CD219B6A7FF00136FCB /* RYNotificationsTableViewCell.h */, - 83360CD319B6A7FF00136FCB /* RYNotificationsTableViewCell.m */, + 3F387B681B9B3C2B00B5CC74 /* RYLoginTableViewCell.h */, + 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */, + 3F387B6A1B9B3C2B00B5CC74 /* RYLoginViewController.h */, + 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */, ); - path = Notifications; - sourceTree = ""; - }; - 83360CD719B6B75300136FCB /* Services */ = { - isa = PBXGroup; - children = ( - 83FCD1A118F921EA00A493F0 /* RYServices.h */, - 83FCD1A218F921EA00A493F0 /* RYServices.m */, - 834A0B4D19BED5A700E4D7E9 /* RYRegistrationServices.h */, - 834A0B4E19BED5A700E4D7E9 /* RYRegistrationServices.m */, - 83360CD819B6B76500136FCB /* RYNotificationsManager.h */, - 83360CD919B6B76500136FCB /* RYNotificationsManager.m */, - 83302D9319C7A972008C5A54 /* RYDiscoverServices.h */, - 83302D9419C7A972008C5A54 /* RYDiscoverServices.m */, - ); - path = Services; + name = Registration; sourceTree = ""; }; - 833E1D511975DFA90002A2BE /* Extras */ = { + 3F387C081B9B3EAF00B5CC74 /* Discover */ = { isa = PBXGroup; children = ( - 832B89F61B32367700881AD8 /* FDWaveformView */, - 835E1DFF19D21A50007EBD74 /* CrittercismSDK */, - 837BA0E619CCC619002AA13E /* BNRDynamicTypeManager */, - 83BF313719C9FFC200F5BE48 /* SDWebImage */, - 8322309719B00D0200C60033 /* PXAlertView */, - 830BBCB618FA055900A9C53F /* MBProgressHUD */, - 83CA118B1995CD23002610E8 /* FLEX */, - 83EB8BA319959F5C0007837D /* DWTagList */, - 83CCC8E8197EFCBF00FD1B4B /* AFNetworking */, - 83CCC8FC197EFCBF00FD1B4B /* UIKit+AFNetworking */, - 830BBCCF18FA142000A9C53F /* BlockAlert */, - 830BBCAC18F9F54900A9C53F /* SSKeychain */, - 837BA0FF19CCFA69002AA13E /* CHTCollectionViewWaterfallLayout */, + 3F387B601B9B3C2B00B5CC74 /* RYDiscoverViewController.h */, + 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */, + 3F387B9C1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.h */, + 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */, + 3F387B9E1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.h */, + 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */, + 3F387BA41B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.h */, + 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */, + 3F387BB01B9B3C2B00B5CC74 /* RYTagCollectionViewCell.h */, + 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */, + 3F387BB21B9B3C2B00B5CC74 /* RYTagFeedViewController.h */, + 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */, + 3F387BB61B9B3C2B00B5CC74 /* RYTagListHeaderView.h */, + 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */, + 3F387BBE1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.h */, + 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */, + 3F387BC01B9B3C2B00B5CC74 /* RYUserListViewController.h */, + 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */, ); - name = Extras; - path = Frameworks; + name = Discover; sourceTree = ""; }; - 833FC1AF1989E467002491C8 /* RiffDetails */ = { + 3F387C091B9B3EE500B5CC74 /* Notifications */ = { isa = PBXGroup; children = ( - 833FC1AC1989E406002491C8 /* RYRiffDetailsViewController.h */, - 833FC1AD1989E406002491C8 /* RYRiffDetailsViewController.m */, - 833FC1B01989E4B0002491C8 /* RYRiffDetailsTableViewCell.h */, - 833FC1B11989E4B0002491C8 /* RYRiffDetailsTableViewCell.m */, + 3F387B7A1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.h */, + 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */, + 3F387B7C1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.h */, + 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */, ); - path = RiffDetails; + name = Notifications; sourceTree = ""; }; - 835516731951314400CF2C23 /* RiffCreate */ = { + 3F387C0A1B9B3F1400B5CC74 /* Data Models */ = { isa = PBXGroup; children = ( - 835516741951315F00CF2C23 /* RYRiffCreateTableViewCell.h */, - 835516751951315F00CF2C23 /* RYRiffCreateTableViewCell.m */, - 831B96091964E428003A8616 /* RYTrackDownloadTableViewCell.h */, - 831B960A1964E428003A8616 /* RYTrackDownloadTableViewCell.m */, - 830029BA1B7FD17C00666D93 /* RYRiffCreateCollectionViewController.swift */, - 830029BC1B7FD3F900666D93 /* RYRiffCreateNodeCollectionViewCell.swift */, - 83B73E5419E0F87E001C746E /* RiffCreate.storyboard */, - 830029B71B7FB2B300666D93 /* RYRiffAudioNode.h */, - 830029B81B7FB2B300666D93 /* RYRiffAudioNode.m */, - 835E1AB31A4943D600FC679B /* RYRiffAudioEngine.h */, - 835E1AB41A4943D600FC679B /* RYRiffAudioEngine.m */, - ); - path = RiffCreate; + 3F387B821B9B3C2B00B5CC74 /* RYPostsDataSource.h */, + 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */, + 3F387B701B9B3C2B00B5CC74 /* RYNewsfeedDataSource.h */, + 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */, + 3F387BBC1B9B3C2B00B5CC74 /* RYUserFeedDataSource.h */, + 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */, + 838165961B9E370C002C0FDB /* RYAudioDeck.swift */, + 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */, + ); + name = "Data Models"; sourceTree = ""; }; - 835E1DFF19D21A50007EBD74 /* CrittercismSDK */ = { + 3F387C0B1B9B3F5300B5CC74 /* Audio Mixer */ = { isa = PBXGroup; children = ( - 835E1E0019D21A50007EBD74 /* CRFilter.h */, - 835E1E0119D21A50007EBD74 /* Crittercism.h */, - 835E1E0219D21A50007EBD74 /* CrittercismDelegate.h */, - 835E1E0319D21A50007EBD74 /* dsym_upload.sh */, - 835E1E0419D21A50007EBD74 /* libCrittercism_v4_3_7.a */, - ); - path = CrittercismSDK; + 3F387B901B9B3C2B00B5CC74 /* RYRiffAudioEngine.h */, + 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */, + 3F387B921B9B3C2B00B5CC74 /* RYRiffAudioNode.h */, + 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */, + 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */, + 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */, + ); + name = "Audio Mixer"; sourceTree = ""; }; - 836F483719A04BAB00E948BE /* Categories */ = { - isa = PBXGroup; - children = ( - 836F483819A04BAB00E948BE /* NSObject+block.h */, - 836F483919A04BAB00E948BE /* NSObject+block.m */, - 836F483A19A04BAB00E948BE /* UIImage+Color.h */, - 836F483B19A04BAB00E948BE /* UIImage+Color.m */, - 836F483C19A04BAB00E948BE /* UIImage+Thumbnail.h */, - 836F483D19A04BAB00E948BE /* UIImage+Thumbnail.m */, - 836F483E19A04BAB00E948BE /* UIView+Styling.h */, - 836F483F19A04BAB00E948BE /* UIView+Styling.m */, - 836F484019A04BAB00E948BE /* UIViewController+Extras.h */, - 836F484119A04BAB00E948BE /* UIViewController+Extras.m */, - 83C354C019BCE548000A5BD4 /* UIImagePickerController+Orientations.h */, - 83C354C119BCE548000A5BD4 /* UIImagePickerController+Orientations.m */, - 837BA0F819CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.h */, - 837BA0F919CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.m */, - 837BA10819CD12A8002AA13E /* UIViewController+RYSocialTransitions.h */, - 837BA10919CD12A8002AA13E /* UIViewController+RYSocialTransitions.m */, - ); - name = Categories; - path = Ryff/Categories; - sourceTree = SOURCE_ROOT; - }; - 837BA0E619CCC619002AA13E /* BNRDynamicTypeManager */ = { + 3F387C0C1B9B3F6D00B5CC74 /* Style */ = { isa = PBXGroup; children = ( - 837BA0F019CCC619002AA13E /* Core */, - ); - path = BNRDynamicTypeManager; + 3FE76E681B9B443900099CF5 /* Media.xcassets */, + 3F387BAA1B9B3C2B00B5CC74 /* RYStyleSheet.h */, + 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */, + 3FF2A4941B9CD1A000EBF74D /* Constants.swift */, + 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */, + 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */, + 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */, + 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */, + 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */, + 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */, + 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */, + 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */, + 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */, + ); + name = Style; sourceTree = ""; }; - 837BA0F019CCC619002AA13E /* Core */ = { + 3F387C1F1B9B3FA600B5CC74 /* Categories and Extensions */ = { isa = PBXGroup; children = ( - 837BA0F119CCC619002AA13E /* BNRDynamicTypeManager.h */, - 837BA0F219CCC619002AA13E /* BNRDynamicTypeManager.m */, - ); - path = Core; + 3F387C201B9B3FB200B5CC74 /* NSObject+block.h */, + 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */, + 3F387C221B9B3FB200B5CC74 /* UIColor+Hex.h */, + 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */, + 3F387C241B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.h */, + 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */, + 3F387C261B9B3FB200B5CC74 /* UIImage+Color.h */, + 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */, + 3F387C281B9B3FB200B5CC74 /* UIImage+Size.h */, + 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */, + 3F387C2A1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.h */, + 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */, + 3F387C2C1B9B3FB200B5CC74 /* UIView+Styling.h */, + 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */, + 3F387C2E1B9B3FB200B5CC74 /* UIViewController+Extras.h */, + 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */, + 3F387C301B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.h */, + 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */, + 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */, + 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */, + 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */, + 83F4EEBB1B9D3921007CF11A /* NSMutableDictionary+Safety.h */, + 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */, + 83F4EEBE1B9D3A8F007CF11A /* NSDictionary+Safety.h */, + 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */, + 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */, + ); + name = "Categories and Extensions"; sourceTree = ""; }; - 837BA0FF19CCFA69002AA13E /* CHTCollectionViewWaterfallLayout */ = { + 3F387C3B1B9B3FF000B5CC74 /* Extras */ = { isa = PBXGroup; children = ( - 837BA10019CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.h */, - 837BA10119CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.m */, + 3FE76E5C1B9B412E00099CF5 /* CrittercismSDK */, + 3FE76E541B9B40FF00099CF5 /* BNRDynamicTypeManager */, + 3FE76E4D1B9B40F300099CF5 /* PXAlertView */, + 3FE76E491B9B40DF00099CF5 /* DWTagList */, + 3FE76E411B9B40BB00099CF5 /* BlockAlert */, + 3FE76E441B9B40BB00099CF5 /* FDWaveformView */, ); - path = CHTCollectionViewWaterfallLayout; + name = Extras; sourceTree = ""; }; - 837C98D519A82403002A9B34 /* UserList */ = { + 3FE76E411B9B40BB00099CF5 /* BlockAlert */ = { isa = PBXGroup; children = ( - 837C98D619A82411002A9B34 /* RYUserListViewController.h */, - 837C98D719A82411002A9B34 /* RYUserListViewController.m */, - 837BA0E119CCAED8002AA13E /* RYUserListCollectionViewCell.h */, - 837BA0E219CCAED8002AA13E /* RYUserListCollectionViewCell.m */, + 3FE76E421B9B40BB00099CF5 /* BlockAlertView.h */, + 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */, ); - path = UserList; - sourceTree = ""; - }; - 83BF313719C9FFC200F5BE48 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - 83BF313819C9FFC200F5BE48 /* MKAnnotationView+WebCache.h */, - 83BF313919C9FFC200F5BE48 /* MKAnnotationView+WebCache.m */, - 83BF313A19C9FFC200F5BE48 /* NSData+ImageContentType.h */, - 83BF313B19C9FFC200F5BE48 /* NSData+ImageContentType.m */, - 83BF313C19C9FFC200F5BE48 /* SDImageCache.h */, - 83BF313D19C9FFC200F5BE48 /* SDImageCache.m */, - 83BF313E19C9FFC200F5BE48 /* SDWebImageCompat.h */, - 83BF313F19C9FFC200F5BE48 /* SDWebImageCompat.m */, - 83BF314019C9FFC200F5BE48 /* SDWebImageDecoder.h */, - 83BF314119C9FFC200F5BE48 /* SDWebImageDecoder.m */, - 83BF314219C9FFC200F5BE48 /* SDWebImageDownloader.h */, - 83BF314319C9FFC200F5BE48 /* SDWebImageDownloader.m */, - 83BF314419C9FFC200F5BE48 /* SDWebImageDownloaderOperation.h */, - 83BF314519C9FFC200F5BE48 /* SDWebImageDownloaderOperation.m */, - 83BF314619C9FFC200F5BE48 /* SDWebImageManager.h */, - 83BF314719C9FFC200F5BE48 /* SDWebImageManager.m */, - 83BF314819C9FFC200F5BE48 /* SDWebImageOperation.h */, - 83BF314919C9FFC200F5BE48 /* SDWebImagePrefetcher.h */, - 83BF314A19C9FFC200F5BE48 /* SDWebImagePrefetcher.m */, - 83BF314B19C9FFC200F5BE48 /* UIButton+WebCache.h */, - 83BF314C19C9FFC200F5BE48 /* UIButton+WebCache.m */, - 83BF314D19C9FFC200F5BE48 /* UIImage+GIF.h */, - 83BF314E19C9FFC200F5BE48 /* UIImage+GIF.m */, - 83BF314F19C9FFC200F5BE48 /* UIImage+MultiFormat.h */, - 83BF315019C9FFC200F5BE48 /* UIImage+MultiFormat.m */, - 83BF315119C9FFC200F5BE48 /* UIImage+WebP.h */, - 83BF315219C9FFC200F5BE48 /* UIImage+WebP.m */, - 83BF315319C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.h */, - 83BF315419C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.m */, - 83BF315519C9FFC200F5BE48 /* UIImageView+WebCache.h */, - 83BF315619C9FFC200F5BE48 /* UIImageView+WebCache.m */, - 83BF315719C9FFC200F5BE48 /* UIView+WebCacheOperation.h */, - 83BF315819C9FFC200F5BE48 /* UIView+WebCacheOperation.m */, - ); - path = SDWebImage; + name = BlockAlert; + path = Frameworks/BlockAlert; sourceTree = ""; }; - 83C354B019BBAD28000A5BD4 /* RiffStream */ = { + 3FE76E441B9B40BB00099CF5 /* FDWaveformView */ = { isa = PBXGroup; children = ( - 83C354B119BBAD41000A5BD4 /* RYRiffStreamViewController.h */, - 83C354B219BBAD41000A5BD4 /* RYRiffStreamViewController.m */, + 3FE76E451B9B40BB00099CF5 /* FDWaveformView.h */, + 3FE76E461B9B40BB00099CF5 /* FDWaveformView.m */, ); - path = RiffStream; + name = FDWaveformView; + path = Frameworks/FDWaveformView; sourceTree = ""; }; - 83C6CA7618FAECD200412469 /* RiffEdit */ = { + 3FE76E491B9B40DF00099CF5 /* DWTagList */ = { isa = PBXGroup; children = ( - 835516731951314400CF2C23 /* RiffCreate */, - 8355167019512CF100CF2C23 /* RYRiffCreateOldViewController.h */, - 8355167119512CF100CF2C23 /* RYRiffCreateOldViewController.m */, + 3FE76E4A1B9B40DF00099CF5 /* DWTagList.h */, + 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */, ); - name = RiffEdit; - path = UI/Profile/RiffEdit; - sourceTree = ""; - }; - 83CA118B1995CD23002610E8 /* FLEX */ = { - isa = PBXGroup; - children = ( - 83CA118C1995CD23002610E8 /* Editing */, - 83CA11B21995CD23002610E8 /* Explorer Toolbar */, - 83CA11BE1995CD23002610E8 /* Global State Explorers */, - 83CA11CF1995CD23002610E8 /* Object Explorers */, - 83CA11E81995CD23002610E8 /* Utility */, - 83CA11F11995CD23002610E8 /* View Hierarchy */, - ); - path = FLEX; - sourceTree = ""; - }; - 83CA118C1995CD23002610E8 /* Editing */ = { - isa = PBXGroup; - children = ( - 83CA118D1995CD23002610E8 /* Argument Input Views */, - 83CA11A61995CD23002610E8 /* FLEXDefaultEditorViewController.h */, - 83CA11A71995CD23002610E8 /* FLEXDefaultEditorViewController.m */, - 83CA11A81995CD23002610E8 /* FLEXFieldEditorView.h */, - 83CA11A91995CD23002610E8 /* FLEXFieldEditorView.m */, - 83CA11AA1995CD23002610E8 /* FLEXFieldEditorViewController.h */, - 83CA11AB1995CD23002610E8 /* FLEXFieldEditorViewController.m */, - 83CA11AC1995CD23002610E8 /* FLEXIvarEditorViewController.h */, - 83CA11AD1995CD23002610E8 /* FLEXIvarEditorViewController.m */, - 83CA11AE1995CD23002610E8 /* FLEXMethodCallingViewController.h */, - 83CA11AF1995CD23002610E8 /* FLEXMethodCallingViewController.m */, - 83CA11B01995CD23002610E8 /* FLEXPropertyEditorViewController.h */, - 83CA11B11995CD23002610E8 /* FLEXPropertyEditorViewController.m */, - ); - path = Editing; - sourceTree = ""; - }; - 83CA118D1995CD23002610E8 /* Argument Input Views */ = { - isa = PBXGroup; - children = ( - 83CA118E1995CD23002610E8 /* FLEXArgumentInputColorView.h */, - 83CA118F1995CD23002610E8 /* FLEXArgumentInputColorView.m */, - 83CA11901995CD23002610E8 /* FLEXArgumentInputFontsPickerView.h */, - 83CA11911995CD23002610E8 /* FLEXArgumentInputFontsPickerView.m */, - 83CA11921995CD23002610E8 /* FLEXArgumentInputFontView.h */, - 83CA11931995CD23002610E8 /* FLEXArgumentInputFontView.m */, - 83CA11941995CD23002610E8 /* FLEXArgumentInputJSONObjectView.h */, - 83CA11951995CD23002610E8 /* FLEXArgumentInputJSONObjectView.m */, - 83CA11961995CD23002610E8 /* FLEXArgumentInputNotSupportedView.h */, - 83CA11971995CD23002610E8 /* FLEXArgumentInputNotSupportedView.m */, - 83CA11981995CD23002610E8 /* FLEXArgumentInputNumberView.h */, - 83CA11991995CD23002610E8 /* FLEXArgumentInputNumberView.m */, - 83CA119A1995CD23002610E8 /* FLEXArgumentInputStringView.h */, - 83CA119B1995CD23002610E8 /* FLEXArgumentInputStringView.m */, - 83CA119C1995CD23002610E8 /* FLEXArgumentInputStructView.h */, - 83CA119D1995CD23002610E8 /* FLEXArgumentInputStructView.m */, - 83CA119E1995CD23002610E8 /* FLEXArgumentInputSwitchView.h */, - 83CA119F1995CD23002610E8 /* FLEXArgumentInputSwitchView.m */, - 83CA11A01995CD23002610E8 /* FLEXArgumentInputTextView.h */, - 83CA11A11995CD23002610E8 /* FLEXArgumentInputTextView.m */, - 83CA11A21995CD23002610E8 /* FLEXArgumentInputView.h */, - 83CA11A31995CD23002610E8 /* FLEXArgumentInputView.m */, - 83CA11A41995CD23002610E8 /* FLEXArgumentInputViewFactory.h */, - 83CA11A51995CD23002610E8 /* FLEXArgumentInputViewFactory.m */, - ); - path = "Argument Input Views"; + name = DWTagList; + path = Frameworks/DWTagList; sourceTree = ""; }; - 83CA11B21995CD23002610E8 /* Explorer Toolbar */ = { + 3FE76E4D1B9B40F300099CF5 /* PXAlertView */ = { isa = PBXGroup; children = ( - 83CA11B31995CD23002610E8 /* FLEXExplorerToolbar.h */, - 83CA11B41995CD23002610E8 /* FLEXExplorerToolbar.m */, - 83CA11B51995CD23002610E8 /* FLEXExplorerViewController.h */, - 83CA11B61995CD23002610E8 /* FLEXExplorerViewController.m */, - 83CA11B71995CD23002610E8 /* FLEXManager+Private.h */, - 83CA11B81995CD23002610E8 /* FLEXManager.h */, - 83CA11B91995CD23002610E8 /* FLEXManager.m */, - 83CA11BA1995CD23002610E8 /* FLEXToolbarItem.h */, - 83CA11BB1995CD23002610E8 /* FLEXToolbarItem.m */, - 83CA11BC1995CD23002610E8 /* FLEXWindow.h */, - 83CA11BD1995CD23002610E8 /* FLEXWindow.m */, - ); - path = "Explorer Toolbar"; - sourceTree = ""; - }; - 83CA11BE1995CD23002610E8 /* Global State Explorers */ = { - isa = PBXGroup; - children = ( - 83CA11BF1995CD23002610E8 /* FLEXClassesTableViewController.h */, - 83CA11C01995CD23002610E8 /* FLEXClassesTableViewController.m */, - 83CA11C11995CD23002610E8 /* FLEXFileBrowserSearchOperation.h */, - 83CA11C21995CD23002610E8 /* FLEXFileBrowserSearchOperation.m */, - 83CA11C31995CD23002610E8 /* FLEXFileBrowserTableViewController.h */, - 83CA11C41995CD23002610E8 /* FLEXFileBrowserTableViewController.m */, - 83CA11C51995CD23002610E8 /* FLEXGlobalsTableViewController.h */, - 83CA11C61995CD23002610E8 /* FLEXGlobalsTableViewController.m */, - 83CA11C71995CD23002610E8 /* FLEXInstancesTableViewController.h */, - 83CA11C81995CD23002610E8 /* FLEXInstancesTableViewController.m */, - 83CA11C91995CD23002610E8 /* FLEXLibrariesTableViewController.h */, - 83CA11CA1995CD23002610E8 /* FLEXLibrariesTableViewController.m */, - 83CA11CB1995CD23002610E8 /* FLEXLiveObjectsTableViewController.h */, - 83CA11CC1995CD23002610E8 /* FLEXLiveObjectsTableViewController.m */, - 83CA11CD1995CD23002610E8 /* FLEXWebViewController.h */, - 83CA11CE1995CD23002610E8 /* FLEXWebViewController.m */, - ); - path = "Global State Explorers"; - sourceTree = ""; - }; - 83CA11CF1995CD23002610E8 /* Object Explorers */ = { - isa = PBXGroup; - children = ( - 83CA11D01995CD23002610E8 /* FLEXArrayExplorerViewController.h */, - 83CA11D11995CD23002610E8 /* FLEXArrayExplorerViewController.m */, - 83CA11D21995CD23002610E8 /* FLEXClassExplorerViewController.h */, - 83CA11D31995CD23002610E8 /* FLEXClassExplorerViewController.m */, - 83CA11D41995CD23002610E8 /* FLEXDefaultsExplorerViewController.h */, - 83CA11D51995CD23002610E8 /* FLEXDefaultsExplorerViewController.m */, - 83CA11D61995CD23002610E8 /* FLEXDescriptionTableViewCell.h */, - 83CA11D71995CD23002610E8 /* FLEXDescriptionTableViewCell.m */, - 83CA11D81995CD23002610E8 /* FLEXDictionaryExplorerViewController.h */, - 83CA11D91995CD23002610E8 /* FLEXDictionaryExplorerViewController.m */, - 83CA11DA1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.h */, - 83CA11DB1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.m */, - 83CA11DC1995CD23002610E8 /* FLEXImageExplorerViewController.h */, - 83CA11DD1995CD23002610E8 /* FLEXImageExplorerViewController.m */, - 83CA11DE1995CD23002610E8 /* FLEXObjectExplorerFactory.h */, - 83CA11DF1995CD23002610E8 /* FLEXObjectExplorerFactory.m */, - 83CA11E01995CD23002610E8 /* FLEXObjectExplorerViewController.h */, - 83CA11E11995CD23002610E8 /* FLEXObjectExplorerViewController.m */, - 83CA11E21995CD23002610E8 /* FLEXSetExplorerViewController.h */, - 83CA11E31995CD23002610E8 /* FLEXSetExplorerViewController.m */, - 83CA11E41995CD23002610E8 /* FLEXViewControllerExplorerViewController.h */, - 83CA11E51995CD23002610E8 /* FLEXViewControllerExplorerViewController.m */, - 83CA11E61995CD23002610E8 /* FLEXViewExplorerViewController.h */, - 83CA11E71995CD23002610E8 /* FLEXViewExplorerViewController.m */, - ); - path = "Object Explorers"; - sourceTree = ""; - }; - 83CA11E81995CD23002610E8 /* Utility */ = { - isa = PBXGroup; - children = ( - 83CA11E91995CD23002610E8 /* FLEXHeapEnumerator.h */, - 83CA11EA1995CD23002610E8 /* FLEXHeapEnumerator.m */, - 83CA11EB1995CD23002610E8 /* FLEXResources.h */, - 83CA11EC1995CD23002610E8 /* FLEXResources.m */, - 83CA11ED1995CD23002610E8 /* FLEXRuntimeUtility.h */, - 83CA11EE1995CD23002610E8 /* FLEXRuntimeUtility.m */, - 83CA11EF1995CD23002610E8 /* FLEXUtility.h */, - 83CA11F01995CD23002610E8 /* FLEXUtility.m */, - ); - path = Utility; - sourceTree = ""; - }; - 83CA11F11995CD23002610E8 /* View Hierarchy */ = { - isa = PBXGroup; - children = ( - 83CA11F21995CD23002610E8 /* FLEXHierarchyTableViewCell.h */, - 83CA11F31995CD23002610E8 /* FLEXHierarchyTableViewCell.m */, - 83CA11F41995CD23002610E8 /* FLEXHierarchyTableViewController.h */, - 83CA11F51995CD23002610E8 /* FLEXHierarchyTableViewController.m */, - 83CA11F61995CD23002610E8 /* FLEXImagePreviewViewController.h */, - 83CA11F71995CD23002610E8 /* FLEXImagePreviewViewController.m */, - ); - path = "View Hierarchy"; - sourceTree = ""; - }; - 83CA122A19981059002610E8 /* AudioDeck */ = { - isa = PBXGroup; - children = ( - 83CA122E19981087002610E8 /* RYAudioDeckManager.h */, - 83CA122F19981087002610E8 /* RYAudioDeckManager.m */, - 83CA122B19981070002610E8 /* RYAudioDeckViewController.h */, - 83CA122C19981070002610E8 /* RYAudioDeckViewController.m */, - 83CA123119981702002610E8 /* RYAudioDeckTableViewCell.h */, - 83CA123219981702002610E8 /* RYAudioDeckTableViewCell.m */, - ); - path = AudioDeck; - sourceTree = ""; - }; - 83CCC8E8197EFCBF00FD1B4B /* AFNetworking */ = { - isa = PBXGroup; - children = ( - 83CCC8E9197EFCBF00FD1B4B /* AFHTTPRequestOperation.h */, - 83CCC8EA197EFCBF00FD1B4B /* AFHTTPRequestOperation.m */, - 83CCC8EB197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.h */, - 83CCC8EC197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.m */, - 83CCC8ED197EFCBF00FD1B4B /* AFHTTPSessionManager.h */, - 83CCC8EE197EFCBF00FD1B4B /* AFHTTPSessionManager.m */, - 83CCC8EF197EFCBF00FD1B4B /* AFNetworking.h */, - 83CCC8F0197EFCBF00FD1B4B /* AFNetworkReachabilityManager.h */, - 83CCC8F1197EFCBF00FD1B4B /* AFNetworkReachabilityManager.m */, - 83CCC8F2197EFCBF00FD1B4B /* AFSecurityPolicy.h */, - 83CCC8F3197EFCBF00FD1B4B /* AFSecurityPolicy.m */, - 83CCC8F4197EFCBF00FD1B4B /* AFURLConnectionOperation.h */, - 83CCC8F5197EFCBF00FD1B4B /* AFURLConnectionOperation.m */, - 83CCC8F6197EFCBF00FD1B4B /* AFURLRequestSerialization.h */, - 83CCC8F7197EFCBF00FD1B4B /* AFURLRequestSerialization.m */, - 83CCC8F8197EFCBF00FD1B4B /* AFURLResponseSerialization.h */, - 83CCC8F9197EFCBF00FD1B4B /* AFURLResponseSerialization.m */, - 83CCC8FA197EFCBF00FD1B4B /* AFURLSessionManager.h */, - 83CCC8FB197EFCBF00FD1B4B /* AFURLSessionManager.m */, - ); - path = AFNetworking; + 3FE76E4E1B9B40F300099CF5 /* PXAlertView+Customization.h */, + 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */, + 3FE76E501B9B40F300099CF5 /* PXAlertView.h */, + 3FE76E511B9B40F300099CF5 /* PXAlertView.m */, + ); + name = PXAlertView; + path = Frameworks/PXAlertView; sourceTree = ""; }; - 83CCC8FC197EFCBF00FD1B4B /* UIKit+AFNetworking */ = { + 3FE76E541B9B40FF00099CF5 /* BNRDynamicTypeManager */ = { isa = PBXGroup; children = ( - 83CCC8FD197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.h */, - 83CCC8FE197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.m */, - 83CCC8FF197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.h */, - 83CCC900197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.m */, - 83CCC901197EFCBF00FD1B4B /* UIAlertView+AFNetworking.h */, - 83CCC902197EFCBF00FD1B4B /* UIAlertView+AFNetworking.m */, - 83CCC903197EFCBF00FD1B4B /* UIButton+AFNetworking.h */, - 83CCC904197EFCBF00FD1B4B /* UIButton+AFNetworking.m */, - 83CCC905197EFCBF00FD1B4B /* UIImageView+AFNetworking.h */, - 83CCC906197EFCBF00FD1B4B /* UIImageView+AFNetworking.m */, - 83CCC907197EFCBF00FD1B4B /* UIKit+AFNetworking.h */, - 83CCC908197EFCBF00FD1B4B /* UIProgressView+AFNetworking.h */, - 83CCC909197EFCBF00FD1B4B /* UIProgressView+AFNetworking.m */, - 83CCC90A197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.h */, - 83CCC90B197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.m */, - 83CCC90C197EFCBF00FD1B4B /* UIWebView+AFNetworking.h */, - 83CCC90D197EFCBF00FD1B4B /* UIWebView+AFNetworking.m */, - ); - path = "UIKit+AFNetworking"; + 3FE76E551B9B40FF00099CF5 /* Core */, + ); + name = BNRDynamicTypeManager; + path = Frameworks/BNRDynamicTypeManager; sourceTree = ""; }; - 83DBCA7818F99E2000262496 /* Base Classes */ = { + 3FE76E551B9B40FF00099CF5 /* Core */ = { isa = PBXGroup; children = ( - 83DBCA7918F99E3F00262496 /* RYRiffStreamingCoreViewController.h */, - 83DBCA7A18F99E3F00262496 /* RYRiffStreamingCoreViewController.m */, - 830BBCE618FA589F00A9C53F /* RYCorePageViewController.h */, - 830BBCE718FA589F00A9C53F /* RYCorePageViewController.m */, - 830BBCE318FA57F200A9C53F /* RYCoreViewController.h */, - 830BBCE418FA57F200A9C53F /* RYCoreViewController.m */, - ); - path = "Base Classes"; + 3FE76E561B9B40FF00099CF5 /* BNRDynamicTypeManager.h */, + 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */, + ); + path = Core; sourceTree = ""; }; - 83E56B5F1953A07F00EF054C /* Objects */ = { + 3FE76E5C1B9B412E00099CF5 /* CrittercismSDK */ = { isa = PBXGroup; children = ( - 83E56B621953A0A900EF054C /* RYUser.h */, - 83E56B631953A0A900EF054C /* RYUser.m */, - 83FCD1B918F9413400A493F0 /* RYPost.h */, - 83FCD1BA18F9413400A493F0 /* RYPost.m */, - 837CCD1519A3E12D00F95FCA /* RYTag.h */, - 837CCD1619A3E12D00F95FCA /* RYTag.m */, - 83360CDB19B6B84E00136FCB /* RYNotification.h */, - 83360CDC19B6B84E00136FCB /* RYNotification.m */, - ); - path = Objects; + 3FE76E5D1B9B412E00099CF5 /* CRFilter.h */, + 3FE76E5E1B9B412E00099CF5 /* Crittercism.h */, + 3FE76E5F1B9B412E00099CF5 /* CrittercismDelegate.h */, + 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */, + 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */, + ); + name = CrittercismSDK; + path = Frameworks/CrittercismSDK; sourceTree = ""; }; - 83EB8BA319959F5C0007837D /* DWTagList */ = { + 3FE76E661B9B43E700099CF5 /* Main Application */ = { isa = PBXGroup; children = ( - 83EB8BA419959F5C0007837D /* DWTagList.h */, - 83EB8BA519959F5C0007837D /* DWTagList.m */, + 3FE76E591B9B411C00099CF5 /* RYAppDelegate.h */, + 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */, + 3F387BAC1B9B3C2B00B5CC74 /* RYTabBarViewController.h */, + 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */, + 3FF2A49C1B9CDF4F00EBF74D /* Ryff-Bridging-Header.h */, ); - path = DWTagList; + name = "Main Application"; sourceTree = ""; }; - 83ED34D61931851600FEB018 /* Icon */ = { + 5BD8AE6B5B14CE56E937FC6A /* Pods */ = { isa = PBXGroup; children = ( - 83ED34D71931851600FEB018 /* App Icon [Squared] */, + 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */, + 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */, + 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */, + 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */, ); - path = Icon; - sourceTree = ""; - }; - 83ED34D71931851600FEB018 /* App Icon [Squared] */ = { - isa = PBXGroup; - children = ( - 83ED34D81931851600FEB018 /* AppIcon29x29.png */, - 83ED34D91931851600FEB018 /* AppIcon29x29@2x.png */, - 83ED34DA1931851600FEB018 /* AppIcon40x40.png */, - 83ED34DB1931851600FEB018 /* AppIcon40x40@2x.png */, - 83ED34DC1931851600FEB018 /* AppIcon50x50.png */, - 83ED34DD1931851600FEB018 /* AppIcon50x50@2x.png */, - 83ED34DE1931851600FEB018 /* AppIcon57x57.png */, - 83ED34DF1931851600FEB018 /* AppIcon57x57@2x.png */, - 83ED34E01931851600FEB018 /* AppIcon60x60.png */, - 83ED34E11931851600FEB018 /* AppIcon60x60@2x.png */, - 83ED34E21931851600FEB018 /* AppIcon72x72.png */, - 83ED34E31931851600FEB018 /* AppIcon72x72@2x.png */, - 83ED34E41931851600FEB018 /* AppIcon76x76.png */, - 83ED34E51931851600FEB018 /* AppIcon76x76@2x.png */, - 83ED34E61931851600FEB018 /* iTunesArtwork.png */, - 83ED34E71931851600FEB018 /* iTunesArtwork@2x.png */, - ); - path = "App Icon [Squared]"; + name = Pods; sourceTree = ""; }; 83FCD12F18F907C400A493F0 = { @@ -1439,6 +800,7 @@ 83FCD16318F907C400A493F0 /* RyffTests */, 83FCD13A18F907C400A493F0 /* Frameworks */, 83FCD13918F907C400A493F0 /* Products */, + 5BD8AE6B5B14CE56E937FC6A /* Pods */, ); sourceTree = ""; }; @@ -1460,6 +822,8 @@ 83FCD13D18F907C400A493F0 /* CoreGraphics.framework */, 83FCD13F18F907C400A493F0 /* UIKit.framework */, 83FCD15D18F907C400A493F0 /* XCTest.framework */, + CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */, + E251082A40810E7130987A45 /* Pods_RyffTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -1467,27 +831,15 @@ 83FCD14118F907C400A493F0 /* Ryff */ = { isa = PBXGroup; children = ( - 833E1D511975DFA90002A2BE /* Extras */, - 836F483719A04BAB00E948BE /* Categories */, - 83DBCA7818F99E2000262496 /* Base Classes */, - 83FCD1A918F93E6C00A493F0 /* Images */, - 83FCD1A518F9393500A493F0 /* Style */, - 83FCD1A018F921AB00A493F0 /* Data */, - 83FCD14A18F907C400A493F0 /* RYAppDelegate.h */, - 83FCD14B18F907C400A493F0 /* RYAppDelegate.m */, - 83B73E4D19DF526E001C746E /* Ryff-Bridging-Header.h */, - 8397133E1936DD1100913996 /* Main.storyboard */, - 83FCD14D18F907C400A493F0 /* MainIphone.storyboard */, - 83FCD18C18F9142600A493F0 /* Newsfeed */, - 83302D8C19C7A1F7008C5A54 /* Discover */, - 83CA122A19981059002610E8 /* AudioDeck */, - 83FCD17318F909CB00A493F0 /* Profile */, - 83C6CA7618FAECD200412469 /* RiffEdit */, - 830185F119009C2B00093EFA /* Login */, + 3FE76E661B9B43E700099CF5 /* Main Application */, + 3F387BFD1B9B3C3700B5CC74 /* Data */, + 3F387C011B9B3D6A00B5CC74 /* User Interface */, + 3F387C0B1B9B3F5300B5CC74 /* Audio Mixer */, + 3F387C1F1B9B3FA600B5CC74 /* Categories and Extensions */, + 3F387C0C1B9B3F6D00B5CC74 /* Style */, + 3F387C3B1B9B3FF000B5CC74 /* Extras */, 83FCD15618F907C400A493F0 /* Images.xcassets */, 83FCD14218F907C400A493F0 /* Supporting Files */, - 83FCD1B618F9405F00A493F0 /* RYCoreTabBarViewController.h */, - 83FCD1B718F9405F00A493F0 /* RYCoreTabBarViewController.m */, ); path = Ryff; sourceTree = ""; @@ -1499,6 +851,7 @@ 83FCD14418F907C400A493F0 /* InfoPlist.strings */, 83FCD14718F907C400A493F0 /* main.m */, 83FCD14918F907C400A493F0 /* Ryff-Prefix.pch */, + 3F15B36E1B9A2EA6009F3790 /* SwiftCompatability.h */, ); name = "Supporting Files"; sourceTree = ""; @@ -1521,119 +874,6 @@ name = "Supporting Files"; sourceTree = ""; }; - 83FCD17318F909CB00A493F0 /* Profile */ = { - isa = PBXGroup; - children = ( - 83360CCE19B6A7C800136FCB /* Notifications */, - 83FCD17418F909DB00A493F0 /* RYProfileViewController.h */, - 83FCD17518F909DB00A493F0 /* RYProfileViewController.m */, - 837E9AC41981E3360052E006 /* RYProfileInfoTableViewCell.h */, - 837E9AC51981E3360052E006 /* RYProfileInfoTableViewCell.m */, - ); - name = Profile; - path = UI/Profile; - sourceTree = ""; - }; - 83FCD17718F90BE700A493F0 /* RiffCell */ = { - isa = PBXGroup; - children = ( - 834FEC0C19897E4B00C3D9B9 /* RYRiffCell.xib */, - 832658A419BA416C0047D93B /* RYRiffCellAvatar.xib */, - 8309553719CA5EAC000A41B3 /* RYRiffDetailsCell.xib */, - 834FEC0E19897E6600C3D9B9 /* RYRiffCell.h */, - 834FEC0F19897E6600C3D9B9 /* RYRiffCell.m */, - ); - name = RiffCell; - path = ../UI/Profile/RiffCell; - sourceTree = ""; - }; - 83FCD18C18F9142600A493F0 /* Newsfeed */ = { - isa = PBXGroup; - children = ( - 83082FE519B55DDD000AFACB /* TagFeed */, - 83FCD17718F90BE700A493F0 /* RiffCell */, - 833FC1AF1989E467002491C8 /* RiffDetails */, - 837C98D519A82403002A9B34 /* UserList */, - 83C354B019BBAD28000A5BD4 /* RiffStream */, - 83FCD18D18F9144100A493F0 /* RYNewsfeedTableViewController.h */, - 83FCD18E18F9144100A493F0 /* RYNewsfeedTableViewController.m */, - 831E5FF819A03269007F3C31 /* RYNewsfeedNavigationController.h */, - 831E5FF919A03269007F3C31 /* RYNewsfeedNavigationController.m */, - 8398EC8219A012D800130EFC /* RYNewsfeedContainerViewController.h */, - 8398EC8319A012D800130EFC /* RYNewsfeedContainerViewController.m */, - ); - path = Newsfeed; - sourceTree = ""; - }; - 83FCD1A018F921AB00A493F0 /* Data */ = { - isa = PBXGroup; - children = ( - 83360CD719B6B75300136FCB /* Services */, - 83E56B5F1953A07F00EF054C /* Objects */, - 830BBCC518FA0A4500A9C53F /* Location */, - 83E56B661953A0DA00EF054C /* RYMediaEditor.h */, - 83E56B671953A0DA00EF054C /* RYMediaEditor.m */, - 831B96061964DEC6003A8616 /* RYDataManager.h */, - 831B96071964DEC6003A8616 /* RYDataManager.m */, - ); - path = Data; - sourceTree = ""; - }; - 83FCD1A518F9393500A493F0 /* Style */ = { - isa = PBXGroup; - children = ( - 8310F5A71981F8BF00250172 /* Custom UI Objects */, - 83ED34CC19316E5D00FEB018 /* Lato-Lig.ttf */, - 83ED34CD19316E5D00FEB018 /* Lato-RegIta.ttf */, - 83FA50B51931524E00F1F3A7 /* Lato-Bol.ttf */, - 83FA50B61931524E00F1F3A7 /* Lato-Reg.ttf */, - 83FCD1A618F9393F00A493F0 /* RYStyleSheet.h */, - 83FCD1A718F9393F00A493F0 /* RYStyleSheet.m */, - 830185FC1900AEB300093EFA /* UIColor+Hex.h */, - 830185FD1900AEB300093EFA /* UIColor+Hex.m */, - ); - path = Style; - sourceTree = ""; - }; - 83FCD1A918F93E6C00A493F0 /* Images */ = { - isa = PBXGroup; - children = ( - 83082FDB19B4F303000AFACB /* airplayIcon.png */, - 83082FDC19B4F303000AFACB /* airplayIcon@2x.png */, - 83082FDF19B52256000AFACB /* sliderSmall.png */, - 83082FE019B52256000AFACB /* sliderSmall@2x.png */, - 8322308F19AFFCC200C60033 /* sliderFull.png */, - 8322309019AFFCC200C60033 /* sliderFull@2x.png */, - 8322309119AFFCC200C60033 /* sliderSeek.png */, - 8322309219AFFCC200C60033 /* sliderSeek@2x.png */, - 831A8890199EEEDD00C44CED /* 1.0 images */, - 83C6A5F01960EC5200BB3D1A /* plus.png */, - 83C6A5F11960EC5200BB3D1A /* plus@2x.png */, - 83C6A5EC1960EB9600BB3D1A /* record.png */, - 83C6A5ED1960EB9600BB3D1A /* record@2x.png */, - 83ED34D61931851600FEB018 /* Icon */, - 830185FF1900B1CD00093EFA /* tabBar.png */, - 830186001900B1CD00093EFA /* tabBar@2x.png */, - 83C6CA7D18FAFF5200412469 /* back.png */, - 83C6CA7E18FAFF5200412469 /* back@2x.png */, - 83C6CA7F18FAFF5200412469 /* cloud.png */, - 83C6CA8018FAFF5200412469 /* cloud@2x.png */, - 83C6CA8118FAFF5200412469 /* reset.png */, - 83C6CA8218FAFF5200412469 /* reset@2x.png */, - 830BBCDB18FA401700A9C53F /* friend.png */, - 830BBCDC18FA401700A9C53F /* friend@2x.png */, - 830BBCD718FA196300A9C53F /* userBig.png */, - 830BBCD818FA196300A9C53F /* userBig@2x.png */, - 83FCD1AC18F93F5500A493F0 /* artists.png */, - 83FCD1AD18F93F5500A493F0 /* artists@2x.png */, - 83FCD1AE18F93F5500A493F0 /* user@2x.png */, - 83FCD1AA18F93E6C00A493F0 /* user.png */, - 830BBCC118FA081600A9C53F /* checkmark.png */, - 830BBCC218FA081600A9C53F /* checkmark@2x.png */, - ); - path = Images; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1641,10 +881,13 @@ isa = PBXNativeTarget; buildConfigurationList = 83FCD16D18F907C400A493F0 /* Build configuration list for PBXNativeTarget "Ryff" */; buildPhases = ( + 14EE549E532443BF66C382E8 /* Check Pods Manifest.lock */, 83FCD13418F907C400A493F0 /* Sources */, 83FCD13518F907C400A493F0 /* Frameworks */, 83FCD13618F907C400A493F0 /* Resources */, 835E1E0719D21BFB007EBD74 /* Run Script */, + 7F9865D3E129952ED8C70A59 /* Copy Pods Resources */, + 0DB45C9E4B0C6A0C57AEE9C8 /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -1659,9 +902,12 @@ isa = PBXNativeTarget; buildConfigurationList = 83FCD17018F907C400A493F0 /* Build configuration list for PBXNativeTarget "RyffTests" */; buildPhases = ( + 02E5AC0A959165E21C0D7ADC /* Check Pods Manifest.lock */, 83FCD15818F907C400A493F0 /* Sources */, 83FCD15918F907C400A493F0 /* Frameworks */, 83FCD15A18F907C400A493F0 /* Resources */, + 3548D77566CAD9E664FC3FA6 /* Copy Pods Resources */, + 89A4492C7B6EF4DDA854E096 /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -1680,10 +926,15 @@ isa = PBXProject; attributes = { CLASSPREFIX = RY; - LastUpgradeCheck = 0510; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Chris Laganiere"; TargetAttributes = { + 83FCD13718F907C400A493F0 = { + DevelopmentTeam = DGUKNK322A; + }; 83FCD15B18F907C400A493F0 = { + DevelopmentTeam = DGUKNK322A; TestTargetID = 83FCD13718F907C400A493F0; }; }; @@ -1712,112 +963,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8322309419AFFCC200C60033 /* sliderFull@2x.png in Resources */, - 831A88A9199EEEDD00C44CED /* next.png in Resources */, - 83ED34E91931851600FEB018 /* AppIcon29x29@2x.png in Resources */, - 831A88AE199EEEDD00C44CED /* play@2x.png in Resources */, - 831A88BD199EEEDD00C44CED /* upvote.png in Resources */, - 8322309619AFFCC200C60033 /* sliderSeek@2x.png in Resources */, - 8384965F19CBD62D0033EF92 /* check.png in Resources */, - 831A88B3199EEEDD00C44CED /* remix.png in Resources */, - 834FEC0D19897E4B00C3D9B9 /* RYRiffCell.xib in Resources */, - 830186021900B1CD00093EFA /* tabBar@2x.png in Resources */, - 8373680519A8344600D9559D /* userAdd@2x.png in Resources */, - 8322309519AFFCC200C60033 /* sliderSeek.png in Resources */, - 8373680319A8344600D9559D /* notification@2x.png in Resources */, - 830BBCE018FA401700A9C53F /* friend@2x.png in Resources */, - 83C6CA8718FAFF5200412469 /* reset.png in Resources */, - 830186011900B1CD00093EFA /* tabBar.png in Resources */, - 831A88AC199EEEDD00C44CED /* pause@2x.png in Resources */, - 835E483019AE634B002A3AC2 /* options@2x.png in Resources */, - 83ED34ED1931851600FEB018 /* AppIcon50x50@2x.png in Resources */, - 831A88B7199EEEDD00C44CED /* star.png in Resources */, - 83ED34F11931851600FEB018 /* AppIcon60x60@2x.png in Resources */, - 835E1E0519D21A50007EBD74 /* dsym_upload.sh in Resources */, - 831A88AF199EEEDD00C44CED /* playing.png in Resources */, - 83C6A5EE1960EB9600BB3D1A /* record.png in Resources */, - 8384966019CBD62D0033EF92 /* check@2x.png in Resources */, - 83C6A5F21960EC5200BB3D1A /* plus.png in Resources */, - 837367FC19A8344600D9559D /* globe.png in Resources */, - 8373680919A8344600D9559D /* userIcon@2x.png in Resources */, - 83C6A5F31960EC5200BB3D1A /* plus@2x.png in Resources */, - 830BBCB318F9F54900A9C53F /* SSKeychain.strings in Resources */, - 831A88B9199EEEDD00C44CED /* stream.png in Resources */, - 831A88B6199EEEDD00C44CED /* rss@2x.png in Resources */, - 83ED34F21931851600FEB018 /* AppIcon72x72.png in Resources */, - 8373680419A8344600D9559D /* userAdd.png in Resources */, - 83FADE4519AC405200182155 /* create.png in Resources */, - 831A88AB199EEEDD00C44CED /* pause.png in Resources */, - 831A88BF199EEEDD00C44CED /* x.png in Resources */, - 831A88BE199EEEDD00C44CED /* upvote@2x.png in Resources */, - 830BBCC318FA081600A9C53F /* checkmark.png in Resources */, + 3FE76E621B9B412E00099CF5 /* dsym_upload.sh in Resources */, + 3F387C121B9B3F8900B5CC74 /* Main.storyboard in Resources */, + 3FE76E691B9B443900099CF5 /* Media.xcassets in Resources */, 83FCD15718F907C400A493F0 /* Images.xcassets in Resources */, - 83082FE219B52256000AFACB /* sliderSmall@2x.png in Resources */, - 831A88BA199EEEDD00C44CED /* stream@2x.png in Resources */, + 3F387C1C1B9B3F9400B5CC74 /* Lato-Lig.ttf in Resources */, + 3F387C1B1B9B3F9400B5CC74 /* Lato-Bol.ttf in Resources */, + 3F387C161B9B3F8900B5CC74 /* RYRiffDetailsCell.xib in Resources */, + 3F387C151B9B3F8900B5CC74 /* RYRiffCellAvatar.xib in Resources */, + 3F387C141B9B3F8900B5CC74 /* RYRiffCell.xib in Resources */, + 3F387C1E1B9B3F9400B5CC74 /* Lato-RegIta.ttf in Resources */, 83FCD14618F907C400A493F0 /* InfoPlist.strings in Resources */, - 8322309319AFFCC200C60033 /* sliderFull.png in Resources */, - 832658A519BA416C0047D93B /* RYRiffCellAvatar.xib in Resources */, - 835E482F19AE634B002A3AC2 /* options.png in Resources */, - 83C354BA19BC2AB3000A5BD4 /* availableStream@2x.png in Resources */, - 831A88C0199EEEDD00C44CED /* x@2x.png in Resources */, - 83FA50B71931524E00F1F3A7 /* Lato-Bol.ttf in Resources */, - 83082FE119B52256000AFACB /* sliderSmall.png in Resources */, - 83FCD1AF18F93F5500A493F0 /* artists.png in Resources */, - 83ED34F51931851600FEB018 /* AppIcon76x76@2x.png in Resources */, - 83C6CA8818FAFF5200412469 /* reset@2x.png in Resources */, - 83C6CA8318FAFF5200412469 /* back.png in Resources */, - 83ED34EC1931851600FEB018 /* AppIcon50x50.png in Resources */, - 83C6CA8618FAFF5200412469 /* cloud@2x.png in Resources */, - 83ED34EB1931851600FEB018 /* AppIcon40x40@2x.png in Resources */, - 83C6CA8418FAFF5200412469 /* back@2x.png in Resources */, - 831A88B2199EEEDD00C44CED /* plus@2x.png in Resources */, - 83C354B919BC2AB3000A5BD4 /* availableStream.png in Resources */, - 837367FF19A8344600D9559D /* location@2x.png in Resources */, - 831A88B8199EEEDD00C44CED /* star@2x.png in Resources */, - 83082FDD19B4F303000AFACB /* airplayIcon.png in Resources */, - 83FCD1AB18F93E6C00A493F0 /* user.png in Resources */, - 83FCD1B118F93F5500A493F0 /* user@2x.png in Resources */, - 8373680719A8344600D9559D /* userDelete@2x.png in Resources */, - 830BBCDA18FA196300A9C53F /* userBig@2x.png in Resources */, - 830BBCD918FA196300A9C53F /* userBig.png in Resources */, - 837367FD19A8344600D9559D /* globe@2x.png in Resources */, - 830BBCC418FA081600A9C53F /* checkmark@2x.png in Resources */, - 83ED34CF19316E5D00FEB018 /* Lato-RegIta.ttf in Resources */, - 83ED34EF1931851600FEB018 /* AppIcon57x57@2x.png in Resources */, - 831A88AA199EEEDD00C44CED /* next@2x.png in Resources */, - 8373680119A8344600D9559D /* message@2x.png in Resources */, - 83ED34F61931851600FEB018 /* iTunesArtwork.png in Resources */, - 831A88BB199EEEDD00C44CED /* tag.png in Resources */, - 83C6A5EF1960EB9600BB3D1A /* record@2x.png in Resources */, - 83ED34F71931851600FEB018 /* iTunesArtwork@2x.png in Resources */, - 83FCD14F18F907C400A493F0 /* MainIphone.storyboard in Resources */, - 8373680019A8344600D9559D /* message.png in Resources */, - 83FA50B81931524E00F1F3A7 /* Lato-Reg.ttf in Resources */, - 8373680619A8344600D9559D /* userDelete.png in Resources */, - 83082FDE19B4F303000AFACB /* airplayIcon@2x.png in Resources */, - 83ED34E81931851600FEB018 /* AppIcon29x29.png in Resources */, - 83ED34F01931851600FEB018 /* AppIcon60x60.png in Resources */, - 83ED34EA1931851600FEB018 /* AppIcon40x40.png in Resources */, - 83FADE4619AC405200182155 /* create@2x.png in Resources */, - 830BBCDF18FA401700A9C53F /* friend.png in Resources */, - 831A88B5199EEEDD00C44CED /* rss.png in Resources */, - 831A88B0199EEEDD00C44CED /* playing@2x.png in Resources */, - 831A88B4199EEEDD00C44CED /* remix@2x.png in Resources */, - 831A88AD199EEEDD00C44CED /* play.png in Resources */, - 83ED34CE19316E5D00FEB018 /* Lato-Lig.ttf in Resources */, - 831A88B1199EEEDD00C44CED /* plus.png in Resources */, - 8373680219A8344600D9559D /* notification.png in Resources */, - 837367FE19A8344600D9559D /* location.png in Resources */, - 83ED34EE1931851600FEB018 /* AppIcon57x57.png in Resources */, - 8309553819CA5EAC000A41B3 /* RYRiffDetailsCell.xib in Resources */, - 83ED34F41931851600FEB018 /* AppIcon76x76.png in Resources */, - 838E5F4419E220510005CB34 /* RiffCreate.storyboard in Resources */, - 83ED34F31931851600FEB018 /* AppIcon72x72@2x.png in Resources */, - 8397133F1936DD1100913996 /* Main.storyboard in Resources */, - 83FCD1B018F93F5500A493F0 /* artists@2x.png in Resources */, - 83C6CA8518FAFF5200412469 /* cloud.png in Resources */, - 831A88BC199EEEDD00C44CED /* tag@2x.png in Resources */, - 8373680819A8344600D9559D /* userIcon.png in Resources */, + 3F387C131B9B3F8900B5CC74 /* RiffCreate.storyboard in Resources */, + 3F387C1D1B9B3F9400B5CC74 /* Lato-Reg.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1832,6 +990,81 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 02E5AC0A959165E21C0D7ADC /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + 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"; + showEnvVarsInLog = 0; + }; + 0DB45C9E4B0C6A0C57AEE9C8 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 14EE549E532443BF66C382E8 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + 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"; + showEnvVarsInLog = 0; + }; + 3548D77566CAD9E664FC3FA6 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7F9865D3E129952ED8C70A59 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 835E1E0719D21BFB007EBD74 /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1846,6 +1079,21 @@ shellPath = /bin/sh; shellScript = ""; }; + 89A4492C7B6EF4DDA854E096 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1853,161 +1101,99 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 83CA12231995CD23002610E8 /* FLEXHeapEnumerator.m in Sources */, - 83BF315919C9FFC200F5BE48 /* MKAnnotationView+WebCache.m in Sources */, - 83814BCD19D0DCBF00F60FBF /* RYTagListHeaderView.m in Sources */, - 83BF315D19C9FFC200F5BE48 /* SDWebImageDecoder.m in Sources */, - 83082FEB19B5652D000AFACB /* RYSearchTypeTableViewCell.m in Sources */, - 83CCC919197EFCBF00FD1B4B /* UIAlertView+AFNetworking.m in Sources */, - 83FCD18F18F9144100A493F0 /* RYNewsfeedTableViewController.m in Sources */, - 836F484519A04BAB00E948BE /* UIView+Styling.m in Sources */, - 830185F419009C3A00093EFA /* RYLoginViewController.m in Sources */, - 830029BB1B7FD17C00666D93 /* RYRiffCreateCollectionViewController.swift in Sources */, - 830BBCBA18FA055900A9C53F /* MBProgressHUD.m in Sources */, - 83CA12251995CD23002610E8 /* FLEXRuntimeUtility.m in Sources */, - 83CCC918197EFCBF00FD1B4B /* UIActivityIndicatorView+AFNetworking.m in Sources */, - 83C354B319BBAD41000A5BD4 /* RYRiffStreamViewController.m in Sources */, - 83C8940B19C809E100127F68 /* RYTagList.m in Sources */, - 83BF316719C9FFC200F5BE48 /* UIImageView+WebCache.m in Sources */, - 83CA12261995CD23002610E8 /* FLEXUtility.m in Sources */, - 83CA12271995CD23002610E8 /* FLEXHierarchyTableViewCell.m in Sources */, - 830BBCB418F9F54900A9C53F /* SSKeychain.m in Sources */, - 83CCC90F197EFCBF00FD1B4B /* AFHTTPRequestOperationManager.m in Sources */, - 83CA11F91995CD23002610E8 /* FLEXArgumentInputFontsPickerView.m in Sources */, - 83CA12041995CD23002610E8 /* FLEXDefaultEditorViewController.m in Sources */, - 83CCC91A197EFCBF00FD1B4B /* UIButton+AFNetworking.m in Sources */, - 83CA12191995CD23002610E8 /* FLEXDefaultsExplorerViewController.m in Sources */, - 83CA12241995CD23002610E8 /* FLEXResources.m in Sources */, - 83BF315C19C9FFC200F5BE48 /* SDWebImageCompat.m in Sources */, - 830029B91B7FB2B300666D93 /* RYRiffAudioNode.m in Sources */, - 83302D9519C7A972008C5A54 /* RYDiscoverServices.m in Sources */, - 83BF316419C9FFC200F5BE48 /* UIImage+MultiFormat.m in Sources */, - 83CA120F1995CD23002610E8 /* FLEXClassesTableViewController.m in Sources */, - 83BF316619C9FFC200F5BE48 /* UIImageView+HighlightedWebCache.m in Sources */, - 834A0B4F19BED5A700E4D7E9 /* RYRegistrationServices.m in Sources */, - 8322309C19B00D0200C60033 /* PXAlertView+Customization.m in Sources */, - 83CA120E1995CD23002610E8 /* FLEXWindow.m in Sources */, - 836F484219A04BAB00E948BE /* NSObject+block.m in Sources */, - 837CCD1719A3E12D00F95FCA /* RYTag.m in Sources */, - 83E56B651953A0A900EF054C /* RYUser.m in Sources */, - 83FCD1A818F9393F00A493F0 /* RYStyleSheet.m in Sources */, - 83CA120B1995CD23002610E8 /* FLEXExplorerViewController.m in Sources */, - 83CA120D1995CD23002610E8 /* FLEXToolbarItem.m in Sources */, - 830BBCE518FA57F200A9C53F /* RYCoreViewController.m in Sources */, - 83CA11FF1995CD23002610E8 /* FLEXArgumentInputStructView.m in Sources */, - 837BA10A19CD12A8002AA13E /* UIViewController+RYSocialTransitions.m in Sources */, - 835E1E0A19D2320D007EBD74 /* RYLoadMoreControl.m in Sources */, - 83CA12161995CD23002610E8 /* FLEXWebViewController.m in Sources */, - 83360CD419B6A7FF00136FCB /* RYNotificationsTableViewCell.m in Sources */, - 8322309D19B00D0200C60033 /* PXAlertView.m in Sources */, - 83CA121A1995CD23002610E8 /* FLEXDescriptionTableViewCell.m in Sources */, - 83FCD1B818F9405F00A493F0 /* RYCoreTabBarViewController.m in Sources */, - 8310F5AA1981F92300250172 /* RYPlayControl.m in Sources */, - 83CA12061995CD23002610E8 /* FLEXFieldEditorViewController.m in Sources */, + 3F387BD31B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m in Sources */, + 3FE76E521B9B40F300099CF5 /* PXAlertView+Customization.m in Sources */, + 3F387BE21B9B3C2B00B5CC74 /* RYRegistrationServices.m in Sources */, + 3F387C321B9B3FB200B5CC74 /* NSObject+block.m in Sources */, + 3F387BE41B9B3C2B00B5CC74 /* RYRiffAudioNode.m in Sources */, + 8381658D1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */, + 3F387BF01B9B3C2B00B5CC74 /* RYSocialTextView.m in Sources */, + 3F387BC61B9B3C2B00B5CC74 /* RYCoreViewController.m in Sources */, + 3F387BFB1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m in Sources */, + 3F387BEF1B9B3C2B00B5CC74 /* RYServices.m in Sources */, + 3F387C341B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m in Sources */, + 3F387BF11B9B3C2B00B5CC74 /* RYStyleSheet.m in Sources */, + 3FF2A4951B9CD1A000EBF74D /* Constants.swift in Sources */, + 831178471BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift in Sources */, + 3F387BEE1B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m in Sources */, + 3F387BEB1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m in Sources */, + 831178421BB70447007C2DC0 /* RYAudioDeckPlaylist.swift in Sources */, + 3F3744EE1B9B9442005A9DD2 /* UILayoutPriority.swift in Sources */, + 83FF51051B9E1D3800FE9E73 /* RYNowPlayingView.swift in Sources */, + 3F387C331B9B3FB200B5CC74 /* UIColor+Hex.m in Sources */, + 83F4EEC01B9D3A8F007CF11A /* NSDictionary+Safety.m in Sources */, + 3F387BE61B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift in Sources */, + 83F4EEBD1B9D3921007CF11A /* NSMutableDictionary+Safety.m in Sources */, + 3F387BF21B9B3C2B00B5CC74 /* RYTabBarViewController.m in Sources */, + 3F387BDF1B9B3C2B00B5CC74 /* RYProfileViewController.m in Sources */, + 3FE76E4C1B9B40DF00099CF5 /* DWTagList.m in Sources */, + 3FE76E531B9B40F300099CF5 /* PXAlertView.m in Sources */, + 3F387BDD1B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m in Sources */, + 3F387BF41B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m in Sources */, + 3F387C3A1B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m in Sources */, + 3F387BDB1B9B3C2B00B5CC74 /* RYPostsViewController.swift in Sources */, + 3F387BE31B9B3C2B00B5CC74 /* RYRiffAudioEngine.m in Sources */, + 3F387C351B9B3FB200B5CC74 /* UIImage+Color.m in Sources */, + 3F387BF61B9B3C2B00B5CC74 /* RYTagList.m in Sources */, + 3F387BCA1B9B3C2B00B5CC74 /* RYGroupTableViewCell.m in Sources */, + 3F387BD71B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m in Sources */, + 831178491BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift in Sources */, + 3F387BCE1B9B3C2B00B5CC74 /* RYLoginViewController.m in Sources */, + 3F387BCC1B9B3C2B00B5CC74 /* RYLocationServices.m in Sources */, + 3F387BCB1B9B3C2B00B5CC74 /* RYLoadMoreControl.m in Sources */, + 3F387BE51B9B3C2B00B5CC74 /* RYRiffCell.m in Sources */, + 3FF2A48C1B9CCFB300EBF74D /* RYStarredView.swift in Sources */, + 3F387BD61B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m in Sources */, + 3F387BD91B9B3C2B00B5CC74 /* RYPost.m in Sources */, + 3F387BD11B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m in Sources */, + 3FE76E5B1B9B411C00099CF5 /* RYAppDelegate.m in Sources */, + 3F387BF71B9B3C2B00B5CC74 /* RYTagListHeaderView.m in Sources */, + 3FF2A48F1B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */, + 3F387BF91B9B3C2B00B5CC74 /* RYUser.m in Sources */, + 3F387BC71B9B3C2B00B5CC74 /* RYDataManager.m in Sources */, + 3F387BC51B9B3C2B00B5CC74 /* RYCorePageViewController.m in Sources */, + 3FF2A49E1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift in Sources */, + 3F387C361B9B3FB200B5CC74 /* UIImage+Size.m in Sources */, + 3F387BE81B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m in Sources */, + 3F387BC41B9B3C2B00B5CC74 /* RYAudioDeckViewController.m in Sources */, + 3FE76E581B9B40FF00099CF5 /* BNRDynamicTypeManager.m in Sources */, + 3F387BCF1B9B3C2B00B5CC74 /* RYMediaEditor.m in Sources */, + 3F387BE01B9B3C2B00B5CC74 /* RYProfileViewController.swift in Sources */, + 3F387C371B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m in Sources */, + 3F387BC91B9B3C2B00B5CC74 /* RYDiscoverViewController.m in Sources */, + 3F387BE91B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m in Sources */, + 3F387BEA1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m in Sources */, + 3F387BEC1B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m in Sources */, + 3F387C391B9B3FB200B5CC74 /* UIViewController+Extras.m in Sources */, + 3F32A8F81B9B87F000E79282 /* RYFadingVisualEffectView.swift in Sources */, + 3FF2A4891B9CCDC500EBF74D /* RYPostTextView.swift in Sources */, + 3F387BF31B9B3C2B00B5CC74 /* RYTag.m in Sources */, + 3F387BD21B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m in Sources */, + 3F387BC81B9B3C2B00B5CC74 /* RYDiscoverServices.m in Sources */, + 3F387BD01B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m in Sources */, + 3F387BFA1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m in Sources */, + 838165971B9E370C002C0FDB /* RYAudioDeck.swift in Sources */, + 3F387BFC1B9B3C2B00B5CC74 /* RYUserListViewController.m in Sources */, + 3F387BC31B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m in Sources */, + 8311784E1BB7068B007C2DC0 /* RYAudioDeckViewController.swift in Sources */, + 3F387BD51B9B3C2B00B5CC74 /* RYNotificationsManager.m in Sources */, + 3F387BD81B9B3C2B00B5CC74 /* RYPlayControl.m in Sources */, + 83FF51031B9E1D0500FE9E73 /* RYAddToPlaylistView.swift in Sources */, + 3F3744F11B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift in Sources */, + 3F387BD41B9B3C2B00B5CC74 /* RYNotification.m in Sources */, + 3F387BE71B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift in Sources */, + 3F387BDC1B9B3C2B00B5CC74 /* RYPostTableViewCell.swift in Sources */, + 3F387BDA1B9B3C2B00B5CC74 /* RYPostsDataSource.m in Sources */, + 3F387BE11B9B3C2B00B5CC74 /* RYRefreshControl.m in Sources */, + 3F387BF51B9B3C2B00B5CC74 /* RYTagFeedViewController.m in Sources */, + 3F387C381B9B3FB200B5CC74 /* UIView+Styling.m in Sources */, + 3F387BF81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m in Sources */, + 3F387BCD1B9B3C2B00B5CC74 /* RYLoginTableViewCell.m in Sources */, + 3FE76E471B9B40BB00099CF5 /* BlockAlertView.m in Sources */, + 3F24D8321B9B4ED300E78B05 /* RYNavigationController.m in Sources */, + 3FF2A4921B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */, + 3F387BED1B9B3C2B00B5CC74 /* RYRiffStreamViewController.m in Sources */, 83FCD14818F907C400A493F0 /* main.m in Sources */, - 836461AE195FBF05005938F5 /* RYLoginTableViewCell.m in Sources */, - 83CA12001995CD23002610E8 /* FLEXArgumentInputSwitchView.m in Sources */, - 8312628D19AD120D00532CA3 /* RYSocialTextView.m in Sources */, - 83CA11F81995CD23002610E8 /* FLEXArgumentInputColorView.m in Sources */, - 836F484319A04BAB00E948BE /* UIImage+Color.m in Sources */, - 83360CDA19B6B76500136FCB /* RYNotificationsManager.m in Sources */, - 83E3017219C7BAEE0085F17F /* RYTagCollectionViewCell.m in Sources */, - 836F484619A04BAB00E948BE /* UIViewController+Extras.m in Sources */, - 83082FE819B55DF4000AFACB /* RYTagFeedViewController.m in Sources */, - 83BF316819C9FFC200F5BE48 /* UIView+WebCacheOperation.m in Sources */, - 83BF315B19C9FFC200F5BE48 /* SDImageCache.m in Sources */, - 83FCD17618F909DB00A493F0 /* RYProfileViewController.m in Sources */, - 83FCD14C18F907C400A493F0 /* RYAppDelegate.m in Sources */, - 83CA121C1995CD23002610E8 /* FLEXGlobalsTableViewControllerEntry.m in Sources */, - 83C354C219BCE548000A5BD4 /* UIImagePickerController+Orientations.m in Sources */, - 83CA12141995CD23002610E8 /* FLEXLibrariesTableViewController.m in Sources */, - 83CA12131995CD23002610E8 /* FLEXInstancesTableViewController.m in Sources */, - 83CA11FE1995CD23002610E8 /* FLEXArgumentInputStringView.m in Sources */, - 830BBCE818FA589F00A9C53F /* RYCorePageViewController.m in Sources */, - 83CA12121995CD23002610E8 /* FLEXGlobalsTableViewController.m in Sources */, - 83CA12201995CD23002610E8 /* FLEXSetExplorerViewController.m in Sources */, - 83CA12051995CD23002610E8 /* FLEXFieldEditorView.m in Sources */, - 83CA120C1995CD23002610E8 /* FLEXManager.m in Sources */, - 83CA11FA1995CD23002610E8 /* FLEXArgumentInputFontView.m in Sources */, - 83360CD119B6A7EB00136FCB /* RYNotificationsTableViewController.m in Sources */, - 83E56B681953A0DA00EF054C /* RYMediaEditor.m in Sources */, - 83CA121F1995CD23002610E8 /* FLEXObjectExplorerViewController.m in Sources */, - 83CCC910197EFCBF00FD1B4B /* AFHTTPSessionManager.m in Sources */, - 83BF315F19C9FFC200F5BE48 /* SDWebImageDownloaderOperation.m in Sources */, - 83CCC91B197EFCBF00FD1B4B /* UIImageView+AFNetworking.m in Sources */, - 83DBCA7B18F99E3F00262496 /* RYRiffStreamingCoreViewController.m in Sources */, - 83CA12181995CD23002610E8 /* FLEXClassExplorerViewController.m in Sources */, - 830BBCB518F9F54900A9C53F /* SSKeychainQuery.m in Sources */, - 83CA11FB1995CD23002610E8 /* FLEXArgumentInputJSONObjectView.m in Sources */, - 83CCC91C197EFCBF00FD1B4B /* UIProgressView+AFNetworking.m in Sources */, - 83CA123319981702002610E8 /* RYAudioDeckTableViewCell.m in Sources */, - 83CA120A1995CD23002610E8 /* FLEXExplorerToolbar.m in Sources */, - 83CA121B1995CD23002610E8 /* FLEXDictionaryExplorerViewController.m in Sources */, - 83CCC914197EFCBF00FD1B4B /* AFURLRequestSerialization.m in Sources */, - 83CA11FD1995CD23002610E8 /* FLEXArgumentInputNumberView.m in Sources */, - 831E5FFA19A03269007F3C31 /* RYNewsfeedNavigationController.m in Sources */, - 83CCC915197EFCBF00FD1B4B /* AFURLResponseSerialization.m in Sources */, - 835516761951315F00CF2C23 /* RYRiffCreateTableViewCell.m in Sources */, - 832B89F91B32367700881AD8 /* FDWaveformView.m in Sources */, - 83CA12101995CD23002610E8 /* FLEXFileBrowserSearchOperation.m in Sources */, - 83BF316019C9FFC200F5BE48 /* SDWebImageManager.m in Sources */, - 837BA0FA19CCC7C2002AA13E /* UIFontDescriptor+RYCustomFont.m in Sources */, - 83CCC913197EFCBF00FD1B4B /* AFURLConnectionOperation.m in Sources */, - 83CA123019981087002610E8 /* RYAudioDeckManager.m in Sources */, - 83CA12151995CD23002610E8 /* FLEXLiveObjectsTableViewController.m in Sources */, - 833FC1B21989E4B0002491C8 /* RYRiffDetailsTableViewCell.m in Sources */, - 8355167219512CF100CF2C23 /* RYRiffCreateOldViewController.m in Sources */, - 831B96081964DEC6003A8616 /* RYDataManager.m in Sources */, - 83CCC911197EFCBF00FD1B4B /* AFNetworkReachabilityManager.m in Sources */, - 837E9AC61981E3360052E006 /* RYProfileInfoTableViewCell.m in Sources */, - 83CA12011995CD23002610E8 /* FLEXArgumentInputTextView.m in Sources */, - 83CCC917197EFCBF00FD1B4B /* AFNetworkActivityIndicatorManager.m in Sources */, - 83BF316519C9FFC200F5BE48 /* UIImage+WebP.m in Sources */, - 830029BD1B7FD3F900666D93 /* RYRiffCreateNodeCollectionViewCell.swift in Sources */, - 83CA12221995CD23002610E8 /* FLEXViewExplorerViewController.m in Sources */, - 83360CDD19B6B84E00136FCB /* RYNotification.m in Sources */, - 83CA12211995CD23002610E8 /* FLEXViewControllerExplorerViewController.m in Sources */, - 8398EC8419A012D800130EFC /* RYNewsfeedContainerViewController.m in Sources */, - 831B960B1964E428003A8616 /* RYTrackDownloadTableViewCell.m in Sources */, - 83CA12281995CD23002610E8 /* FLEXHierarchyTableViewController.m in Sources */, - 835E1AB51A4943D600FC679B /* RYRiffAudioEngine.m in Sources */, - 83EB8BA619959F5C0007837D /* DWTagList.m in Sources */, - 83CA12111995CD23002610E8 /* FLEXFileBrowserTableViewController.m in Sources */, - 83DC3B7819BD0EC00036AD2A /* RYRefreshControl.m in Sources */, - 83CA12071995CD23002610E8 /* FLEXIvarEditorViewController.m in Sources */, - 83CCC90E197EFCBF00FD1B4B /* AFHTTPRequestOperation.m in Sources */, - 834FEC1019897E6600C3D9B9 /* RYRiffCell.m in Sources */, - 83CA11FC1995CD23002610E8 /* FLEXArgumentInputNotSupportedView.m in Sources */, - 837C98D819A82411002A9B34 /* RYUserListViewController.m in Sources */, - 837BA0F719CCC619002AA13E /* BNRDynamicTypeManager.m in Sources */, - 83BF315A19C9FFC200F5BE48 /* NSData+ImageContentType.m in Sources */, - 83302D8F19C7A20B008C5A54 /* RYTagListViewController.m in Sources */, - 837BA0E319CCAED8002AA13E /* RYUserListCollectionViewCell.m in Sources */, - 83CCC912197EFCBF00FD1B4B /* AFSecurityPolicy.m in Sources */, - 83CA122D19981070002610E8 /* RYAudioDeckViewController.m in Sources */, - 83CA12021995CD23002610E8 /* FLEXArgumentInputView.m in Sources */, - 83BF316319C9FFC200F5BE48 /* UIImage+GIF.m in Sources */, - 83CA12291995CD23002610E8 /* FLEXImagePreviewViewController.m in Sources */, - 836F484419A04BAB00E948BE /* UIImage+Thumbnail.m in Sources */, - 830BBCC818FA0A5800A9C53F /* RYLocationServices.m in Sources */, - 83CA12081995CD23002610E8 /* FLEXMethodCallingViewController.m in Sources */, - 83CCC91D197EFCBF00FD1B4B /* UIRefreshControl+AFNetworking.m in Sources */, - 83FCD1BB18F9413400A493F0 /* RYPost.m in Sources */, - 83CCC916197EFCBF00FD1B4B /* AFURLSessionManager.m in Sources */, - 83CCC91E197EFCBF00FD1B4B /* UIWebView+AFNetworking.m in Sources */, - 837BA10219CCFA69002AA13E /* CHTCollectionViewWaterfallLayout.m in Sources */, - 83CA121E1995CD23002610E8 /* FLEXObjectExplorerFactory.m in Sources */, - 83CA12171995CD23002610E8 /* FLEXArrayExplorerViewController.m in Sources */, - 83CA121D1995CD23002610E8 /* FLEXImageExplorerViewController.m in Sources */, - 83BF316119C9FFC200F5BE48 /* SDWebImagePrefetcher.m in Sources */, - 830BBCD218FA142000A9C53F /* BlockAlertView.m in Sources */, - 833FC1AE1989E406002491C8 /* RYRiffDetailsViewController.m in Sources */, - 83CA12091995CD23002610E8 /* FLEXPropertyEditorViewController.m in Sources */, - 83CA12031995CD23002610E8 /* FLEXArgumentInputViewFactory.m in Sources */, - 830185FE1900AEB300093EFA /* UIColor+Hex.m in Sources */, - 83BF316219C9FFC200F5BE48 /* UIButton+WebCache.m in Sources */, - 83BF315E19C9FFC200F5BE48 /* SDWebImageDownloader.m in Sources */, - 83FCD1A318F921EA00A493F0 /* RYServices.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2015,7 +1201,28 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 838165851B9E2110002C0FDB /* BNRDynamicTypeManager.m in Sources */, + 3F51B57F1B9BB435007A136D /* RYUserProfileTableViewCell.swift in Sources */, 83FCD16A18F907C400A493F0 /* RyffTests.m in Sources */, + 831178431BB70448007C2DC0 /* RYAudioDeckPlaylist.swift in Sources */, + 3F3744EC1B9B89B4005A9DD2 /* RYFadingVisualEffectView.swift in Sources */, + 831178481BB7045D007C2DC0 /* RYAudioDeckConsoleView.swift in Sources */, + 3FF2A4931B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */, + 83FF51071B9E1D4000FE9E73 /* RYAddToPlaylistView.swift in Sources */, + 8381658B1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */, + 8311784A1BB7045D007C2DC0 /* RYAudioDeckTableViewCell.swift in Sources */, + 83FF51061B9E1D3D00FE9E73 /* RYNowPlayingView.swift in Sources */, + 3FF2A4901B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */, + 3F51B5801B9BB438007A136D /* RYProfileViewController.swift in Sources */, + 838165981B9E370C002C0FDB /* RYAudioDeck.swift in Sources */, + 3FE76E641B9B414500099CF5 /* RYPostsViewController.swift in Sources */, + 3FF2A48A1B9CCDC500EBF74D /* RYPostTextView.swift in Sources */, + 3F3744EF1B9B94CC005A9DD2 /* UILayoutPriority.swift in Sources */, + 3FE76E651B9B414900099CF5 /* RYPostTableViewCell.swift in Sources */, + 3FF2A48D1B9CCFB300EBF74D /* RYStarredView.swift in Sources */, + 8311784F1BB7068B007C2DC0 /* RYAudioDeckViewController.swift in Sources */, + 3FF2A4961B9CD1A000EBF74D /* Constants.swift in Sources */, + 8381658E1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2030,14 +1237,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 830BBCAD18F9F54900A9C53F /* SSKeychain.strings */ = { - isa = PBXVariantGroup; - children = ( - 830BBCAE18F9F54900A9C53F /* en */, - ); - name = SSKeychain.strings; - sourceTree = ""; - }; 83FCD14418F907C400A493F0 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -2046,14 +1245,6 @@ name = InfoPlist.strings; sourceTree = ""; }; - 83FCD14D18F907C400A493F0 /* MainIphone.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 83FCD14E18F907C400A493F0 /* Base */, - ); - name = MainIphone.storyboard; - sourceTree = ""; - }; 83FCD16618F907C400A493F0 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -2085,6 +1276,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Christopher Laganiere (6EN5YZJ6J8)"; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -2143,13 +1335,23 @@ }; 83FCD16E18F907C400A493F0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "Ryff Icon"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/**"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "COCOAPODS=1", + "RYFF=1", + ); INFOPLIST_FILE = "Ryff/Ryff-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2158,8 +1360,10 @@ "$(PROJECT_DIR)/Ryff/Frameworks/CrittercismSDK", ); MODULE_NAME = Ryff; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Ryff/UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; @@ -2168,13 +1372,23 @@ }; 83FCD16F18F907C400A493F0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "Ryff Icon"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/**"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "COCOAPODS=1", + "RYFF=1", + ); INFOPLIST_FILE = "Ryff/Ryff-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2183,8 +1397,10 @@ "$(PROJECT_DIR)/Ryff/Frameworks/CrittercismSDK", ); MODULE_NAME = Ryff; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Ryff/UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; @@ -2192,8 +1408,11 @@ }; 83FCD17118F907C400A493F0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Ryff.app/Ryff"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -2202,11 +1421,15 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", + "RYFFTESTS=1", "$(inherited)", ); INFOPLIST_FILE = "RyffTests/RyffTests-Info.plist"; + MODULE_NAME = RyffTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; @@ -2214,8 +1437,11 @@ }; 83FCD17218F907C400A493F0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Ryff.app/Ryff"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -2223,8 +1449,16 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "RYFFTESTS=1", + "$(inherited)", + ); INFOPLIST_FILE = "RyffTests/RyffTests-Info.plist"; + MODULE_NAME = RyffTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; diff --git a/Ryff.xcodeproj/project.pbxproj.orig b/Ryff.xcodeproj/project.pbxproj.orig new file mode 100644 index 0000000..8ace0dc --- /dev/null +++ b/Ryff.xcodeproj/project.pbxproj.orig @@ -0,0 +1,1505 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3F24D8321B9B4ED300E78B05 /* RYNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */; }; + 3F32A8F81B9B87F000E79282 /* RYFadingVisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */; }; + 3F3744EC1B9B89B4005A9DD2 /* RYFadingVisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */; }; + 3F3744EE1B9B9442005A9DD2 /* UILayoutPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */; }; + 3F3744EF1B9B94CC005A9DD2 /* UILayoutPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */; }; + 3F3744F11B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */; }; + 3F387BC31B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */; }; + 3F387BC41B9B3C2B00B5CC74 /* RYAudioDeckViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */; }; + 3F387BC51B9B3C2B00B5CC74 /* RYCorePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */; }; + 3F387BC61B9B3C2B00B5CC74 /* RYCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */; }; + 3F387BC71B9B3C2B00B5CC74 /* RYDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */; }; + 3F387BC81B9B3C2B00B5CC74 /* RYDiscoverServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */; }; + 3F387BC91B9B3C2B00B5CC74 /* RYDiscoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */; }; + 3F387BCA1B9B3C2B00B5CC74 /* RYGroupTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */; }; + 3F387BCB1B9B3C2B00B5CC74 /* RYLoadMoreControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */; }; + 3F387BCC1B9B3C2B00B5CC74 /* RYLocationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */; }; + 3F387BCD1B9B3C2B00B5CC74 /* RYLoginTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */; }; + 3F387BCE1B9B3C2B00B5CC74 /* RYLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */; }; + 3F387BCF1B9B3C2B00B5CC74 /* RYMediaEditor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */; }; + 3F387BD01B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */; }; + 3F387BD11B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */; }; + 3F387BD21B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */; }; + 3F387BD31B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */; }; + 3F387BD41B9B3C2B00B5CC74 /* RYNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */; }; + 3F387BD51B9B3C2B00B5CC74 /* RYNotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */; }; + 3F387BD61B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */; }; + 3F387BD71B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */; }; + 3F387BD81B9B3C2B00B5CC74 /* RYPlayControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */; }; + 3F387BD91B9B3C2B00B5CC74 /* RYPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B811B9B3C2B00B5CC74 /* RYPost.m */; }; + 3F387BDA1B9B3C2B00B5CC74 /* RYPostsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */; }; + 3F387BDB1B9B3C2B00B5CC74 /* RYPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */; }; + 3F387BDC1B9B3C2B00B5CC74 /* RYPostTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */; }; + 3F387BDD1B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */; }; + 3F387BDF1B9B3C2B00B5CC74 /* RYProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */; }; + 3F387BE01B9B3C2B00B5CC74 /* RYProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */; }; + 3F387BE11B9B3C2B00B5CC74 /* RYRefreshControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */; }; + 3F387BE21B9B3C2B00B5CC74 /* RYRegistrationServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */; }; + 3F387BE31B9B3C2B00B5CC74 /* RYRiffAudioEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */; }; + 3F387BE41B9B3C2B00B5CC74 /* RYRiffAudioNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */; }; + 3F387BE51B9B3C2B00B5CC74 /* RYRiffCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */; }; + 3F387BE61B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */; }; + 3F387BE71B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */; }; + 3F387BE81B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */; }; + 3F387BE91B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */; }; + 3F387BEA1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */; }; + 3F387BEB1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */; }; + 3F387BEC1B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */; }; + 3F387BED1B9B3C2B00B5CC74 /* RYRiffStreamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */; }; + 3F387BEE1B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */; }; + 3F387BEF1B9B3C2B00B5CC74 /* RYServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */; }; + 3F387BF01B9B3C2B00B5CC74 /* RYSocialTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */; }; + 3F387BF11B9B3C2B00B5CC74 /* RYStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */; }; + 3F387BF21B9B3C2B00B5CC74 /* RYTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */; }; + 3F387BF31B9B3C2B00B5CC74 /* RYTag.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */; }; + 3F387BF41B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */; }; + 3F387BF51B9B3C2B00B5CC74 /* RYTagFeedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */; }; + 3F387BF61B9B3C2B00B5CC74 /* RYTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */; }; + 3F387BF71B9B3C2B00B5CC74 /* RYTagListHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */; }; + 3F387BF81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */; }; + 3F387BF91B9B3C2B00B5CC74 /* RYUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */; }; + 3F387BFA1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */; }; + 3F387BFB1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */; }; + 3F387BFC1B9B3C2B00B5CC74 /* RYUserListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */; }; + 3F387C121B9B3F8900B5CC74 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */; }; + 3F387C131B9B3F8900B5CC74 /* RiffCreate.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */; }; + 3F387C141B9B3F8900B5CC74 /* RYRiffCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */; }; + 3F387C151B9B3F8900B5CC74 /* RYRiffCellAvatar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */; }; + 3F387C161B9B3F8900B5CC74 /* RYRiffDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */; }; + 3F387C1B1B9B3F9400B5CC74 /* Lato-Bol.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */; }; + 3F387C1C1B9B3F9400B5CC74 /* Lato-Lig.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */; }; + 3F387C1D1B9B3F9400B5CC74 /* Lato-Reg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */; }; + 3F387C1E1B9B3F9400B5CC74 /* Lato-RegIta.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */; }; + 3F387C321B9B3FB200B5CC74 /* NSObject+block.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */; }; + 3F387C331B9B3FB200B5CC74 /* UIColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */; }; + 3F387C341B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */; }; + 3F387C351B9B3FB200B5CC74 /* UIImage+Color.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */; }; + 3F387C361B9B3FB200B5CC74 /* UIImage+Size.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */; }; + 3F387C371B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */; }; + 3F387C381B9B3FB200B5CC74 /* UIView+Styling.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */; }; + 3F387C391B9B3FB200B5CC74 /* UIViewController+Extras.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */; }; + 3F387C3A1B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */; }; + 3F51B57F1B9BB435007A136D /* RYUserProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */; }; + 3F51B5801B9BB438007A136D /* RYProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */; }; + 3FE76E471B9B40BB00099CF5 /* BlockAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */; }; + 3FE76E4C1B9B40DF00099CF5 /* DWTagList.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */; }; + 3FE76E521B9B40F300099CF5 /* PXAlertView+Customization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */; }; + 3FE76E531B9B40F300099CF5 /* PXAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E511B9B40F300099CF5 /* PXAlertView.m */; }; + 3FE76E581B9B40FF00099CF5 /* BNRDynamicTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */; }; + 3FE76E5B1B9B411C00099CF5 /* RYAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */; }; + 3FE76E621B9B412E00099CF5 /* dsym_upload.sh in Resources */ = {isa = PBXBuildFile; fileRef = 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */; }; + 3FE76E631B9B412E00099CF5 /* libCrittercism_v4_3_7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */; }; + 3FE76E641B9B414500099CF5 /* RYPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */; }; + 3FE76E651B9B414900099CF5 /* RYPostTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */; }; + 3FE76E691B9B443900099CF5 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3FE76E681B9B443900099CF5 /* Media.xcassets */; }; + 3FF2A4891B9CCDC500EBF74D /* RYPostTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */; }; + 3FF2A48A1B9CCDC500EBF74D /* RYPostTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */; }; + 3FF2A48C1B9CCFB300EBF74D /* RYStarredView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */; }; + 3FF2A48D1B9CCFB300EBF74D /* RYStarredView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */; }; + 3FF2A48F1B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */; }; + 3FF2A4901B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */; }; + 3FF2A4921B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */; }; + 3FF2A4931B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */; }; + 3FF2A4951B9CD1A000EBF74D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4941B9CD1A000EBF74D /* Constants.swift */; }; + 3FF2A4961B9CD1A000EBF74D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A4941B9CD1A000EBF74D /* Constants.swift */; }; + 3FF2A49E1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */; }; + 830BBCCA18FA0C2300A9C53F /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830BBCC918FA0C2300A9C53F /* CoreLocation.framework */; }; + 838165851B9E2110002C0FDB /* BNRDynamicTypeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */; }; + 8381658A1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */; }; + 8381658B1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */; }; + 8381658D1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */; }; + 8381658E1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */; }; + 838165971B9E370C002C0FDB /* RYAudioDeck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165961B9E370C002C0FDB /* RYAudioDeck.swift */; }; + 838165981B9E370C002C0FDB /* RYAudioDeck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165961B9E370C002C0FDB /* RYAudioDeck.swift */; }; + 8381659A1B9E3764002C0FDB /* RYAudioDeckPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */; }; + 8381659B1B9E3764002C0FDB /* RYAudioDeckPlaylist.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */; }; +<<<<<<< HEAD + 839480551BB34531001A719A /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 839480541BB34531001A719A /* Launch Screen.storyboard */; settings = {ASSET_TAGS = (); }; }; +======= + 83AEB94D1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AEB94C1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift */; }; + 83AEB94E1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AEB94C1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift */; }; + 83AEB9501BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AEB94F1BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift */; }; + 83AEB9511BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AEB94F1BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift */; }; +>>>>>>> AudioDeckVC + 83F4EEBD1B9D3921007CF11A /* NSMutableDictionary+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */; }; + 83F4EEC01B9D3A8F007CF11A /* NSDictionary+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */; }; + 83FADE4C19AC54DA00182155 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FADE4B19AC54DA00182155 /* QuartzCore.framework */; }; + 83FCD13C18F907C400A493F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13B18F907C400A493F0 /* Foundation.framework */; }; + 83FCD13E18F907C400A493F0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13D18F907C400A493F0 /* CoreGraphics.framework */; }; + 83FCD14018F907C400A493F0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13F18F907C400A493F0 /* UIKit.framework */; }; + 83FCD14618F907C400A493F0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD14418F907C400A493F0 /* InfoPlist.strings */; }; + 83FCD14818F907C400A493F0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD14718F907C400A493F0 /* main.m */; }; + 83FCD15718F907C400A493F0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD15618F907C400A493F0 /* Images.xcassets */; }; + 83FCD15E18F907C400A493F0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD15D18F907C400A493F0 /* XCTest.framework */; }; + 83FCD15F18F907C400A493F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13B18F907C400A493F0 /* Foundation.framework */; }; + 83FCD16018F907C400A493F0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83FCD13F18F907C400A493F0 /* UIKit.framework */; }; + 83FCD16818F907C400A493F0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83FCD16618F907C400A493F0 /* InfoPlist.strings */; }; + 83FCD16A18F907C400A493F0 /* RyffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FCD16918F907C400A493F0 /* RyffTests.m */; }; + 83FF51031B9E1D0500FE9E73 /* RYAddToPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */; }; + 83FF51051B9E1D3800FE9E73 /* RYNowPlayingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */; }; + 83FF51061B9E1D3D00FE9E73 /* RYNowPlayingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */; }; + 83FF51071B9E1D4000FE9E73 /* RYAddToPlaylistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */; }; + 9795D935FF6483EC5F9A5340 /* Pods_Ryff.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + EC092E28FF5A6FF568A7BCC8 /* Pods_RyffTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E251082A40810E7130987A45 /* Pods_RyffTests.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 83FCD16118F907C400A493F0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83FCD13018F907C400A493F0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 83FCD13718F907C400A493F0; + remoteInfo = Ryff; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ryff.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Ryff/Pods-Ryff.debug.xcconfig"; sourceTree = ""; }; + 3F15B36E1B9A2EA6009F3790 /* SwiftCompatability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftCompatability.h; sourceTree = ""; }; + 3F24D8301B9B4ED300E78B05 /* RYNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNavigationController.h; path = Classes/RYNavigationController.h; sourceTree = ""; }; + 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNavigationController.m; path = Classes/RYNavigationController.m; sourceTree = ""; }; + 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYFadingVisualEffectView.swift; path = Classes/RYFadingVisualEffectView.swift; sourceTree = ""; }; + 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UILayoutPriority.swift; path = Categories/UILayoutPriority.swift; sourceTree = ""; }; + 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYUserProfileTableViewCell.swift; path = Classes/RYUserProfileTableViewCell.swift; sourceTree = ""; }; + 3F387B541B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYAudioDeckTableViewCell.h; path = Classes/RYAudioDeckTableViewCell.h; sourceTree = ""; }; + 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYAudioDeckTableViewCell.m; path = Classes/RYAudioDeckTableViewCell.m; sourceTree = ""; }; + 3F387B561B9B3C2B00B5CC74 /* RYAudioDeckViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYAudioDeckViewController.h; path = Classes/RYAudioDeckViewController.h; sourceTree = ""; }; + 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYAudioDeckViewController.m; path = Classes/RYAudioDeckViewController.m; sourceTree = ""; }; + 3F387B581B9B3C2B00B5CC74 /* RYCorePageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYCorePageViewController.h; path = Classes/RYCorePageViewController.h; sourceTree = ""; }; + 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYCorePageViewController.m; path = Classes/RYCorePageViewController.m; sourceTree = ""; }; + 3F387B5A1B9B3C2B00B5CC74 /* RYCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYCoreViewController.h; path = Classes/RYCoreViewController.h; sourceTree = ""; }; + 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYCoreViewController.m; path = Classes/RYCoreViewController.m; sourceTree = ""; }; + 3F387B5C1B9B3C2B00B5CC74 /* RYDataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDataManager.h; path = Classes/RYDataManager.h; sourceTree = ""; }; + 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDataManager.m; path = Classes/RYDataManager.m; sourceTree = ""; }; + 3F387B5E1B9B3C2B00B5CC74 /* RYDiscoverServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDiscoverServices.h; path = Classes/RYDiscoverServices.h; sourceTree = ""; }; + 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDiscoverServices.m; path = Classes/RYDiscoverServices.m; sourceTree = ""; }; + 3F387B601B9B3C2B00B5CC74 /* RYDiscoverViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYDiscoverViewController.h; path = Classes/RYDiscoverViewController.h; sourceTree = ""; }; + 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYDiscoverViewController.m; path = Classes/RYDiscoverViewController.m; sourceTree = ""; }; + 3F387B621B9B3C2B00B5CC74 /* RYGroupTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYGroupTableViewCell.h; path = Classes/RYGroupTableViewCell.h; sourceTree = ""; }; + 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYGroupTableViewCell.m; path = Classes/RYGroupTableViewCell.m; sourceTree = ""; }; + 3F387B641B9B3C2B00B5CC74 /* RYLoadMoreControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoadMoreControl.h; path = Classes/RYLoadMoreControl.h; sourceTree = ""; }; + 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoadMoreControl.m; path = Classes/RYLoadMoreControl.m; sourceTree = ""; }; + 3F387B661B9B3C2B00B5CC74 /* RYLocationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLocationServices.h; path = Classes/RYLocationServices.h; sourceTree = ""; }; + 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLocationServices.m; path = Classes/RYLocationServices.m; sourceTree = ""; }; + 3F387B681B9B3C2B00B5CC74 /* RYLoginTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoginTableViewCell.h; path = Classes/RYLoginTableViewCell.h; sourceTree = ""; }; + 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoginTableViewCell.m; path = Classes/RYLoginTableViewCell.m; sourceTree = ""; }; + 3F387B6A1B9B3C2B00B5CC74 /* RYLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYLoginViewController.h; path = Classes/RYLoginViewController.h; sourceTree = ""; }; + 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYLoginViewController.m; path = Classes/RYLoginViewController.m; sourceTree = ""; }; + 3F387B6C1B9B3C2B00B5CC74 /* RYMediaEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYMediaEditor.h; path = Classes/RYMediaEditor.h; sourceTree = ""; }; + 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYMediaEditor.m; path = Classes/RYMediaEditor.m; sourceTree = ""; }; + 3F387B6E1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedContainerViewController.h; path = Classes/RYNewsfeedContainerViewController.h; sourceTree = ""; }; + 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedContainerViewController.m; path = Classes/RYNewsfeedContainerViewController.m; sourceTree = ""; }; + 3F387B701B9B3C2B00B5CC74 /* RYNewsfeedDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedDataSource.h; path = Classes/RYNewsfeedDataSource.h; sourceTree = ""; }; + 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedDataSource.m; path = Classes/RYNewsfeedDataSource.m; sourceTree = ""; }; + 3F387B721B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedNavigationController.h; path = Classes/RYNewsfeedNavigationController.h; sourceTree = ""; }; + 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedNavigationController.m; path = Classes/RYNewsfeedNavigationController.m; sourceTree = ""; }; + 3F387B741B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNewsfeedTableViewController.h; path = Classes/RYNewsfeedTableViewController.h; sourceTree = ""; }; + 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNewsfeedTableViewController.m; path = Classes/RYNewsfeedTableViewController.m; sourceTree = ""; }; + 3F387B761B9B3C2B00B5CC74 /* RYNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotification.h; path = Classes/RYNotification.h; sourceTree = ""; }; + 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotification.m; path = Classes/RYNotification.m; sourceTree = ""; }; + 3F387B781B9B3C2B00B5CC74 /* RYNotificationsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsManager.h; path = Classes/RYNotificationsManager.h; sourceTree = ""; }; + 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsManager.m; path = Classes/RYNotificationsManager.m; sourceTree = ""; }; + 3F387B7A1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsTableViewCell.h; path = Classes/RYNotificationsTableViewCell.h; sourceTree = ""; }; + 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsTableViewCell.m; path = Classes/RYNotificationsTableViewCell.m; sourceTree = ""; }; + 3F387B7C1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYNotificationsTableViewController.h; path = Classes/RYNotificationsTableViewController.h; sourceTree = ""; }; + 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYNotificationsTableViewController.m; path = Classes/RYNotificationsTableViewController.m; sourceTree = ""; }; + 3F387B7E1B9B3C2B00B5CC74 /* RYPlayControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPlayControl.h; path = Classes/RYPlayControl.h; sourceTree = ""; }; + 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPlayControl.m; path = Classes/RYPlayControl.m; sourceTree = ""; }; + 3F387B801B9B3C2B00B5CC74 /* RYPost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPost.h; path = Classes/RYPost.h; sourceTree = ""; }; + 3F387B811B9B3C2B00B5CC74 /* RYPost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPost.m; path = Classes/RYPost.m; sourceTree = ""; }; + 3F387B821B9B3C2B00B5CC74 /* RYPostsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYPostsDataSource.h; path = Classes/RYPostsDataSource.h; sourceTree = ""; }; + 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYPostsDataSource.m; path = Classes/RYPostsDataSource.m; sourceTree = ""; }; + 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostsViewController.swift; path = Classes/RYPostsViewController.swift; sourceTree = ""; }; + 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostTableViewCell.swift; path = Classes/RYPostTableViewCell.swift; sourceTree = ""; }; + 3F387B861B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYProfileInfoTableViewCell.h; path = Classes/RYProfileInfoTableViewCell.h; sourceTree = ""; }; + 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYProfileInfoTableViewCell.m; path = Classes/RYProfileInfoTableViewCell.m; sourceTree = ""; }; + 3F387B891B9B3C2B00B5CC74 /* RYProfileViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYProfileViewController.h; path = Classes/RYProfileViewController.h; sourceTree = ""; }; + 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYProfileViewController.m; path = Classes/RYProfileViewController.m; sourceTree = ""; }; + 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYProfileViewController.swift; path = Classes/RYProfileViewController.swift; sourceTree = ""; }; + 3F387B8C1B9B3C2B00B5CC74 /* RYRefreshControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRefreshControl.h; path = Classes/RYRefreshControl.h; sourceTree = ""; }; + 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRefreshControl.m; path = Classes/RYRefreshControl.m; sourceTree = ""; }; + 3F387B8E1B9B3C2B00B5CC74 /* RYRegistrationServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRegistrationServices.h; path = Classes/RYRegistrationServices.h; sourceTree = ""; }; + 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRegistrationServices.m; path = Classes/RYRegistrationServices.m; sourceTree = ""; }; + 3F387B901B9B3C2B00B5CC74 /* RYRiffAudioEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffAudioEngine.h; path = Classes/RYRiffAudioEngine.h; sourceTree = ""; }; + 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffAudioEngine.m; path = Classes/RYRiffAudioEngine.m; sourceTree = ""; }; + 3F387B921B9B3C2B00B5CC74 /* RYRiffAudioNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffAudioNode.h; path = Classes/RYRiffAudioNode.h; sourceTree = ""; }; + 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffAudioNode.m; path = Classes/RYRiffAudioNode.m; sourceTree = ""; }; + 3F387B941B9B3C2B00B5CC74 /* RYRiffCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCell.h; path = Classes/RYRiffCell.h; sourceTree = ""; }; + 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCell.m; path = Classes/RYRiffCell.m; sourceTree = ""; }; + 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYRiffMixerViewController.swift; path = Classes/RYRiffMixerViewController.swift; sourceTree = ""; }; + 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYRiffMixerNodeCollectionViewCell.swift; path = Classes/RYRiffMixerNodeCollectionViewCell.swift; sourceTree = ""; }; + 3F387B981B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCreateOldViewController.h; path = Classes/RYRiffCreateOldViewController.h; sourceTree = ""; }; + 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCreateOldViewController.m; path = Classes/RYRiffCreateOldViewController.m; sourceTree = ""; }; + 3F387B9A1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffCreateTableViewCell.h; path = Classes/RYRiffCreateTableViewCell.h; sourceTree = ""; }; + 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffCreateTableViewCell.m; path = Classes/RYRiffCreateTableViewCell.m; sourceTree = ""; }; + 3F387B9C1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffDetailsTableViewCell.h; path = Classes/RYRiffDetailsTableViewCell.h; sourceTree = ""; }; + 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffDetailsTableViewCell.m; path = Classes/RYRiffDetailsTableViewCell.m; sourceTree = ""; }; + 3F387B9E1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffDetailsViewController.h; path = Classes/RYRiffDetailsViewController.h; sourceTree = ""; }; + 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffDetailsViewController.m; path = Classes/RYRiffDetailsViewController.m; sourceTree = ""; }; + 3F387BA01B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffStreamingCoreViewController.h; path = Classes/RYRiffStreamingCoreViewController.h; sourceTree = ""; }; + 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffStreamingCoreViewController.m; path = Classes/RYRiffStreamingCoreViewController.m; sourceTree = ""; }; + 3F387BA21B9B3C2B00B5CC74 /* RYRiffStreamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYRiffStreamViewController.h; path = Classes/RYRiffStreamViewController.h; sourceTree = ""; }; + 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYRiffStreamViewController.m; path = Classes/RYRiffStreamViewController.m; sourceTree = ""; }; + 3F387BA41B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYSearchTypeTableViewCell.h; path = Classes/RYSearchTypeTableViewCell.h; sourceTree = ""; }; + 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYSearchTypeTableViewCell.m; path = Classes/RYSearchTypeTableViewCell.m; sourceTree = ""; }; + 3F387BA61B9B3C2B00B5CC74 /* RYServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYServices.h; path = Classes/RYServices.h; sourceTree = ""; }; + 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYServices.m; path = Classes/RYServices.m; sourceTree = ""; }; + 3F387BA81B9B3C2B00B5CC74 /* RYSocialTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYSocialTextView.h; path = Classes/RYSocialTextView.h; sourceTree = ""; }; + 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYSocialTextView.m; path = Classes/RYSocialTextView.m; sourceTree = ""; }; + 3F387BAA1B9B3C2B00B5CC74 /* RYStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYStyleSheet.h; path = Classes/RYStyleSheet.h; sourceTree = ""; }; + 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYStyleSheet.m; path = Classes/RYStyleSheet.m; sourceTree = ""; }; + 3F387BAC1B9B3C2B00B5CC74 /* RYTabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTabBarViewController.h; path = Classes/RYTabBarViewController.h; sourceTree = ""; }; + 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTabBarViewController.m; path = Classes/RYTabBarViewController.m; sourceTree = ""; }; + 3F387BAE1B9B3C2B00B5CC74 /* RYTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTag.h; path = Classes/RYTag.h; sourceTree = ""; }; + 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTag.m; path = Classes/RYTag.m; sourceTree = ""; }; + 3F387BB01B9B3C2B00B5CC74 /* RYTagCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagCollectionViewCell.h; path = Classes/RYTagCollectionViewCell.h; sourceTree = ""; }; + 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagCollectionViewCell.m; path = Classes/RYTagCollectionViewCell.m; sourceTree = ""; }; + 3F387BB21B9B3C2B00B5CC74 /* RYTagFeedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagFeedViewController.h; path = Classes/RYTagFeedViewController.h; sourceTree = ""; }; + 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagFeedViewController.m; path = Classes/RYTagFeedViewController.m; sourceTree = ""; }; + 3F387BB41B9B3C2B00B5CC74 /* RYTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagList.h; path = Classes/RYTagList.h; sourceTree = ""; }; + 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagList.m; path = Classes/RYTagList.m; sourceTree = ""; }; + 3F387BB61B9B3C2B00B5CC74 /* RYTagListHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTagListHeaderView.h; path = Classes/RYTagListHeaderView.h; sourceTree = ""; }; + 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTagListHeaderView.m; path = Classes/RYTagListHeaderView.m; sourceTree = ""; }; + 3F387BB81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYTrackDownloadTableViewCell.h; path = Classes/RYTrackDownloadTableViewCell.h; sourceTree = ""; }; + 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYTrackDownloadTableViewCell.m; path = Classes/RYTrackDownloadTableViewCell.m; sourceTree = ""; }; + 3F387BBA1B9B3C2B00B5CC74 /* RYUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUser.h; path = Classes/RYUser.h; sourceTree = ""; }; + 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUser.m; path = Classes/RYUser.m; sourceTree = ""; }; + 3F387BBC1B9B3C2B00B5CC74 /* RYUserFeedDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserFeedDataSource.h; path = Classes/RYUserFeedDataSource.h; sourceTree = ""; }; + 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserFeedDataSource.m; path = Classes/RYUserFeedDataSource.m; sourceTree = ""; }; + 3F387BBE1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserListCollectionViewCell.h; path = Classes/RYUserListCollectionViewCell.h; sourceTree = ""; }; + 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserListCollectionViewCell.m; path = Classes/RYUserListCollectionViewCell.m; sourceTree = ""; }; + 3F387BC01B9B3C2B00B5CC74 /* RYUserListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RYUserListViewController.h; path = Classes/RYUserListViewController.h; sourceTree = ""; }; + 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RYUserListViewController.m; path = Classes/RYUserListViewController.m; sourceTree = ""; }; + 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RiffCreate.storyboard; sourceTree = ""; }; + 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCell.xib; sourceTree = ""; }; + 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffCellAvatar.xib; sourceTree = ""; }; + 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RYRiffDetailsCell.xib; sourceTree = ""; }; + 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Bol.ttf"; path = "Style/Lato-Bol.ttf"; sourceTree = ""; }; + 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Lig.ttf"; path = "Style/Lato-Lig.ttf"; sourceTree = ""; }; + 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-Reg.ttf"; path = "Style/Lato-Reg.ttf"; sourceTree = ""; }; + 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Lato-RegIta.ttf"; path = "Style/Lato-RegIta.ttf"; sourceTree = ""; }; + 3F387C201B9B3FB200B5CC74 /* NSObject+block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+block.h"; path = "Categories/NSObject+block.h"; sourceTree = ""; }; + 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSObject+block.m"; path = "Categories/NSObject+block.m"; sourceTree = ""; }; + 3F387C221B9B3FB200B5CC74 /* UIColor+Hex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIColor+Hex.h"; path = "Categories/UIColor+Hex.h"; sourceTree = ""; }; + 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIColor+Hex.m"; path = "Categories/UIColor+Hex.m"; sourceTree = ""; }; + 3F387C241B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIFontDescriptor+RYCustomFont.h"; path = "Categories/UIFontDescriptor+RYCustomFont.h"; sourceTree = ""; }; + 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIFontDescriptor+RYCustomFont.m"; path = "Categories/UIFontDescriptor+RYCustomFont.m"; sourceTree = ""; }; + 3F387C261B9B3FB200B5CC74 /* UIImage+Color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Color.h"; path = "Categories/UIImage+Color.h"; sourceTree = ""; }; + 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Color.m"; path = "Categories/UIImage+Color.m"; sourceTree = ""; }; + 3F387C281B9B3FB200B5CC74 /* UIImage+Size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Size.h"; path = "Categories/UIImage+Size.h"; sourceTree = ""; }; + 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Size.m"; path = "Categories/UIImage+Size.m"; sourceTree = ""; }; + 3F387C2A1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImagePickerController+Orientations.h"; path = "Categories/UIImagePickerController+Orientations.h"; sourceTree = ""; }; + 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+Orientations.m"; path = "Categories/UIImagePickerController+Orientations.m"; sourceTree = ""; }; + 3F387C2C1B9B3FB200B5CC74 /* UIView+Styling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+Styling.h"; path = "Categories/UIView+Styling.h"; sourceTree = ""; }; + 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+Styling.m"; path = "Categories/UIView+Styling.m"; sourceTree = ""; }; + 3F387C2E1B9B3FB200B5CC74 /* UIViewController+Extras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+Extras.h"; path = "Categories/UIViewController+Extras.h"; sourceTree = ""; }; + 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+Extras.m"; path = "Categories/UIViewController+Extras.m"; sourceTree = ""; }; + 3F387C301B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+RYSocialTransitions.h"; path = "Categories/UIViewController+RYSocialTransitions.h"; sourceTree = ""; }; + 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+RYSocialTransitions.m"; path = "Categories/UIViewController+RYSocialTransitions.m"; sourceTree = ""; }; + 3FE76E421B9B40BB00099CF5 /* BlockAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockAlertView.h; sourceTree = ""; }; + 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlockAlertView.m; sourceTree = ""; }; + 3FE76E451B9B40BB00099CF5 /* FDWaveformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FDWaveformView.h; sourceTree = ""; }; + 3FE76E461B9B40BB00099CF5 /* FDWaveformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDWaveformView.m; sourceTree = ""; }; + 3FE76E4A1B9B40DF00099CF5 /* DWTagList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWTagList.h; sourceTree = ""; }; + 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWTagList.m; sourceTree = ""; }; + 3FE76E4E1B9B40F300099CF5 /* PXAlertView+Customization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PXAlertView+Customization.h"; sourceTree = ""; }; + 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PXAlertView+Customization.m"; sourceTree = ""; }; + 3FE76E501B9B40F300099CF5 /* PXAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PXAlertView.h; sourceTree = ""; }; + 3FE76E511B9B40F300099CF5 /* PXAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PXAlertView.m; sourceTree = ""; }; + 3FE76E561B9B40FF00099CF5 /* BNRDynamicTypeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNRDynamicTypeManager.h; sourceTree = ""; }; + 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BNRDynamicTypeManager.m; sourceTree = ""; }; + 3FE76E591B9B411C00099CF5 /* RYAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RYAppDelegate.h; sourceTree = ""; }; + 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RYAppDelegate.m; sourceTree = ""; }; + 3FE76E5D1B9B412E00099CF5 /* CRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRFilter.h; sourceTree = ""; }; + 3FE76E5E1B9B412E00099CF5 /* Crittercism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Crittercism.h; sourceTree = ""; }; + 3FE76E5F1B9B412E00099CF5 /* CrittercismDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrittercismDelegate.h; sourceTree = ""; }; + 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = dsym_upload.sh; sourceTree = ""; }; + 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libCrittercism_v4_3_7.a; sourceTree = ""; }; + 3FE76E681B9B443900099CF5 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostTextView.swift; path = Classes/RYPostTextView.swift; sourceTree = ""; }; + 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYStarredView.swift; path = Classes/RYStarredView.swift; sourceTree = ""; }; + 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYPostDetailsViewController.swift; path = Classes/RYPostDetailsViewController.swift; sourceTree = ""; }; + 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Transitions.swift"; path = "Categories/UIViewController+Transitions.swift"; sourceTree = ""; }; + 3FF2A4941B9CD1A000EBF74D /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 3FF2A49C1B9CDF4F00EBF74D /* Ryff-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Ryff-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; + 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "KRLCollectionViewGridLayout+Ryff.swift"; path = "Categories/KRLCollectionViewGridLayout+Ryff.swift"; sourceTree = ""; }; + 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ryff.release.xcconfig"; path = "Pods/Target Support Files/Pods-Ryff/Pods-Ryff.release.xcconfig"; sourceTree = ""; }; + 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RyffTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.release.xcconfig"; sourceTree = ""; }; + 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RyffTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests.debug.xcconfig"; sourceTree = ""; }; + 830BBCC918FA0C2300A9C53F /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckViewController.swift; path = Classes/RYAudioDeckViewController.swift; sourceTree = ""; }; + 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIKit+BNRDynamicTypeManager.swift"; path = "Categories/UIKit+BNRDynamicTypeManager.swift"; sourceTree = ""; }; + 838165961B9E370C002C0FDB /* RYAudioDeck.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeck.swift; path = Classes/RYAudioDeck.swift; sourceTree = ""; }; + 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckPlaylist.swift; path = Classes/RYAudioDeckPlaylist.swift; sourceTree = ""; }; +<<<<<<< HEAD + 839480541BB34531001A719A /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; +======= + 83AEB94C1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckTableViewCell.swift; path = Classes/RYAudioDeckTableViewCell.swift; sourceTree = ""; }; + 83AEB94F1BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAudioDeckConsoleView.swift; path = Classes/RYAudioDeckConsoleView.swift; sourceTree = ""; }; +>>>>>>> AudioDeckVC + 83F4EEBB1B9D3921007CF11A /* NSMutableDictionary+Safety.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableDictionary+Safety.h"; path = "Categories/NSMutableDictionary+Safety.h"; sourceTree = ""; }; + 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+Safety.m"; path = "Categories/NSMutableDictionary+Safety.m"; sourceTree = ""; }; + 83F4EEBE1B9D3A8F007CF11A /* NSDictionary+Safety.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Safety.h"; path = "Categories/NSDictionary+Safety.h"; sourceTree = ""; }; + 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Safety.m"; path = "Categories/NSDictionary+Safety.m"; sourceTree = ""; }; + 83FADE4B19AC54DA00182155 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 83FCD13818F907C400A493F0 /* Ryff.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ryff.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 83FCD13B18F907C400A493F0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 83FCD13D18F907C400A493F0 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 83FCD13F18F907C400A493F0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 83FCD14318F907C400A493F0 /* Ryff-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Ryff-Info.plist"; sourceTree = ""; }; + 83FCD14518F907C400A493F0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 83FCD14718F907C400A493F0 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 83FCD14918F907C400A493F0 /* Ryff-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Ryff-Prefix.pch"; sourceTree = ""; }; + 83FCD15618F907C400A493F0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 83FCD15C18F907C400A493F0 /* RyffTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RyffTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 83FCD15D18F907C400A493F0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 83FCD16518F907C400A493F0 /* RyffTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RyffTests-Info.plist"; sourceTree = ""; }; + 83FCD16718F907C400A493F0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 83FCD16918F907C400A493F0 /* RyffTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RyffTests.m; sourceTree = ""; }; + 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYAddToPlaylistView.swift; path = Classes/RYAddToPlaylistView.swift; sourceTree = ""; }; + 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RYNowPlayingView.swift; path = Classes/RYNowPlayingView.swift; sourceTree = ""; }; + CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Ryff.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E251082A40810E7130987A45 /* Pods_RyffTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RyffTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 83FCD13518F907C400A493F0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83FADE4C19AC54DA00182155 /* QuartzCore.framework in Frameworks */, + 3FE76E631B9B412E00099CF5 /* libCrittercism_v4_3_7.a in Frameworks */, + 830BBCCA18FA0C2300A9C53F /* CoreLocation.framework in Frameworks */, + 83FCD13E18F907C400A493F0 /* CoreGraphics.framework in Frameworks */, + 83FCD14018F907C400A493F0 /* UIKit.framework in Frameworks */, + 83FCD13C18F907C400A493F0 /* Foundation.framework in Frameworks */, + 9795D935FF6483EC5F9A5340 /* Pods_Ryff.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 83FCD15918F907C400A493F0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83FCD15E18F907C400A493F0 /* XCTest.framework in Frameworks */, + 83FCD16018F907C400A493F0 /* UIKit.framework in Frameworks */, + 83FCD15F18F907C400A493F0 /* Foundation.framework in Frameworks */, + EC092E28FF5A6FF568A7BCC8 /* Pods_RyffTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3F387BFD1B9B3C3700B5CC74 /* Data */ = { + isa = PBXGroup; + children = ( + 3F387BFE1B9B3C3E00B5CC74 /* Objects */, + 3F387C0A1B9B3F1400B5CC74 /* Data Models */, + 3F387BFF1B9B3C6900B5CC74 /* Data Managers */, + 3F387C001B9B3CBD00B5CC74 /* Services */, + ); + name = Data; + sourceTree = ""; + }; + 3F387BFE1B9B3C3E00B5CC74 /* Objects */ = { + isa = PBXGroup; + children = ( + 3F387B761B9B3C2B00B5CC74 /* RYNotification.h */, + 3F387B771B9B3C2B00B5CC74 /* RYNotification.m */, + 3F387B801B9B3C2B00B5CC74 /* RYPost.h */, + 3F387B811B9B3C2B00B5CC74 /* RYPost.m */, + 3F387BAE1B9B3C2B00B5CC74 /* RYTag.h */, + 3F387BAF1B9B3C2B00B5CC74 /* RYTag.m */, + 3F387BBA1B9B3C2B00B5CC74 /* RYUser.h */, + 3F387BBB1B9B3C2B00B5CC74 /* RYUser.m */, + ); + name = Objects; + sourceTree = ""; + }; + 3F387BFF1B9B3C6900B5CC74 /* Data Managers */ = { + isa = PBXGroup; + children = ( + 3F387B5C1B9B3C2B00B5CC74 /* RYDataManager.h */, + 3F387B5D1B9B3C2B00B5CC74 /* RYDataManager.m */, + 3F387B6C1B9B3C2B00B5CC74 /* RYMediaEditor.h */, + 3F387B6D1B9B3C2B00B5CC74 /* RYMediaEditor.m */, + 3F387B781B9B3C2B00B5CC74 /* RYNotificationsManager.h */, + 3F387B791B9B3C2B00B5CC74 /* RYNotificationsManager.m */, + 3F387BB41B9B3C2B00B5CC74 /* RYTagList.h */, + 3F387BB51B9B3C2B00B5CC74 /* RYTagList.m */, + ); + name = "Data Managers"; + sourceTree = ""; + }; + 3F387C001B9B3CBD00B5CC74 /* Services */ = { + isa = PBXGroup; + children = ( + 3F387B5E1B9B3C2B00B5CC74 /* RYDiscoverServices.h */, + 3F387B5F1B9B3C2B00B5CC74 /* RYDiscoverServices.m */, + 3F387B8E1B9B3C2B00B5CC74 /* RYRegistrationServices.h */, + 3F387B8F1B9B3C2B00B5CC74 /* RYRegistrationServices.m */, + 3F387BA61B9B3C2B00B5CC74 /* RYServices.h */, + 3F387BA71B9B3C2B00B5CC74 /* RYServices.m */, + 3F387B661B9B3C2B00B5CC74 /* RYLocationServices.h */, + 3F387B671B9B3C2B00B5CC74 /* RYLocationServices.m */, + ); + name = Services; + sourceTree = ""; + }; + 3F387C011B9B3D6A00B5CC74 /* User Interface */ = { + isa = PBXGroup; + children = ( + 3F24D8301B9B4ED300E78B05 /* RYNavigationController.h */, + 3F24D8311B9B4ED300E78B05 /* RYNavigationController.m */, + 3F387C021B9B3DA000B5CC74 /* Posts */, + 3F387C061B9B3E4400B5CC74 /* Audio Deck */, + 3F387C071B9B3E8800B5CC74 /* Registration */, + 3F387C081B9B3EAF00B5CC74 /* Discover */, + 3F387C091B9B3EE500B5CC74 /* Notifications */, + 3F387C031B9B3DA900B5CC74 /* Custom Views */, + 3F387B581B9B3C2B00B5CC74 /* RYCorePageViewController.h */, + 3F387B591B9B3C2B00B5CC74 /* RYCorePageViewController.m */, + 3F387B5A1B9B3C2B00B5CC74 /* RYCoreViewController.h */, + 3F387B5B1B9B3C2B00B5CC74 /* RYCoreViewController.m */, + 3F387B621B9B3C2B00B5CC74 /* RYGroupTableViewCell.h */, + 3F387B631B9B3C2B00B5CC74 /* RYGroupTableViewCell.m */, + 3F387B981B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.h */, + 3F387B991B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m */, + 3F387B9A1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.h */, + 3F387B9B1B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m */, + 3F387BB81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.h */, + 3F387BB91B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m */, + ); + name = "User Interface"; + sourceTree = ""; + }; + 3F387C021B9B3DA000B5CC74 /* Posts */ = { + isa = PBXGroup; + children = ( + 3F387B841B9B3C2B00B5CC74 /* RYPostsViewController.swift */, + 3F387B851B9B3C2B00B5CC74 /* RYPostTableViewCell.swift */, + 3FF2A48E1B9CCFD900EBF74D /* RYPostDetailsViewController.swift */, + 3F387C051B9B3E2600B5CC74 /* Profile */, + 3F387C041B9B3E2100B5CC74 /* Newsfeed */, + 3F387B941B9B3C2B00B5CC74 /* RYRiffCell.h */, + 3F387B951B9B3C2B00B5CC74 /* RYRiffCell.m */, + 3F387BA01B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.h */, + 3F387BA11B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m */, + 3F387BA21B9B3C2B00B5CC74 /* RYRiffStreamViewController.h */, + 3F387BA31B9B3C2B00B5CC74 /* RYRiffStreamViewController.m */, + ); + name = Posts; + sourceTree = ""; + }; + 3F387C031B9B3DA900B5CC74 /* Custom Views */ = { + isa = PBXGroup; + children = ( + 3F387B641B9B3C2B00B5CC74 /* RYLoadMoreControl.h */, + 3F387B651B9B3C2B00B5CC74 /* RYLoadMoreControl.m */, + 3F387B7E1B9B3C2B00B5CC74 /* RYPlayControl.h */, + 3F387B7F1B9B3C2B00B5CC74 /* RYPlayControl.m */, + 3F387B8C1B9B3C2B00B5CC74 /* RYRefreshControl.h */, + 3F387B8D1B9B3C2B00B5CC74 /* RYRefreshControl.m */, + 3F387BA81B9B3C2B00B5CC74 /* RYSocialTextView.h */, + 3F387BA91B9B3C2B00B5CC74 /* RYSocialTextView.m */, + 3F32A8F71B9B87F000E79282 /* RYFadingVisualEffectView.swift */, + 3FF2A4881B9CCDC500EBF74D /* RYPostTextView.swift */, + 3FF2A48B1B9CCFB300EBF74D /* RYStarredView.swift */, + 83FF51021B9E1D0500FE9E73 /* RYAddToPlaylistView.swift */, + 83FF51041B9E1D3800FE9E73 /* RYNowPlayingView.swift */, + ); + name = "Custom Views"; + sourceTree = ""; + }; + 3F387C041B9B3E2100B5CC74 /* Newsfeed */ = { + isa = PBXGroup; + children = ( + 3F387B6E1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.h */, + 3F387B6F1B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m */, + 3F387B721B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.h */, + 3F387B731B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m */, + 3F387B741B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.h */, + 3F387B751B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m */, + ); + name = Newsfeed; + sourceTree = ""; + }; + 3F387C051B9B3E2600B5CC74 /* Profile */ = { + isa = PBXGroup; + children = ( + 3F387B861B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.h */, + 3F387B871B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m */, + 3F387B891B9B3C2B00B5CC74 /* RYProfileViewController.h */, + 3F387B8A1B9B3C2B00B5CC74 /* RYProfileViewController.m */, + 3F387B8B1B9B3C2B00B5CC74 /* RYProfileViewController.swift */, + 3F3744F01B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift */, + ); + name = Profile; + sourceTree = ""; + }; + 3F387C061B9B3E4400B5CC74 /* Audio Deck */ = { + isa = PBXGroup; + children = ( + 838165891B9E2F1F002C0FDB /* RYAudioDeckViewController.swift */, + 83AEB94F1BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift */, + 83AEB94C1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift */, + 3F387B561B9B3C2B00B5CC74 /* RYAudioDeckViewController.h */, + 3F387B571B9B3C2B00B5CC74 /* RYAudioDeckViewController.m */, + 3F387B541B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.h */, + 3F387B551B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m */, + ); + name = "Audio Deck"; + sourceTree = ""; + }; + 3F387C071B9B3E8800B5CC74 /* Registration */ = { + isa = PBXGroup; + children = ( + 3F387B681B9B3C2B00B5CC74 /* RYLoginTableViewCell.h */, + 3F387B691B9B3C2B00B5CC74 /* RYLoginTableViewCell.m */, + 3F387B6A1B9B3C2B00B5CC74 /* RYLoginViewController.h */, + 3F387B6B1B9B3C2B00B5CC74 /* RYLoginViewController.m */, + ); + name = Registration; + sourceTree = ""; + }; + 3F387C081B9B3EAF00B5CC74 /* Discover */ = { + isa = PBXGroup; + children = ( + 3F387B601B9B3C2B00B5CC74 /* RYDiscoverViewController.h */, + 3F387B611B9B3C2B00B5CC74 /* RYDiscoverViewController.m */, + 3F387B9C1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.h */, + 3F387B9D1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m */, + 3F387B9E1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.h */, + 3F387B9F1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m */, + 3F387BA41B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.h */, + 3F387BA51B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m */, + 3F387BB01B9B3C2B00B5CC74 /* RYTagCollectionViewCell.h */, + 3F387BB11B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m */, + 3F387BB21B9B3C2B00B5CC74 /* RYTagFeedViewController.h */, + 3F387BB31B9B3C2B00B5CC74 /* RYTagFeedViewController.m */, + 3F387BB61B9B3C2B00B5CC74 /* RYTagListHeaderView.h */, + 3F387BB71B9B3C2B00B5CC74 /* RYTagListHeaderView.m */, + 3F387BBE1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.h */, + 3F387BBF1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m */, + 3F387BC01B9B3C2B00B5CC74 /* RYUserListViewController.h */, + 3F387BC11B9B3C2B00B5CC74 /* RYUserListViewController.m */, + ); + name = Discover; + sourceTree = ""; + }; + 3F387C091B9B3EE500B5CC74 /* Notifications */ = { + isa = PBXGroup; + children = ( + 3F387B7A1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.h */, + 3F387B7B1B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m */, + 3F387B7C1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.h */, + 3F387B7D1B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m */, + ); + name = Notifications; + sourceTree = ""; + }; + 3F387C0A1B9B3F1400B5CC74 /* Data Models */ = { + isa = PBXGroup; + children = ( + 3F387B821B9B3C2B00B5CC74 /* RYPostsDataSource.h */, + 3F387B831B9B3C2B00B5CC74 /* RYPostsDataSource.m */, + 3F387B701B9B3C2B00B5CC74 /* RYNewsfeedDataSource.h */, + 3F387B711B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m */, + 3F387BBC1B9B3C2B00B5CC74 /* RYUserFeedDataSource.h */, + 3F387BBD1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m */, + 838165961B9E370C002C0FDB /* RYAudioDeck.swift */, + 838165991B9E3764002C0FDB /* RYAudioDeckPlaylist.swift */, + ); + name = "Data Models"; + sourceTree = ""; + }; + 3F387C0B1B9B3F5300B5CC74 /* Audio Mixer */ = { + isa = PBXGroup; + children = ( + 3F387B901B9B3C2B00B5CC74 /* RYRiffAudioEngine.h */, + 3F387B911B9B3C2B00B5CC74 /* RYRiffAudioEngine.m */, + 3F387B921B9B3C2B00B5CC74 /* RYRiffAudioNode.h */, + 3F387B931B9B3C2B00B5CC74 /* RYRiffAudioNode.m */, + 3F387B961B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift */, + 3F387B971B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift */, + ); + name = "Audio Mixer"; + sourceTree = ""; + }; + 3F387C0C1B9B3F6D00B5CC74 /* Style */ = { + isa = PBXGroup; + children = ( + 3FE76E681B9B443900099CF5 /* Media.xcassets */, + 3F387BAA1B9B3C2B00B5CC74 /* RYStyleSheet.h */, + 3F387BAB1B9B3C2B00B5CC74 /* RYStyleSheet.m */, + 3FF2A4941B9CD1A000EBF74D /* Constants.swift */, + 3F387C0D1B9B3F8900B5CC74 /* Main.storyboard */, + 3F387C0E1B9B3F8900B5CC74 /* RiffCreate.storyboard */, + 3F387C0F1B9B3F8900B5CC74 /* RYRiffCell.xib */, + 3F387C101B9B3F8900B5CC74 /* RYRiffCellAvatar.xib */, + 3F387C111B9B3F8900B5CC74 /* RYRiffDetailsCell.xib */, + 3F387C171B9B3F9400B5CC74 /* Lato-Bol.ttf */, + 3F387C181B9B3F9400B5CC74 /* Lato-Lig.ttf */, + 3F387C191B9B3F9400B5CC74 /* Lato-Reg.ttf */, + 3F387C1A1B9B3F9400B5CC74 /* Lato-RegIta.ttf */, + ); + name = Style; + sourceTree = ""; + }; + 3F387C1F1B9B3FA600B5CC74 /* Categories and Extensions */ = { + isa = PBXGroup; + children = ( + 3F387C201B9B3FB200B5CC74 /* NSObject+block.h */, + 3F387C211B9B3FB200B5CC74 /* NSObject+block.m */, + 3F387C221B9B3FB200B5CC74 /* UIColor+Hex.h */, + 3F387C231B9B3FB200B5CC74 /* UIColor+Hex.m */, + 3F387C241B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.h */, + 3F387C251B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m */, + 3F387C261B9B3FB200B5CC74 /* UIImage+Color.h */, + 3F387C271B9B3FB200B5CC74 /* UIImage+Color.m */, + 3F387C281B9B3FB200B5CC74 /* UIImage+Size.h */, + 3F387C291B9B3FB200B5CC74 /* UIImage+Size.m */, + 3F387C2A1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.h */, + 3F387C2B1B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m */, + 3F387C2C1B9B3FB200B5CC74 /* UIView+Styling.h */, + 3F387C2D1B9B3FB200B5CC74 /* UIView+Styling.m */, + 3F387C2E1B9B3FB200B5CC74 /* UIViewController+Extras.h */, + 3F387C2F1B9B3FB200B5CC74 /* UIViewController+Extras.m */, + 3F387C301B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.h */, + 3F387C311B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m */, + 3F3744ED1B9B9442005A9DD2 /* UILayoutPriority.swift */, + 3FF2A4911B9CCFEC00EBF74D /* UIViewController+Transitions.swift */, + 3FF2A49D1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift */, + 83F4EEBB1B9D3921007CF11A /* NSMutableDictionary+Safety.h */, + 83F4EEBC1B9D3921007CF11A /* NSMutableDictionary+Safety.m */, + 83F4EEBE1B9D3A8F007CF11A /* NSDictionary+Safety.h */, + 83F4EEBF1B9D3A8F007CF11A /* NSDictionary+Safety.m */, + 8381658C1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift */, + ); + name = "Categories and Extensions"; + sourceTree = ""; + }; + 3F387C3B1B9B3FF000B5CC74 /* Extras */ = { + isa = PBXGroup; + children = ( + 3FE76E5C1B9B412E00099CF5 /* CrittercismSDK */, + 3FE76E541B9B40FF00099CF5 /* BNRDynamicTypeManager */, + 3FE76E4D1B9B40F300099CF5 /* PXAlertView */, + 3FE76E491B9B40DF00099CF5 /* DWTagList */, + 3FE76E411B9B40BB00099CF5 /* BlockAlert */, + 3FE76E441B9B40BB00099CF5 /* FDWaveformView */, + ); + name = Extras; + sourceTree = ""; + }; + 3FE76E411B9B40BB00099CF5 /* BlockAlert */ = { + isa = PBXGroup; + children = ( + 3FE76E421B9B40BB00099CF5 /* BlockAlertView.h */, + 3FE76E431B9B40BB00099CF5 /* BlockAlertView.m */, + ); + name = BlockAlert; + path = Frameworks/BlockAlert; + sourceTree = ""; + }; + 3FE76E441B9B40BB00099CF5 /* FDWaveformView */ = { + isa = PBXGroup; + children = ( + 3FE76E451B9B40BB00099CF5 /* FDWaveformView.h */, + 3FE76E461B9B40BB00099CF5 /* FDWaveformView.m */, + ); + name = FDWaveformView; + path = Frameworks/FDWaveformView; + sourceTree = ""; + }; + 3FE76E491B9B40DF00099CF5 /* DWTagList */ = { + isa = PBXGroup; + children = ( + 3FE76E4A1B9B40DF00099CF5 /* DWTagList.h */, + 3FE76E4B1B9B40DF00099CF5 /* DWTagList.m */, + ); + name = DWTagList; + path = Frameworks/DWTagList; + sourceTree = ""; + }; + 3FE76E4D1B9B40F300099CF5 /* PXAlertView */ = { + isa = PBXGroup; + children = ( + 3FE76E4E1B9B40F300099CF5 /* PXAlertView+Customization.h */, + 3FE76E4F1B9B40F300099CF5 /* PXAlertView+Customization.m */, + 3FE76E501B9B40F300099CF5 /* PXAlertView.h */, + 3FE76E511B9B40F300099CF5 /* PXAlertView.m */, + ); + name = PXAlertView; + path = Frameworks/PXAlertView; + sourceTree = ""; + }; + 3FE76E541B9B40FF00099CF5 /* BNRDynamicTypeManager */ = { + isa = PBXGroup; + children = ( + 3FE76E551B9B40FF00099CF5 /* Core */, + ); + name = BNRDynamicTypeManager; + path = Frameworks/BNRDynamicTypeManager; + sourceTree = ""; + }; + 3FE76E551B9B40FF00099CF5 /* Core */ = { + isa = PBXGroup; + children = ( + 3FE76E561B9B40FF00099CF5 /* BNRDynamicTypeManager.h */, + 3FE76E571B9B40FF00099CF5 /* BNRDynamicTypeManager.m */, + ); + path = Core; + sourceTree = ""; + }; + 3FE76E5C1B9B412E00099CF5 /* CrittercismSDK */ = { + isa = PBXGroup; + children = ( + 3FE76E5D1B9B412E00099CF5 /* CRFilter.h */, + 3FE76E5E1B9B412E00099CF5 /* Crittercism.h */, + 3FE76E5F1B9B412E00099CF5 /* CrittercismDelegate.h */, + 3FE76E601B9B412E00099CF5 /* dsym_upload.sh */, + 3FE76E611B9B412E00099CF5 /* libCrittercism_v4_3_7.a */, + ); + name = CrittercismSDK; + path = Frameworks/CrittercismSDK; + sourceTree = ""; + }; + 3FE76E661B9B43E700099CF5 /* Main Application */ = { + isa = PBXGroup; + children = ( + 3FE76E591B9B411C00099CF5 /* RYAppDelegate.h */, + 3FE76E5A1B9B411C00099CF5 /* RYAppDelegate.m */, + 3F387BAC1B9B3C2B00B5CC74 /* RYTabBarViewController.h */, + 3F387BAD1B9B3C2B00B5CC74 /* RYTabBarViewController.m */, + 3FF2A49C1B9CDF4F00EBF74D /* Ryff-Bridging-Header.h */, + ); + name = "Main Application"; + sourceTree = ""; + }; + 5BD8AE6B5B14CE56E937FC6A /* Pods */ = { + isa = PBXGroup; + children = ( + 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */, + 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */, + 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */, + 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 83FCD12F18F907C400A493F0 = { + isa = PBXGroup; + children = ( + 83FCD14118F907C400A493F0 /* Ryff */, + 83FCD16318F907C400A493F0 /* RyffTests */, + 83FCD13A18F907C400A493F0 /* Frameworks */, + 83FCD13918F907C400A493F0 /* Products */, + 5BD8AE6B5B14CE56E937FC6A /* Pods */, + ); + sourceTree = ""; + }; + 83FCD13918F907C400A493F0 /* Products */ = { + isa = PBXGroup; + children = ( + 83FCD13818F907C400A493F0 /* Ryff.app */, + 83FCD15C18F907C400A493F0 /* RyffTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 83FCD13A18F907C400A493F0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 83FADE4B19AC54DA00182155 /* QuartzCore.framework */, + 830BBCC918FA0C2300A9C53F /* CoreLocation.framework */, + 83FCD13B18F907C400A493F0 /* Foundation.framework */, + 83FCD13D18F907C400A493F0 /* CoreGraphics.framework */, + 83FCD13F18F907C400A493F0 /* UIKit.framework */, + 83FCD15D18F907C400A493F0 /* XCTest.framework */, + CB93B1A2EE317EA6B5C1F4CD /* Pods_Ryff.framework */, + E251082A40810E7130987A45 /* Pods_RyffTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 83FCD14118F907C400A493F0 /* Ryff */ = { + isa = PBXGroup; + children = ( + 3FE76E661B9B43E700099CF5 /* Main Application */, + 3F387BFD1B9B3C3700B5CC74 /* Data */, + 3F387C011B9B3D6A00B5CC74 /* User Interface */, + 3F387C0B1B9B3F5300B5CC74 /* Audio Mixer */, + 3F387C1F1B9B3FA600B5CC74 /* Categories and Extensions */, + 3F387C0C1B9B3F6D00B5CC74 /* Style */, + 3F387C3B1B9B3FF000B5CC74 /* Extras */, + 83FCD15618F907C400A493F0 /* Images.xcassets */, + 83FCD14218F907C400A493F0 /* Supporting Files */, + ); + path = Ryff; + sourceTree = ""; + }; + 83FCD14218F907C400A493F0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 83FCD14318F907C400A493F0 /* Ryff-Info.plist */, + 83FCD14418F907C400A493F0 /* InfoPlist.strings */, + 83FCD14718F907C400A493F0 /* main.m */, + 83FCD14918F907C400A493F0 /* Ryff-Prefix.pch */, + 3F15B36E1B9A2EA6009F3790 /* SwiftCompatability.h */, + 839480541BB34531001A719A /* Launch Screen.storyboard */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 83FCD16318F907C400A493F0 /* RyffTests */ = { + isa = PBXGroup; + children = ( + 83FCD16918F907C400A493F0 /* RyffTests.m */, + 83FCD16418F907C400A493F0 /* Supporting Files */, + ); + path = RyffTests; + sourceTree = ""; + }; + 83FCD16418F907C400A493F0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 83FCD16518F907C400A493F0 /* RyffTests-Info.plist */, + 83FCD16618F907C400A493F0 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 83FCD13718F907C400A493F0 /* Ryff */ = { + isa = PBXNativeTarget; + buildConfigurationList = 83FCD16D18F907C400A493F0 /* Build configuration list for PBXNativeTarget "Ryff" */; + buildPhases = ( + 14EE549E532443BF66C382E8 /* Check Pods Manifest.lock */, + 83FCD13418F907C400A493F0 /* Sources */, + 83FCD13518F907C400A493F0 /* Frameworks */, + 83FCD13618F907C400A493F0 /* Resources */, + 835E1E0719D21BFB007EBD74 /* Run Script */, + 7F9865D3E129952ED8C70A59 /* Copy Pods Resources */, + 0DB45C9E4B0C6A0C57AEE9C8 /* Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Ryff; + productName = Ryff; + productReference = 83FCD13818F907C400A493F0 /* Ryff.app */; + productType = "com.apple.product-type.application"; + }; + 83FCD15B18F907C400A493F0 /* RyffTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 83FCD17018F907C400A493F0 /* Build configuration list for PBXNativeTarget "RyffTests" */; + buildPhases = ( + 02E5AC0A959165E21C0D7ADC /* Check Pods Manifest.lock */, + 83FCD15818F907C400A493F0 /* Sources */, + 83FCD15918F907C400A493F0 /* Frameworks */, + 83FCD15A18F907C400A493F0 /* Resources */, + 3548D77566CAD9E664FC3FA6 /* Copy Pods Resources */, + 89A4492C7B6EF4DDA854E096 /* Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 83FCD16218F907C400A493F0 /* PBXTargetDependency */, + ); + name = RyffTests; + productName = RyffTests; + productReference = 83FCD15C18F907C400A493F0 /* RyffTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83FCD13018F907C400A493F0 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = RY; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = "Chris Laganiere"; + TargetAttributes = { + 83FCD13718F907C400A493F0 = { + DevelopmentTeam = DGUKNK322A; + }; + 83FCD15B18F907C400A493F0 = { + DevelopmentTeam = DGUKNK322A; + TestTargetID = 83FCD13718F907C400A493F0; + }; + }; + }; + buildConfigurationList = 83FCD13318F907C400A493F0 /* Build configuration list for PBXProject "Ryff" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83FCD12F18F907C400A493F0; + productRefGroup = 83FCD13918F907C400A493F0 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 83FCD13718F907C400A493F0 /* Ryff */, + 83FCD15B18F907C400A493F0 /* RyffTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 83FCD13618F907C400A493F0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3FE76E621B9B412E00099CF5 /* dsym_upload.sh in Resources */, + 3F387C121B9B3F8900B5CC74 /* Main.storyboard in Resources */, + 3FE76E691B9B443900099CF5 /* Media.xcassets in Resources */, + 83FCD15718F907C400A493F0 /* Images.xcassets in Resources */, + 3F387C1C1B9B3F9400B5CC74 /* Lato-Lig.ttf in Resources */, + 3F387C1B1B9B3F9400B5CC74 /* Lato-Bol.ttf in Resources */, + 839480551BB34531001A719A /* Launch Screen.storyboard in Resources */, + 3F387C161B9B3F8900B5CC74 /* RYRiffDetailsCell.xib in Resources */, + 3F387C151B9B3F8900B5CC74 /* RYRiffCellAvatar.xib in Resources */, + 3F387C141B9B3F8900B5CC74 /* RYRiffCell.xib in Resources */, + 3F387C1E1B9B3F9400B5CC74 /* Lato-RegIta.ttf in Resources */, + 83FCD14618F907C400A493F0 /* InfoPlist.strings in Resources */, + 3F387C131B9B3F8900B5CC74 /* RiffCreate.storyboard in Resources */, + 3F387C1D1B9B3F9400B5CC74 /* Lato-Reg.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 83FCD15A18F907C400A493F0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 83FCD16818F907C400A493F0 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 02E5AC0A959165E21C0D7ADC /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + 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"; + showEnvVarsInLog = 0; + }; + 0DB45C9E4B0C6A0C57AEE9C8 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 14EE549E532443BF66C382E8 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + 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"; + showEnvVarsInLog = 0; + }; + 3548D77566CAD9E664FC3FA6 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7F9865D3E129952ED8C70A59 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Ryff/Pods-Ryff-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 835E1E0719D21BFB007EBD74 /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = ""; + }; + 89A4492C7B6EF4DDA854E096 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RyffTests/Pods-RyffTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 83FCD13418F907C400A493F0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F387BD31B9B3C2B00B5CC74 /* RYNewsfeedTableViewController.m in Sources */, + 3FE76E521B9B40F300099CF5 /* PXAlertView+Customization.m in Sources */, + 3F387BE21B9B3C2B00B5CC74 /* RYRegistrationServices.m in Sources */, + 3F387C321B9B3FB200B5CC74 /* NSObject+block.m in Sources */, + 3F387BE41B9B3C2B00B5CC74 /* RYRiffAudioNode.m in Sources */, + 8381658D1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */, + 3F387BF01B9B3C2B00B5CC74 /* RYSocialTextView.m in Sources */, + 3F387BC61B9B3C2B00B5CC74 /* RYCoreViewController.m in Sources */, + 3F387BFB1B9B3C2B00B5CC74 /* RYUserListCollectionViewCell.m in Sources */, + 3F387BEF1B9B3C2B00B5CC74 /* RYServices.m in Sources */, + 3F387C341B9B3FB200B5CC74 /* UIFontDescriptor+RYCustomFont.m in Sources */, + 3F387BF11B9B3C2B00B5CC74 /* RYStyleSheet.m in Sources */, + 3FF2A4951B9CD1A000EBF74D /* Constants.swift in Sources */, + 3F387BEE1B9B3C2B00B5CC74 /* RYSearchTypeTableViewCell.m in Sources */, + 3F387BEB1B9B3C2B00B5CC74 /* RYRiffDetailsViewController.m in Sources */, + 3F3744EE1B9B9442005A9DD2 /* UILayoutPriority.swift in Sources */, + 83FF51051B9E1D3800FE9E73 /* RYNowPlayingView.swift in Sources */, + 3F387C331B9B3FB200B5CC74 /* UIColor+Hex.m in Sources */, + 83F4EEC01B9D3A8F007CF11A /* NSDictionary+Safety.m in Sources */, + 3F387BE61B9B3C2B00B5CC74 /* RYRiffMixerViewController.swift in Sources */, + 83F4EEBD1B9D3921007CF11A /* NSMutableDictionary+Safety.m in Sources */, + 3F387BF21B9B3C2B00B5CC74 /* RYTabBarViewController.m in Sources */, + 3F387BDF1B9B3C2B00B5CC74 /* RYProfileViewController.m in Sources */, + 3FE76E4C1B9B40DF00099CF5 /* DWTagList.m in Sources */, + 3FE76E531B9B40F300099CF5 /* PXAlertView.m in Sources */, + 3F387BDD1B9B3C2B00B5CC74 /* RYProfileInfoTableViewCell.m in Sources */, + 3F387BF41B9B3C2B00B5CC74 /* RYTagCollectionViewCell.m in Sources */, + 3F387C3A1B9B3FB200B5CC74 /* UIViewController+RYSocialTransitions.m in Sources */, + 3F387BDB1B9B3C2B00B5CC74 /* RYPostsViewController.swift in Sources */, + 3F387BE31B9B3C2B00B5CC74 /* RYRiffAudioEngine.m in Sources */, + 3F387C351B9B3FB200B5CC74 /* UIImage+Color.m in Sources */, + 3F387BF61B9B3C2B00B5CC74 /* RYTagList.m in Sources */, + 3F387BCA1B9B3C2B00B5CC74 /* RYGroupTableViewCell.m in Sources */, + 3F387BD71B9B3C2B00B5CC74 /* RYNotificationsTableViewController.m in Sources */, + 3F387BCE1B9B3C2B00B5CC74 /* RYLoginViewController.m in Sources */, + 3F387BCC1B9B3C2B00B5CC74 /* RYLocationServices.m in Sources */, + 3F387BCB1B9B3C2B00B5CC74 /* RYLoadMoreControl.m in Sources */, + 3F387BE51B9B3C2B00B5CC74 /* RYRiffCell.m in Sources */, + 3FF2A48C1B9CCFB300EBF74D /* RYStarredView.swift in Sources */, + 3F387BD61B9B3C2B00B5CC74 /* RYNotificationsTableViewCell.m in Sources */, + 83AEB94D1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift in Sources */, + 3F387BD91B9B3C2B00B5CC74 /* RYPost.m in Sources */, + 3F387BD11B9B3C2B00B5CC74 /* RYNewsfeedDataSource.m in Sources */, + 3FE76E5B1B9B411C00099CF5 /* RYAppDelegate.m in Sources */, + 3F387BF71B9B3C2B00B5CC74 /* RYTagListHeaderView.m in Sources */, + 3FF2A48F1B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */, + 3F387BF91B9B3C2B00B5CC74 /* RYUser.m in Sources */, + 3F387BC71B9B3C2B00B5CC74 /* RYDataManager.m in Sources */, + 3F387BC51B9B3C2B00B5CC74 /* RYCorePageViewController.m in Sources */, + 3FF2A49E1B9CF23A00EBF74D /* KRLCollectionViewGridLayout+Ryff.swift in Sources */, + 3F387C361B9B3FB200B5CC74 /* UIImage+Size.m in Sources */, + 3F387BE81B9B3C2B00B5CC74 /* RYRiffCreateOldViewController.m in Sources */, + 3F387BC41B9B3C2B00B5CC74 /* RYAudioDeckViewController.m in Sources */, + 3FE76E581B9B40FF00099CF5 /* BNRDynamicTypeManager.m in Sources */, + 3F387BCF1B9B3C2B00B5CC74 /* RYMediaEditor.m in Sources */, + 3F387BE01B9B3C2B00B5CC74 /* RYProfileViewController.swift in Sources */, + 3F387C371B9B3FB200B5CC74 /* UIImagePickerController+Orientations.m in Sources */, + 3F387BC91B9B3C2B00B5CC74 /* RYDiscoverViewController.m in Sources */, + 83AEB9501BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift in Sources */, + 3F387BE91B9B3C2B00B5CC74 /* RYRiffCreateTableViewCell.m in Sources */, + 3F387BEA1B9B3C2B00B5CC74 /* RYRiffDetailsTableViewCell.m in Sources */, + 3F387BEC1B9B3C2B00B5CC74 /* RYRiffStreamingCoreViewController.m in Sources */, + 3F387C391B9B3FB200B5CC74 /* UIViewController+Extras.m in Sources */, + 8381659A1B9E3764002C0FDB /* RYAudioDeckPlaylist.swift in Sources */, + 3F32A8F81B9B87F000E79282 /* RYFadingVisualEffectView.swift in Sources */, + 3FF2A4891B9CCDC500EBF74D /* RYPostTextView.swift in Sources */, + 3F387BF31B9B3C2B00B5CC74 /* RYTag.m in Sources */, + 3F387BD21B9B3C2B00B5CC74 /* RYNewsfeedNavigationController.m in Sources */, + 3F387BC81B9B3C2B00B5CC74 /* RYDiscoverServices.m in Sources */, + 3F387BD01B9B3C2B00B5CC74 /* RYNewsfeedContainerViewController.m in Sources */, + 3F387BFA1B9B3C2B00B5CC74 /* RYUserFeedDataSource.m in Sources */, + 838165971B9E370C002C0FDB /* RYAudioDeck.swift in Sources */, + 3F387BFC1B9B3C2B00B5CC74 /* RYUserListViewController.m in Sources */, + 3F387BC31B9B3C2B00B5CC74 /* RYAudioDeckTableViewCell.m in Sources */, + 3F387BD51B9B3C2B00B5CC74 /* RYNotificationsManager.m in Sources */, + 3F387BD81B9B3C2B00B5CC74 /* RYPlayControl.m in Sources */, + 83FF51031B9E1D0500FE9E73 /* RYAddToPlaylistView.swift in Sources */, + 3F3744F11B9BA7C1005A9DD2 /* RYUserProfileTableViewCell.swift in Sources */, + 3F387BD41B9B3C2B00B5CC74 /* RYNotification.m in Sources */, + 3F387BE71B9B3C2B00B5CC74 /* RYRiffMixerNodeCollectionViewCell.swift in Sources */, + 3F387BDC1B9B3C2B00B5CC74 /* RYPostTableViewCell.swift in Sources */, + 3F387BDA1B9B3C2B00B5CC74 /* RYPostsDataSource.m in Sources */, + 3F387BE11B9B3C2B00B5CC74 /* RYRefreshControl.m in Sources */, + 3F387BF51B9B3C2B00B5CC74 /* RYTagFeedViewController.m in Sources */, + 3F387C381B9B3FB200B5CC74 /* UIView+Styling.m in Sources */, + 3F387BF81B9B3C2B00B5CC74 /* RYTrackDownloadTableViewCell.m in Sources */, + 3F387BCD1B9B3C2B00B5CC74 /* RYLoginTableViewCell.m in Sources */, + 3FE76E471B9B40BB00099CF5 /* BlockAlertView.m in Sources */, + 3F24D8321B9B4ED300E78B05 /* RYNavigationController.m in Sources */, + 3FF2A4921B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */, + 3F387BED1B9B3C2B00B5CC74 /* RYRiffStreamViewController.m in Sources */, + 83FCD14818F907C400A493F0 /* main.m in Sources */, + 8381658A1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 83FCD15818F907C400A493F0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 838165851B9E2110002C0FDB /* BNRDynamicTypeManager.m in Sources */, + 3F51B57F1B9BB435007A136D /* RYUserProfileTableViewCell.swift in Sources */, + 83FCD16A18F907C400A493F0 /* RyffTests.m in Sources */, + 8381659B1B9E3764002C0FDB /* RYAudioDeckPlaylist.swift in Sources */, + 83AEB94E1BA3C43F00BFB15D /* RYAudioDeckTableViewCell.swift in Sources */, + 3F3744EC1B9B89B4005A9DD2 /* RYFadingVisualEffectView.swift in Sources */, + 3FF2A4931B9CCFEC00EBF74D /* UIViewController+Transitions.swift in Sources */, + 83FF51071B9E1D4000FE9E73 /* RYAddToPlaylistView.swift in Sources */, + 8381658B1B9E2F1F002C0FDB /* RYAudioDeckViewController.swift in Sources */, + 83FF51061B9E1D3D00FE9E73 /* RYNowPlayingView.swift in Sources */, + 3FF2A4901B9CCFD900EBF74D /* RYPostDetailsViewController.swift in Sources */, + 3F51B5801B9BB438007A136D /* RYProfileViewController.swift in Sources */, + 838165981B9E370C002C0FDB /* RYAudioDeck.swift in Sources */, + 3FE76E641B9B414500099CF5 /* RYPostsViewController.swift in Sources */, + 3FF2A48A1B9CCDC500EBF74D /* RYPostTextView.swift in Sources */, + 3F3744EF1B9B94CC005A9DD2 /* UILayoutPriority.swift in Sources */, + 83AEB9511BA3C85A00BFB15D /* RYAudioDeckConsoleView.swift in Sources */, + 3FE76E651B9B414900099CF5 /* RYPostTableViewCell.swift in Sources */, + 3FF2A48D1B9CCFB300EBF74D /* RYStarredView.swift in Sources */, + 3FF2A4961B9CD1A000EBF74D /* Constants.swift in Sources */, + 8381658E1B9E2F45002C0FDB /* UIKit+BNRDynamicTypeManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 83FCD16218F907C400A493F0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 83FCD13718F907C400A493F0 /* Ryff */; + targetProxy = 83FCD16118F907C400A493F0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 83FCD14418F907C400A493F0 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 83FCD14518F907C400A493F0 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 83FCD16618F907C400A493F0 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 83FCD16718F907C400A493F0 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 83FCD16B18F907C400A493F0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer: Christopher Laganiere (6EN5YZJ6J8)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Christopher Laganiere (6EN5YZJ6J8)"; + COPY_PHASE_STRIP = NO; + DEFINES_MODULE = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "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.3; + MODULE_NAME = Ryff; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83FCD16C18F907C400A493F0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer: Christopher Laganiere (6EN5YZJ6J8)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Christopher Laganiere (6EN5YZJ6J8)"; + COPY_PHASE_STRIP = YES; + DEFINES_MODULE = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + 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.3; + MODULE_NAME = Ryff; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 83FCD16E18F907C400A493F0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0F068F340A8DD53B769F8B4B /* Pods-Ryff.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "Ryff Icon"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/**"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "COCOAPODS=1", + "RYFF=1", + ); + INFOPLIST_FILE = "Ryff/Ryff-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Ryff/Frameworks/CrittercismSDK", + ); + MODULE_NAME = Ryff; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 83FCD16F18F907C400A493F0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5D10781F97C58C1D8BE87763 /* Pods-Ryff.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "Ryff Icon"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/**"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "COCOAPODS=1", + "RYFF=1", + ); + INFOPLIST_FILE = "Ryff/Ryff-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Ryff/Frameworks/CrittercismSDK", + ); + MODULE_NAME = Ryff; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 83FCD17118F907C400A493F0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7FFE42F2F5730A2D8E9FEB19 /* Pods-RyffTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Ryff.app/Ryff"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "RYFFTESTS=1", + "$(inherited)", + ); + INFOPLIST_FILE = "RyffTests/RyffTests-Info.plist"; + MODULE_NAME = RyffTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 83FCD17218F907C400A493F0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6616A16D4F2C65AA11F6581D /* Pods-RyffTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Ryff.app/Ryff"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Ryff/Ryff-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "RYFFTESTS=1", + "$(inherited)", + ); + INFOPLIST_FILE = "RyffTests/RyffTests-Info.plist"; + MODULE_NAME = RyffTests; + PRODUCT_BUNDLE_IDENTIFIER = "com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Ryff-Bridging-Header.h"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 83FCD13318F907C400A493F0 /* Build configuration list for PBXProject "Ryff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83FCD16B18F907C400A493F0 /* Debug */, + 83FCD16C18F907C400A493F0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83FCD16D18F907C400A493F0 /* Build configuration list for PBXNativeTarget "Ryff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83FCD16E18F907C400A493F0 /* Debug */, + 83FCD16F18F907C400A493F0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83FCD17018F907C400A493F0 /* Build configuration list for PBXNativeTarget "RyffTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83FCD17118F907C400A493F0 /* Debug */, + 83FCD17218F907C400A493F0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83FCD13018F907C400A493F0 /* Project object */; +} diff --git a/Ryff.xcodeproj/project.xcworkspace/xcshareddata/Ryff.xccheckout b/Ryff.xcodeproj/project.xcworkspace/xcshareddata/Ryff.xccheckout new file mode 100644 index 0000000..9e39d40 --- /dev/null +++ b/Ryff.xcodeproj/project.xcworkspace/xcshareddata/Ryff.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 36375EC2-AAC1-4B47-90CA-6A93ADDE71EC + IDESourceControlProjectName + Ryff + IDESourceControlProjectOriginsDictionary + + 103674B814EF5550982804383F692DA62445215C + https://github.com/RyffProject/ryff-ios.git + + IDESourceControlProjectPath + Ryff.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 103674B814EF5550982804383F692DA62445215C + ../.. + + IDESourceControlProjectURL + https://github.com/RyffProject/ryff-ios.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 103674B814EF5550982804383F692DA62445215C + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 103674B814EF5550982804383F692DA62445215C + IDESourceControlWCCName + Ryff + + + + diff --git a/Ryff.xcodeproj/project.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate b/Ryff.xcodeproj/project.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..7b938c6 Binary files /dev/null and b/Ryff.xcodeproj/project.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Ryff.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Ryff.xcscheme b/Ryff.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Ryff.xcscheme index 6f5b32f..c247ea2 100644 --- a/Ryff.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Ryff.xcscheme +++ b/Ryff.xcodeproj/xcuserdata/Chris.xcuserdatad/xcschemes/Ryff.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -48,17 +48,21 @@ ReferencedContainer = "container:Ryff.xcodeproj"> + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ryff.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist b/Ryff.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..1560b3e --- /dev/null +++ b/Ryff.xcodeproj/xcuserdata/chrislaganiere.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Ryff.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 83FCD13718F907C400A493F0 + + primary + + + 83FCD15B18F907C400A493F0 + + primary + + + + + diff --git a/Ryff.xcworkspace/contents.xcworkspacedata b/Ryff.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..de75859 --- /dev/null +++ b/Ryff.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Ryff.xcworkspace/xcshareddata/Ryff.xccheckout b/Ryff.xcworkspace/xcshareddata/Ryff.xccheckout new file mode 100644 index 0000000..b7b6d3d --- /dev/null +++ b/Ryff.xcworkspace/xcshareddata/Ryff.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 17035F9E-0FC2-455D-9DFF-6D77817C41DE + IDESourceControlProjectName + Ryff + IDESourceControlProjectOriginsDictionary + + 103674B814EF5550982804383F692DA62445215C + https://github.com/RyffProject/ryff-ios.git + + IDESourceControlProjectPath + Ryff.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 103674B814EF5550982804383F692DA62445215C + .. + + IDESourceControlProjectURL + https://github.com/RyffProject/ryff-ios.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 103674B814EF5550982804383F692DA62445215C + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 103674B814EF5550982804383F692DA62445215C + IDESourceControlWCCName + Ryff + + + + diff --git a/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/UserInterfaceState.xcuserstate b/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..0212af1 Binary files /dev/null and b/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e2573a5 --- /dev/null +++ b/Ryff.xcworkspace/xcuserdata/Chris.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate b/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..ee189b9 Binary files /dev/null and b/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e2573a5 --- /dev/null +++ b/Ryff.xcworkspace/xcuserdata/chrislaganiere.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/Ryff/AudioDeck/RYAudioDeckManager.h b/Ryff/AudioDeck/RYAudioDeckManager.h deleted file mode 100644 index ee39591..0000000 --- a/Ryff/AudioDeck/RYAudioDeckManager.h +++ /dev/null @@ -1,56 +0,0 @@ -// -// RYAudioDeckManager.h -// Ryff -// -// Created by Christopher Laganiere on 8/10/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import - -#define kTrackChangedNotification @"AudioDeckTrackChanged" -#define kPlaylistChangedNotification @"AudioDeckPlaylistChanged" -#define kPlaybackChangedNotification @"AudioDeckPlaybackChanged" -#define kDownloadProgressNotification @"AudioDeckDownloadProgressChanged" - -@class RYPost; - -@protocol AudioDeckDelegate -@optional -- (void) riffPlaylistUpdated; -- (void) trackChanged; -- (void) post:(RYPost *)post playbackTimeChanged:(CGFloat)time progress:(CGFloat)progress; -- (void) post:(RYPost *)post downloadProgressChanged:(CGFloat)progress; -@end - -@interface RYAudioDeckManager : NSObject - -@property (nonatomic, weak) id delegate; - -+ (instancetype) sharedInstance; - -// Media Control -- (void) playTrack:(BOOL)playTrack; -- (void) setPlaybackProgress:(CGFloat)progress; -- (void) skipTrack; - -// Media -- (CGFloat) currentPlaybackProgress; -- (BOOL) isPlaying; - -// Data Control -- (void) forcePostToTop:(RYPost *)post; -- (void) addPostToPlaylist:(RYPost *)post; -- (void) movePostFromPlaylistIndex:(NSInteger)playlistIdx toIndex:(NSInteger)newPlaylistIdx; -- (void) removePostFromPlaylist:(RYPost *)post; -- (NSInteger) idxOfDownload:(RYPost *)post; -- (NSInteger) idxInPlaylistOfPost:(RYPost *)post; -- (BOOL) playlistContainsPost:(NSInteger)postID; -- (BOOL) playlistContainsFile:(NSString *)fileName; - -// Data -- (RYPost *)currentlyPlayingPost; -- (NSArray *)riffPlaylist; -- (NSArray *)downloadQueue; - -@end diff --git a/Ryff/AudioDeck/RYAudioDeckManager.m b/Ryff/AudioDeck/RYAudioDeckManager.m deleted file mode 100644 index c4ae8d9..0000000 --- a/Ryff/AudioDeck/RYAudioDeckManager.m +++ /dev/null @@ -1,519 +0,0 @@ -// -// RYAudioDeckManager.m -// Ryff -// -// Created by Christopher Laganiere on 8/10/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import "RYAudioDeckManager.h" - -// Data Managers -#import "RYDataManager.h" - -// Data Objects -#import "RYPost.h" -#import "RYUser.h" - -// Frameworks -#import -#import -#import "SDWebImageManager.h" - -#define kRecentlyPlayedSize 5 - -@interface RYAudioDeckManager () - -// data arrays populated with RYPost objects -@property (nonatomic, strong) NSMutableArray *recentlyPlayed; -@property (nonatomic, strong) NSMutableArray *riffPlaylist; -@property (nonatomic, strong) NSMutableArray *downloadQueue; -@property (nonatomic, strong) RYPost *currentlyPlayingPost; - -@property (nonatomic, strong) AVAudioPlayer *audioPlayer; - -@property (nonatomic, strong) UIImage *nowPlayingArtwork; - -@property (nonatomic, strong) NSTimer *updatePlaybackTimer; - -@end - -@implementation RYAudioDeckManager - -static RYAudioDeckManager *_sharedInstance; -+ (instancetype)sharedInstance -{ - if (_sharedInstance == NULL) - { - _sharedInstance = [RYAudioDeckManager allocWithZone:NULL]; - _sharedInstance.recentlyPlayed = [[NSMutableArray alloc] init]; - _sharedInstance.downloadQueue = [[NSMutableArray alloc] init]; - _sharedInstance.riffPlaylist = [[NSMutableArray alloc] init]; - - _sharedInstance.updatePlaybackTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:_sharedInstance selector:@selector(updatePlaybackProgress:) userInfo:nil repeats:YES]; - - [[NSRunLoop currentRunLoop] addTimer:_sharedInstance.updatePlaybackTimer forMode:NSRunLoopCommonModes]; - - AVAudioSession *audioSession = [AVAudioSession sharedInstance]; - NSError *setCategoryError = nil; - BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; - if (!success) - NSLog(@"error: %@",[setCategoryError localizedDescription]); - - NSError *activationError = nil; - success = [audioSession setActive:YES error:&activationError]; - if (!success) - NSLog(@"error: %@",[activationError localizedDescription]); - } - return _sharedInstance; -} - -#pragma mark - -#pragma mark - Media Control - -- (void) playTrack:(BOOL)playTrack -{ - if (playTrack) - { - if (_audioPlayer) - { - if (!_audioPlayer.isPlaying) - [_audioPlayer play]; - } - else - { - [self playNextTrack]; - } - } - else - { - if (_audioPlayer.isPlaying) - [_audioPlayer pause]; - } - - [self notifyTrackChanged]; -} - -- (void) setPlaybackProgress:(CGFloat)progress -{ - if (_audioPlayer) - { - CGFloat playbackTime = progress*_audioPlayer.duration; - [_audioPlayer setCurrentTime:playbackTime]; - [self notifyPlaybackTimeChanged]; - } -} - -- (void) skipTrack -{ - [self playNextTrack]; -} - -#pragma mark - Media - -- (CGFloat) currentPlaybackProgress -{ - return _audioPlayer ? (_audioPlayer.currentTime/_audioPlayer.duration) : 0; -} - -- (BOOL) isPlaying -{ - return _audioPlayer.isPlaying; -} - -#pragma mark - Internal Helpers - -- (void) notifyTrackChanged -{ - if (_delegate && [_delegate respondsToSelector:@selector(trackChanged)]) - [_delegate trackChanged]; - - [[NSNotificationCenter defaultCenter] postNotificationName:kTrackChangedNotification object:@{@"trackChanged":@(true)}]; -} - -- (void) playPost:(RYPost *)post -{ - NSURL *localURL = [RYDataManager urlForTempRiff:post.riffHQURL]; - if ([[NSFileManager defaultManager] fileExistsAtPath:localURL.path]) - { - // confirmed that media file exists - _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:localURL error:NULL]; - _audioPlayer.delegate = self; - [_audioPlayer play]; - _currentlyPlayingPost = post; - - if (post.imageURL || post.user.avatarURL.absoluteString.length > 0) - { - NSURL *imageURL = post.imageURL ? post.imageURL : post.user.avatarURL; - __weak RYAudioDeckManager *blockSelf = self; - - [[SDWebImageManager sharedManager] downloadImageWithURL:imageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - blockSelf.nowPlayingArtwork = image; - }]; - } - - [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; - [self notifyTrackChanged]; - [self updateNowPlaying]; - } -} - -- (void) stopPost -{ - if (_audioPlayer) - { - [_audioPlayer stop]; - _audioPlayer = nil; - } - - if (_currentlyPlayingPost) - { - [_recentlyPlayed addObject:_currentlyPlayingPost]; - - _currentlyPlayingPost = nil; - - [self notifyTrackChanged]; - [self updateNowPlaying]; - } -} - -- (void) playNextTrack -{ - if (_riffPlaylist.count > 0) - { - if (((RYPost*)_riffPlaylist[0]).postId == _currentlyPlayingPost.postId) - { - // first track in playlist is also currently playing one -> should remove it - [_riffPlaylist removeObjectAtIndex:0]; - - [self notifyPlaylistChanged]; - } - - [self stopPost]; - - if (_riffPlaylist.count > 0) - { - // more in playlist -> start new track playing - [self playPost:_riffPlaylist[0]]; - } - } - else - [self stopPost]; -} - -- (void) updateNowPlaying -{ - if (_currentlyPlayingPost) - { - NSString *artist = _currentlyPlayingPost.user.nickname.length > 0 ? _currentlyPlayingPost.user.nickname : _currentlyPlayingPost.user.username; - NSMutableDictionary *nowPlaying = [@{MPMediaItemPropertyArtist: artist, - MPMediaItemPropertyAlbumTitle: _currentlyPlayingPost.title} mutableCopy]; - if (_audioPlayer) - { - [nowPlaying setObject:@(_audioPlayer.duration) forKey:MPMediaItemPropertyPlaybackDuration]; - [nowPlaying setObject:@(_audioPlayer.currentTime) forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; - if (_nowPlayingArtwork) - [nowPlaying setObject:[[MPMediaItemArtwork alloc] initWithImage:_nowPlayingArtwork] forKey:MPMediaItemPropertyArtwork]; - } - - [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nowPlaying]; - } -} - -- (void) updatePlaybackProgress:(NSTimer *)timer -{ - if (_audioPlayer && _audioPlayer.isPlaying) - { - [self notifyPlaybackTimeChanged]; - } -} - -#pragma mark - -#pragma mark - Data Control - -- (void) forcePostToTop:(RYPost *)post -{ - [self stopPost]; - _currentlyPlayingPost = post; - - NSInteger idxInPlaylist = [self idxInPlaylistOfPost:post]; - if (idxInPlaylist >= 0) - { - // already downloaded, play - [_riffPlaylist removeObjectAtIndex:idxInPlaylist]; - [_riffPlaylist insertObject:post atIndex:0]; - - [self notifyPlaylistChanged]; - - [self playPost:post]; - } - else if ([self idxOfDownload:post] == -1) - { - // not downloading yet either - [self addPostToPlaylist:post]; - } -} - -- (void) addPostToPlaylist:(RYPost *)post -{ - if (!post) - return; - - // make sure not already in playlist - NSArray *processedPosts = [_riffPlaylist arrayByAddingObjectsFromArray:_downloadQueue]; - for (RYPost *exitingPost in processedPosts) - { - if (post.postId == exitingPost.postId) - return; - } - - // start download - [_downloadQueue addObject:post]; - - [self notifyPlaylistChanged]; - - [[RYDataManager sharedInstance] fetchTempRiff:post.riffHQURL forDelegate:self]; -} - -- (void) movePostFromPlaylistIndex:(NSInteger)playlistIdx toIndex:(NSInteger)newPlaylistIdx -{ - if (newPlaylistIdx < _riffPlaylist.count && playlistIdx < _riffPlaylist.count) - { - RYPost *post = _riffPlaylist[playlistIdx]; - [_riffPlaylist removeObjectAtIndex:playlistIdx]; - [_riffPlaylist insertObject:post atIndex:newPlaylistIdx]; - - if (post.postId == _currentlyPlayingPost.postId || newPlaylistIdx == 0) - [self stopPost]; - - [self notifyPlaylistChanged]; - } -} - -- (void) removePostFromPlaylist:(RYPost *)post -{ - if (post.postId == _currentlyPlayingPost.postId) - [self playNextTrack]; - - // remove from _riffPlaylist if there - for (RYPost *exitingPost in _riffPlaylist) - { - if (post.postId == exitingPost.postId) - { - [_riffPlaylist removeObject:exitingPost]; - [[RYDataManager sharedInstance] deleteLocalRiff:exitingPost.riffHQURL]; - - [self notifyPlaylistChanged]; - - return; - } - } - // remove from _downloadQueue if there - for (RYPost *exitingPost in _downloadQueue) - { - if (post.postId == exitingPost.postId) - { - [_downloadQueue removeObject:exitingPost]; - - [[RYDataManager sharedInstance] cancelDownloadOperationWithURL:post.riffHQURL]; - [self notifyPlaylistChanged]; - - return; - } - } -} - -- (NSInteger) idxOfDownload:(RYPost *)post -{ - NSInteger idx = -1; - for (RYPost *existingPost in _downloadQueue) - { - if (existingPost.postId == post.postId) - { - idx = [_downloadQueue indexOfObject:existingPost]; - break; - } - } - return idx; -} - -- (NSInteger) idxInPlaylistOfPost:(RYPost *)post -{ - NSInteger idx = -1; - for (RYPost *existingPost in _riffPlaylist) - { - if (existingPost.postId == post.postId) - { - idx = [_riffPlaylist indexOfObject:existingPost]; - break; - } - } - return idx; -} - -- (BOOL) playlistContainsPost:(NSInteger)postID -{ - BOOL postInPlaylist = NO; - - NSArray *allPosts = [_riffPlaylist arrayByAddingObjectsFromArray:_downloadQueue]; - for (RYPost *existingPost in allPosts) - { - if (existingPost.postId == postID) - { - postInPlaylist = YES; - break; - } - } - - if (_currentlyPlayingPost.postId == postID) - postInPlaylist = YES; - - return postInPlaylist; -} - -- (BOOL) playlistContainsFile:(NSString *)fileName -{ - BOOL fileInPlaylist = NO; - - NSArray *allPosts = [_riffPlaylist arrayByAddingObjectsFromArray:_downloadQueue]; - for (RYPost *existingPost in allPosts) - { - NSString *riffName = [[existingPost.riffHQURL pathComponents] lastObject]; - if ([riffName isEqualToString:fileName]) - { - fileInPlaylist = YES; - break; - } - } - return fileInPlaylist; -} - -#pragma mark - Recently Played - -- (void) addPostToRecentlyPlayed:(RYPost *)post -{ - if (_recentlyPlayed.count >= kRecentlyPlayedSize) - { - RYPost *oldestPost = _recentlyPlayed[0]; - [self removePostFromPlaylist:oldestPost]; - } - [_recentlyPlayed addObject:post]; -} - -- (void) removePostFromRecentlyPlayed:(RYPost *)post -{ - if ([_recentlyPlayed containsObject:post]) - [_recentlyPlayed removeObject:post]; - - [[RYDataManager sharedInstance] deleteLocalRiff:post.riffHQURL]; -} - -#pragma mark - -#pragma mark - Data - -- (RYPost *)currentlyPlayingPost -{ - return _currentlyPlayingPost; -} - -- (NSArray *)riffPlaylist -{ - return _riffPlaylist; -} - -- (NSArray *)downloadQueue -{ - return _downloadQueue; -} - -#pragma mark - -#pragma mark - TrackDownload Delegate - -- (void) track:(NSURL *)trackURL DownloadProgressed:(CGFloat)progress -{ - for (RYPost *post in _downloadQueue) - { - if (post.riffHQURL == trackURL) - { - if (_delegate && [_delegate respondsToSelector:@selector(post:downloadProgressChanged:)]) - [_delegate post:post downloadProgressChanged:progress]; - - NSDictionary *notifDict = @{@"postID": @(post.postId), @"progress": @(progress)}; - [[NSNotificationCenter defaultCenter] postNotificationName:kDownloadProgressNotification object:notifDict]; - } - } -} - -- (void) track:(NSURL *)trackURL FinishedDownloading:(NSURL *)localURL -{ - for (RYPost *post in _downloadQueue) - { - if (post.riffHQURL == trackURL) - { - [_downloadQueue removeObject:post]; - - if (trackURL == _currentlyPlayingPost.riffHQURL) - { - [self playPost:_currentlyPlayingPost]; - } - else - { - [_riffPlaylist addObject:post]; - - if (!_audioPlayer) - [self playNextTrack]; - } - - [self notifyPlaylistChanged]; - break; - } - } -} - -- (void) track:(NSURL *)trackURL DownloadFailed:(NSString *)reason -{ - for (RYPost *post in _downloadQueue) - { - if (post.riffHQURL == trackURL) - { - [_downloadQueue removeObject:post]; - - [self notifyPlaylistChanged]; - - break; - } - } -} - -#pragma mark - Internal - -- (void) notifyPlaybackTimeChanged -{ - CGFloat progress = _audioPlayer.currentTime / _audioPlayer.duration; - [self updateNowPlaying]; - - if (_delegate && [_delegate respondsToSelector:@selector(post:playbackTimeChanged:progress:)]) - [_delegate post:_currentlyPlayingPost playbackTimeChanged:_audioPlayer.currentTime progress:progress]; - - NSDictionary *postDict = @{@"playbackProgress":@(progress)}; - [[NSNotificationCenter defaultCenter] postNotificationName:kPlaybackChangedNotification object:postDict]; -} - -- (void) notifyPlaylistChanged -{ - if (_delegate && [_delegate respondsToSelector:@selector(riffPlaylistUpdated)]) - [_delegate riffPlaylistUpdated]; - - NSDictionary *postDict = @{@"downloadQueueChanged":@(true)}; - [[NSNotificationCenter defaultCenter] postNotificationName:kPlaylistChangedNotification object:postDict]; -} - -#pragma mark - -#pragma mark - AudioPlayer Delegate - -- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag -{ - [self playNextTrack]; -} - -@end diff --git a/Ryff/AudioDeck/RYAudioDeckViewController.m b/Ryff/AudioDeck/RYAudioDeckViewController.m deleted file mode 100644 index e5479d4..0000000 --- a/Ryff/AudioDeck/RYAudioDeckViewController.m +++ /dev/null @@ -1,431 +0,0 @@ -// -// RYAudioDeckViewController.m -// Ryff -// -// Created by Christopher Laganiere on 8/10/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import "RYAudioDeckViewController.h" - -#import - -#import "Ryff-Swift.h" - -// Data Managers -#import "RYAudioDeckManager.h" -#import "RYStyleSheet.h" - -// Data Objects -#import "RYPost.h" - -// Custom UI -#import "RYAudioDeckTableViewCell.h" - -// Categories -#import "UIImage+Color.h" -#import "UIImage+Thumbnail.h" - -// Associated View Controllers -#import "RYRiffDetailsViewController.h" - -#define kAudioDeckCellReuseID @"audioDeckCell" - -@interface RYAudioDeckViewController () - -@property (weak, nonatomic) IBOutlet UITableView *tableView; -@property (weak, nonatomic) IBOutlet UIView *controlWrapperView; -@property (weak, nonatomic) IBOutlet UIButton *playButton; -@property (weak, nonatomic) IBOutlet UIButton *repostButton; -@property (weak, nonatomic) IBOutlet UIButton *nextButton; -@property (weak, nonatomic) IBOutlet UISlider *volumeSlider; -@property (weak, nonatomic) IBOutlet UILabel *nowPlayingLabel; -@property (weak, nonatomic) IBOutlet UISlider *playbackSlider; - -// Data -@property (nonatomic, assign) BOOL progressSliderTouchActive; - -@end - -@implementation RYAudioDeckViewController - -#pragma mark - -#pragma mark - ViewController Lifecycle - -- (void) viewDidLoad -{ - [super viewDidLoad]; - - [self.view setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; - - [_playButton setTintColor:[RYStyleSheet audioActionColor]]; - [_repostButton setTintColor:[RYStyleSheet audioActionColor]]; - [_nextButton setTintColor:[RYStyleSheet audioActionColor]]; - [_volumeSlider setTintColor:[RYStyleSheet audioActionColor]]; - [_nowPlayingLabel setTextColor:[RYStyleSheet audioActionColor]]; - - [_controlWrapperView setBackgroundColor:[[RYStyleSheet audioBackgroundColor] colorWithAlphaComponent:0.85f]]; - [_controlWrapperView setClipsToBounds:YES]; - [_controlWrapperView.layer setCornerRadius:10.0f]; - - - // long press to move cells - UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)]; - [self.tableView addGestureRecognizer:longPress]; - - // prevent volume hud - MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: _volumeSlider.frame]; - volumeView.autoresizingMask = _volumeSlider.autoresizingMask; - [volumeView setVolumeThumbImage:[[UIImage imageNamed:@"sliderSmall"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; - [volumeView setTintColor:[RYStyleSheet audioActionColor]]; - [volumeView setRouteButtonImage:[[UIImage imageNamed:@"airplayIcon"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; - [_controlWrapperView addSubview: volumeView]; - - [_volumeSlider removeFromSuperview]; - _volumeSlider = nil; -} - -- (void) viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - [[RYAudioDeckManager sharedInstance] setDelegate:self]; - [self styleFromAudioDeck]; - [self.tableView reloadData]; -} - -- (void) styleFromAudioDeck -{ - RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; - - if ([audioManager isPlaying]) - [_playButton setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal]; - else - [_playButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal]; - - if ([audioManager currentlyPlayingPost] || [audioManager riffPlaylist].count > 0) - { - // enable audio buttons - [_playButton setEnabled:YES]; - [_repostButton setEnabled:YES]; - [_nextButton setEnabled:YES]; - [_playbackSlider setUserInteractionEnabled:YES]; - - [_playbackSlider setTintColor:[RYStyleSheet audioActionColor]]; - if ([audioManager isPlaying]) - [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderSeek"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; - else - [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderFull"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; - } - else - { - // disable audio buttons - [_playButton setEnabled:NO]; - [_repostButton setEnabled:NO]; - [_nextButton setEnabled:NO]; - [_playbackSlider setValue:0.0f]; - [_playbackSlider setUserInteractionEnabled:NO]; - [_playbackSlider setTintColor:[RYStyleSheet availableActionColor]]; - [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderSmall"] colorImage:[RYStyleSheet availableActionColor]] forState:UIControlStateNormal]; - } - - if (!_progressSliderTouchActive) - [_playbackSlider setValue:[audioManager currentPlaybackProgress]]; - - [_nowPlayingLabel setText:[audioManager currentlyPlayingPost].title]; -} - -#pragma mark - -#pragma mark - Actions - -- (IBAction)playButtonHit:(id)sender -{ - BOOL shouldPlay = ![[RYAudioDeckManager sharedInstance] isPlaying]; - [[RYAudioDeckManager sharedInstance] playTrack:shouldPlay]; -} - -- (IBAction)repostButtonHit:(id)sender -{ - RYPost *post = [[RYAudioDeckManager sharedInstance] currentlyPlayingPost]; - if (post) - { - RYRiffCreateCollectionViewController *riffCreateVC = [[UIStoryboard storyboardWithName:@"RiffCreate" bundle:NULL] instantiateViewControllerWithIdentifier:@"riffCreate"]; - [self presentViewController:riffCreateVC animated:YES completion:nil]; - } -} - -- (IBAction)nextButtonHit:(id)sender -{ - [[RYAudioDeckManager sharedInstance] skipTrack]; -} - -- (IBAction)playbackSliderTouchStarted:(id)sender -{ - _progressSliderTouchActive = YES; -} - -- (IBAction)playbackSliderTouchUpInside:(id)sender -{ - _progressSliderTouchActive = NO; - [[RYAudioDeckManager sharedInstance] setPlaybackProgress:_playbackSlider.value]; -} - -- (IBAction)playbackSliderTouchUpOutside:(id)sender -{ - _progressSliderTouchActive = NO; -} - -#pragma mark - -#pragma mark - AudioDeck Delegate - -- (void) riffPlaylistUpdated -{ - [self.tableView reloadData]; -} - -- (void) trackChanged -{ - [self styleFromAudioDeck]; -} - -- (void) post:(RYPost *)post playbackTimeChanged:(CGFloat)time progress:(CGFloat)progress -{ - if (!_progressSliderTouchActive) - [_playbackSlider setValue:progress animated:YES]; -} - -#pragma mark - -#pragma mark - TableView Data Source - -- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView -{ - return 1; -} - -- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return [[RYAudioDeckManager sharedInstance] riffPlaylist].count + [[RYAudioDeckManager sharedInstance] downloadQueue].count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - return [_tableView dequeueReusableCellWithIdentifier:kAudioDeckCellReuseID]; -} - -- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return 0.01f; } -- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.01f; } - -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } -- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { return NO; } -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (indexPath.row < [[RYAudioDeckManager sharedInstance] riffPlaylist].count) - return YES; - else - return NO; -} - -- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; } - - -#pragma mark - TableView Delegate - -- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath -{ - RYAudioDeckTableViewCell *audioCell = (RYAudioDeckTableViewCell *)cell; - NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; - RYPost *post; - if (indexPath.row < playlist.count) - { - // riff playlist - post = [playlist objectAtIndex:indexPath.row]; - } - else - { - NSInteger downloadIdx = indexPath.row-playlist.count; - post = [[[RYAudioDeckManager sharedInstance] downloadQueue] objectAtIndex:downloadIdx]; - } - - [audioCell configureForPost:post trackIdx:(indexPath.row+1)]; - - if (indexPath == movingIndexPath) - { - // currently held with long press gesture - [audioCell setHidden:YES]; - } -} - -- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - [[RYAudioDeckManager sharedInstance] playTrack:NO]; - - RYPost *post; - NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; - if (indexPath.row < playlist.count) - { - // riff playlist - post = [playlist objectAtIndex:indexPath.row]; - } - else - { - // riff download - NSInteger downloadIdx = indexPath.row-playlist.count; - post = [[[RYAudioDeckManager sharedInstance] downloadQueue] objectAtIndex:downloadIdx]; - } - - NSString *storyboardName = isIpad ? @"Main" : @"MainIphone"; - RYRiffDetailsViewController *riffDetails = [[UIStoryboard storyboardWithName:storyboardName bundle:NULL] instantiateViewControllerWithIdentifier:@"riffDetails"]; - [riffDetails configureForPost:post]; - riffDetails.shouldPreventNavigation = YES; - [riffDetails addBackButton]; - - UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:riffDetails]; - [self presentViewController:navController animated:YES completion:nil]; -} - -- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath -{ - NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; - if (proposedDestinationIndexPath.row >= playlist.count) - { - // only let users drop active rows onto the playlist, not download queue - proposedDestinationIndexPath = [NSIndexPath indexPathForRow:playlist.count-1 inSection:0]; - } - - return proposedDestinationIndexPath; - -} - -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath -{ - [[RYAudioDeckManager sharedInstance] movePostFromPlaylistIndex:sourceIndexPath.row toIndex:destinationIndexPath.row]; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (editingStyle == UITableViewCellEditingStyleDelete) - { - RYPost *postToDelete; - - NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; - NSArray *downloadQueue = [[RYAudioDeckManager sharedInstance] downloadQueue]; - - if (indexPath.row < playlist.count) - postToDelete = playlist[indexPath.row]; - else if (indexPath.row - playlist.count < downloadQueue.count) - postToDelete = downloadQueue[indexPath.row - playlist.count]; - - [[RYAudioDeckManager sharedInstance] removePostFromPlaylist:postToDelete]; - } -} - -#pragma mark - -#pragma mark - Long Press Reorder - -static UIView *snapshot; // A snapshot of the row user is moving. -static NSIndexPath *sourceIndexPath; // Initial index path, where gesture begins. -static NSIndexPath *movingIndexPath; // current moving index path -- (void)longPressGesture:(UILongPressGestureRecognizer *)longPress -{ - CGPoint location = [longPress locationInView:self.tableView]; - movingIndexPath = [self.tableView indexPathForRowAtPoint:location]; - location = [self.view convertPoint:location fromView:self.tableView]; - - NSInteger playlistCount = [[RYAudioDeckManager sharedInstance] riffPlaylist].count; - - switch (longPress.state) - { - case UIGestureRecognizerStateBegan: - { - if (movingIndexPath) - { - sourceIndexPath = movingIndexPath; - - if (sourceIndexPath.row < playlistCount) - { - // playlist cell, allow moving in playlist - UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:movingIndexPath]; - - // Take a snapshot of the selected row using helper method. - snapshot = [self customSnapshotFromView:cell]; - - // Add the snapshot as subview, centered at cell's center... - __block CGPoint center = [self.view convertPoint:cell.center fromView:self.tableView]; - snapshot.center = center; - snapshot.alpha = 0.0; - [self.view insertSubview:snapshot aboveSubview:_tableView]; - [UIView animateWithDuration:0.25 animations:^{ - - // Offset for gesture location. - center.y = location.y; - snapshot.center = center; - snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05); - snapshot.alpha = 0.98; - cell.alpha = 0.0; - - } completion:^(BOOL finished) { - cell.hidden = YES; - }]; - } - } - break; - } - case UIGestureRecognizerStateChanged: - { - CGPoint center = snapshot.center; - center.y = location.y; - snapshot.center = center; - - if (movingIndexPath && ![movingIndexPath isEqual:sourceIndexPath] && movingIndexPath.row < playlistCount) - { - // destination valid, different from source, and in playlist - [[RYAudioDeckManager sharedInstance] movePostFromPlaylistIndex:sourceIndexPath.row toIndex:movingIndexPath.row]; - - [self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:movingIndexPath]; - sourceIndexPath = movingIndexPath; - } - break; - } - default: - { - // Clean up. - UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:sourceIndexPath]; - cell.hidden = NO; - cell.alpha = 0.0; - - [UIView animateWithDuration:0.25 animations:^{ - snapshot.center = [self.view convertPoint:cell.center fromView:self.tableView]; - snapshot.transform = CGAffineTransformIdentity; - snapshot.alpha = 0.0; - cell.alpha = 1.0; - } completion:^(BOOL finished) { - sourceIndexPath = nil; - [snapshot removeFromSuperview]; - snapshot = nil; - movingIndexPath = nil; - }]; - break; - } - } -} - -#pragma mark - Helper methods - -/** - Returns a customized snapshot of a given view. - */ -- (UIView *)customSnapshotFromView:(UIView *)inputView -{ - UIView *snapshot = [inputView snapshotViewAfterScreenUpdates:YES]; - snapshot.layer.masksToBounds = NO; - snapshot.layer.cornerRadius = 0.0; - snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0); - snapshot.layer.shadowRadius = 5.0; - snapshot.layer.shadowOpacity = 0.4; - - return snapshot; -} - -@end diff --git a/Ryff/Categories/KRLCollectionViewGridLayout+Ryff.swift b/Ryff/Categories/KRLCollectionViewGridLayout+Ryff.swift new file mode 100644 index 0000000..621df0e --- /dev/null +++ b/Ryff/Categories/KRLCollectionViewGridLayout+Ryff.swift @@ -0,0 +1,30 @@ +// +// KRLCollectionViewGridLayout+Ryff.swift +// Ryff +// +// Created by Chris Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation +import KRLCollectionViewGridLayout + +extension KRLCollectionViewGridLayout { + + func style(traitEnvironment: UITraitEnvironment) { + var spacing: CGFloat + if (traitEnvironment.traitCollection.horizontalSizeClass == .Compact) { + numberOfItemsPerLine = 2 + spacing = Constants.Mixer.PadSpacingCompact + } + else { + numberOfItemsPerLine = 4 + spacing = Constants.Mixer.PadSpacingRegular + } + sectionInset = UIEdgeInsetsMake(spacing, spacing, spacing, spacing) + interitemSpacing = spacing + lineSpacing = spacing + aspectRatio = 1.0 + } + +} diff --git a/Ryff/Categories/NSDictionary+Safety.h b/Ryff/Categories/NSDictionary+Safety.h new file mode 100644 index 0000000..739d661 --- /dev/null +++ b/Ryff/Categories/NSDictionary+Safety.h @@ -0,0 +1,15 @@ +// +// NSDictionary+Safety.h +// Ryff +// +// Created by Christopher Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import + +@interface NSDictionary (Safety) + +- (id)safeObjectForKey:(id )aKey; + +@end diff --git a/Ryff/Categories/NSDictionary+Safety.m b/Ryff/Categories/NSDictionary+Safety.m new file mode 100644 index 0000000..bed968f --- /dev/null +++ b/Ryff/Categories/NSDictionary+Safety.m @@ -0,0 +1,20 @@ +// +// NSDictionary+Safety.m +// Ryff +// +// Created by Christopher Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "NSDictionary+Safety.h" + +@implementation NSDictionary (Safety) + +- (id)safeObjectForKey:(id )aKey { + if (aKey && [self objectForKey:aKey] != [NSNull null]) { + return [self objectForKey:aKey]; + } + return nil; +} + +@end diff --git a/Ryff/Categories/NSMutableDictionary+Safety.h b/Ryff/Categories/NSMutableDictionary+Safety.h new file mode 100644 index 0000000..8a91aa1 --- /dev/null +++ b/Ryff/Categories/NSMutableDictionary+Safety.h @@ -0,0 +1,15 @@ +// +// NSMutableDictionary+Safety.h +// Ryff +// +// Created by Christopher Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import + +@interface NSMutableDictionary (Safety) + +- (void)safelySetObject:(id)anObject forKey:(id )aKey; + +@end diff --git a/Ryff/Categories/NSMutableDictionary+Safety.m b/Ryff/Categories/NSMutableDictionary+Safety.m new file mode 100644 index 0000000..f71c7f1 --- /dev/null +++ b/Ryff/Categories/NSMutableDictionary+Safety.m @@ -0,0 +1,19 @@ +// +// NSMutableDictionary+Safety.m +// Ryff +// +// Created by Christopher Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "NSMutableDictionary+Safety.h" + +@implementation NSMutableDictionary (Safety) + +- (void)safelySetObject:(id)anObject forKey:(id )aKey { + if (anObject && aKey) { + [self setObject:anObject forKey:aKey]; + } +} + +@end diff --git a/Ryff/Style/UIColor+Hex.h b/Ryff/Categories/UIColor+Hex.h similarity index 100% rename from Ryff/Style/UIColor+Hex.h rename to Ryff/Categories/UIColor+Hex.h diff --git a/Ryff/Style/UIColor+Hex.m b/Ryff/Categories/UIColor+Hex.m similarity index 100% rename from Ryff/Style/UIColor+Hex.m rename to Ryff/Categories/UIColor+Hex.m diff --git a/Ryff/Categories/UIImage+Color.m b/Ryff/Categories/UIImage+Color.m index 2dc028a..157bd8a 100644 --- a/Ryff/Categories/UIImage+Color.m +++ b/Ryff/Categories/UIImage+Color.m @@ -14,15 +14,10 @@ - (UIImage *)colorImage:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); - if (UIGraphicsBeginImageContextWithOptions) { - CGFloat imageScale = 1.0f; - if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. - imageScale = self.scale; - UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); - } - else { - UIGraphicsBeginImageContext(self.size); - } + CGFloat imageScale = 1.0f; + if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. + imageScale = self.scale; + UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); [self drawInRect:rect]; diff --git a/Ryff/Categories/UIImage+Size.h b/Ryff/Categories/UIImage+Size.h new file mode 100644 index 0000000..0a70a08 --- /dev/null +++ b/Ryff/Categories/UIImage+Size.h @@ -0,0 +1,15 @@ +// +// UIImage+Size.h +// Ryff +// +// Created by Chris Laganiere on 9/5/2015 +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import + +@interface UIImage (Size) + +-(UIImage *) imageWithSize:(CGSize)size; + +@end diff --git a/Ryff/Categories/UIImage+Thumbnail.m b/Ryff/Categories/UIImage+Size.m similarity index 77% rename from Ryff/Categories/UIImage+Thumbnail.m rename to Ryff/Categories/UIImage+Size.m index e5d3cb9..c812a0a 100644 --- a/Ryff/Categories/UIImage+Thumbnail.m +++ b/Ryff/Categories/UIImage+Size.m @@ -1,16 +1,16 @@ // -// UIImage+Thumbnail.m -// BirthdayReminder +// UIImage+Size.m +// Ryff // -// Created by Nick Kuh on 26/07/2012. -// Copyright (c) 2012 Nick Kuh. All rights reserved. +// Created by Chris Laganiere on 9/5/2015 +// Copyright (c) 2015 Chris Laganiere. All rights reserved. // -#import "UIImage+Thumbnail.h" +#import "UIImage+Size.h" -@implementation UIImage (Thumbnail) +@implementation UIImage (Size) --(UIImage *) thumbnailOfSize:(CGSize)size +-(UIImage *) imageWithSize:(CGSize)size { CGSize mainImageSize = self.size; @@ -23,7 +23,7 @@ -(UIImage *) thumbnailOfSize:(CGSize)size CGFloat scaleFactor; // Determine if we should shrink based on width or hight - if(widthScaler > heightScaler) + if(widthScaler < heightScaler) { // calculate based on width scaler scaleFactor = widthScaler; @@ -35,7 +35,7 @@ -(UIImage *) thumbnailOfSize:(CGSize)size repositionedMainImageSize.width = ceil(size.width / heightScaler); } - UIGraphicsBeginImageContext(size); + UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); CGFloat xInc = ((repositionedMainImageSize.width-mainImageSize.width) / 2.f) *scaleFactor; CGFloat yInc = ((repositionedMainImageSize.height-mainImageSize.height) / 2.f) *scaleFactor; diff --git a/Ryff/Categories/UIImage+Thumbnail.h b/Ryff/Categories/UIImage+Thumbnail.h deleted file mode 100644 index 22801bd..0000000 --- a/Ryff/Categories/UIImage+Thumbnail.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// UIImage+Thumbnail.h -// BirthdayReminder -// -// Created by Nick Kuh on 26/07/2012. -// Copyright (c) 2012 Nick Kuh. All rights reserved. -// - -#import - -@interface UIImage (Thumbnail) - --(UIImage *) thumbnailOfSize:(CGSize)size; - -@end diff --git a/Ryff/Categories/UIKit+BNRDynamicTypeManager.swift b/Ryff/Categories/UIKit+BNRDynamicTypeManager.swift new file mode 100644 index 0000000..6f75392 --- /dev/null +++ b/Ryff/Categories/UIKit+BNRDynamicTypeManager.swift @@ -0,0 +1,50 @@ +// +// UIKit+BNRDynamicTypeManager.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +public struct TextStyle { + static let Headline = UIFontTextStyleHeadline + static let Body = UIFontTextStyleBody + static let Subheadline = UIFontTextStyleSubheadline + static let Footnote = UIFontTextStyleFootnote + static let caption1 = UIFontTextStyleCaption1 + static let caption2 = UIFontTextStyleCaption2 +} + +extension UILabel { + + func setDynamicStyle(textStyle: String, fontStyle: FontStyle) { + BNRDynamicTypeManager.sharedInstance().watchLabel(self, textStyle: textStyle, fontStyle: fontStyle) + } + +} + +extension UITextView { + + func setDynamicStyle(textStyle: String, fontStyle: FontStyle) { + BNRDynamicTypeManager.sharedInstance().watchTextView(self, textStyle: textStyle, fontStyle: fontStyle) + } + +} + +extension UITextField { + + func setDynamicStyle(textStyle: String, fontStyle: FontStyle) { + BNRDynamicTypeManager.sharedInstance().watchTextField(self, textStyle: textStyle, fontStyle: fontStyle) + } + +} + +extension UIButton { + + func setDynamicStyle(textStyle: String, fontStyle: FontStyle) { + BNRDynamicTypeManager.sharedInstance().watchButton(self, textStyle: textStyle, fontStyle: fontStyle) + } + +} diff --git a/Ryff/Categories/UILayoutPriority.swift b/Ryff/Categories/UILayoutPriority.swift new file mode 100644 index 0000000..6b083c2 --- /dev/null +++ b/Ryff/Categories/UILayoutPriority.swift @@ -0,0 +1,15 @@ +// +// ContentHuggingPriority.swift +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +extension UILayoutPriority { + static var Low: Float { return 250.0 } + static var High: Float { return 750.0 } + static var Required: Float { return 1000.0 } +} diff --git a/Ryff/Categories/UIViewController+Extras.m b/Ryff/Categories/UIViewController+Extras.m index 079308e..8d10314 100644 --- a/Ryff/Categories/UIViewController+Extras.m +++ b/Ryff/Categories/UIViewController+Extras.m @@ -14,28 +14,27 @@ #import "MBProgressHUD.h" // Categories -#import "UIImage+Thumbnail.h" +#import "UIImage+Size.h" #define kHudTag 1912984 +static const CGSize BarButtonItemSize = {30, 30}; + @implementation UIViewController (Extras) #pragma mark - #pragma mark - Navigation -- (void) addNewPostButtonToNavBar -{ - if (self.navigationItem) - { - UIBarButtonItem *newPostButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"create"] style:UIBarButtonItemStylePlain target:self action:@selector(newPost:)]; +- (void) addNewPostButtonToNavBar { + if (self.navigationItem) { + UIBarButtonItem *newPostButton = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"create"] imageWithSize:BarButtonItemSize] style:UIBarButtonItemStylePlain target:self action:@selector(newPost:)]; [self.navigationItem setRightBarButtonItem:newPostButton]; } } -- (void) newPost:(id)sender -{ - RYRiffCreateCollectionViewController *riffCreateVC = [[UIStoryboard storyboardWithName:@"RiffCreate" bundle:NULL] instantiateViewControllerWithIdentifier:@"riffCreate"]; - [self presentViewController:riffCreateVC animated:YES completion:nil]; +- (void)newPost:(id)sender { + RYRiffMixerViewController *riffMixer = [[RYRiffMixerViewController alloc] initWithNibName:nil bundle:nil]; + [self presentViewController:riffMixer animated:YES completion:nil]; } #pragma mark - diff --git a/Ryff/Categories/UIViewController+RYSocialTransitions.m b/Ryff/Categories/UIViewController+RYSocialTransitions.m index 2be575f..c00d83f 100644 --- a/Ryff/Categories/UIViewController+RYSocialTransitions.m +++ b/Ryff/Categories/UIViewController+RYSocialTransitions.m @@ -25,7 +25,7 @@ - (void) pushUserProfileForUser:(RYUser *)user { NSString *storyboardName = isIpad ? @"Main" : @"MainIphone"; RYProfileViewController *profileVC = [[UIStoryboard storyboardWithName:storyboardName bundle:NULL] instantiateViewControllerWithIdentifier:@"profileVC"]; - [profileVC configureForUser:user]; +// [profileVC configureForUser:user]; [self.navigationController pushViewController:profileVC animated:YES]; } @@ -33,7 +33,7 @@ - (void) pushUserProfileForUsername:(NSString *)username { NSString *storyboardName = isIpad ? @"Main" : @"MainIphone"; RYProfileViewController *profileVC = [[UIStoryboard storyboardWithName:storyboardName bundle:NULL] instantiateViewControllerWithIdentifier:@"profileVC"]; - [profileVC configureForUsername:username]; +// [profileVC configureForUsername:username]; [self.navigationController pushViewController:profileVC animated:YES]; } diff --git a/Ryff/Categories/UIViewController+Transitions.swift b/Ryff/Categories/UIViewController+Transitions.swift new file mode 100644 index 0000000..c969d69 --- /dev/null +++ b/Ryff/Categories/UIViewController+Transitions.swift @@ -0,0 +1,28 @@ +// +// UIViewController+Transitions.swift +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +/** +Adds functionality to UIViewController for pushing common Ryff view controller. +*/ + +extension UIViewController { + + func pushProfileViewController(user: RYUser) { + let dataSource = RYUserFeedDataSource.postsDataSourceWithUser(user) + let profileViewController = RYProfileViewController(dataSource: dataSource) + navigationController?.pushViewController(profileViewController, animated: true) + } + + func pushPostDetailsViewController(post: RYPost) { + let detailsViewController = RYPostDetailsViewController(post: post) + navigationController?.pushViewController(detailsViewController, animated: true) + } + +} diff --git a/Ryff/Classes/RYAddToPlaylistView.swift b/Ryff/Classes/RYAddToPlaylistView.swift new file mode 100644 index 0000000..524dc48 --- /dev/null +++ b/Ryff/Classes/RYAddToPlaylistView.swift @@ -0,0 +1,51 @@ +// +// RYAddToPlaylistView.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYAddToPlaylistView: UIView { + + private let imageView = UIImageView(frame: CGRectZero) + private let label = UILabel(frame: CGRectZero) + + override init(frame: CGRect) { + super.init(frame: frame) + + imageView.image = UIImage(named: "plus") + imageView.tintColor = RYStyleSheet.postActionColor() + imageView.contentMode = .ScaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(imageView) + + label.text = "Add to Playlist" + label.textColor = RYStyleSheet.postActionColor() + label.textAlignment = .Right + label.setDynamicStyle(TextStyle.Body, fontStyle: .Regular) + label.translatesAutoresizingMaskIntoConstraints = false + addSubview(label) + + NSLayoutConstraint.activateConstraints(subviewContraints()) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func subviewContraints() -> [NSLayoutConstraint] { + let views = ["image": imageView, "text": label] + let metrics = ["padding": Constants.Post.AudioActionPadding, "relatedPadding": Constants.Global.RelatedElementPadding, "actionDimension": Constants.Post.AudioActionHeightSmall] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[text]-(relatedPadding)-[image(actionDimension)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[image(actionDimension)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + constraints += [NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: imageView, attribute: .CenterY, multiplier: 1.0, constant: 0.0)] + return constraints + } + +} diff --git a/Ryff/Classes/RYAudioDeck.swift b/Ryff/Classes/RYAudioDeck.swift new file mode 100644 index 0000000..7d8234d --- /dev/null +++ b/Ryff/Classes/RYAudioDeck.swift @@ -0,0 +1,279 @@ +// +// RYAudioDeck.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation +import AVFoundation +import MediaPlayer +import SDWebImage + + /// Protocol to be implemented by an object receiving updates from RYAudioDeck. +protocol RYAudioDeckDelegate: class { + + /** + Current playing status of the Audio Deck changed. + The currently playing post is implied to be the same, but the deck's play/pause/progress status changed. + */ + func playbackStatusChanged() + + /** + The currently playing post changed. + */ + func currentlyPlayingChanged() + + /** + The current playlist changed. Either the songs in the current playlist have been reordered, or + a new playlist has taken its place. + */ + func playlistChanged() +} + +class RYAudioDeck: NSObject, RYAudioDeckPlaylistDelegate, AVAudioPlayerDelegate { + + static let NotificationPlaylistChanged = "AudioDeckPlaylistChanged" + static let NotificationCurrentlyPlayingChanged = "AudioDeckCurrentlyPlayingChanged" + let PlaybackProgressUpdateTimeInterval: NSTimeInterval = 0.1 + + static let sharedAudioDeck = RYAudioDeck() + + @objc(isPlaying) + var playing: Bool { + get { + return audioPlayer?.playing ?? false + } + } + var playbackProgress: CGFloat { + get { + if let player = audioPlayer { + return CGFloat(player.currentTime) / CGFloat(max(1,player.duration)) + } + return 0.0 + } + set { + if let player = audioPlayer { + player.currentTime = NSTimeInterval(playbackProgress*CGFloat(player.duration)) + playbackStatusChanged() + } + } + } + + let defaultPlaylist = RYAudioDeckPlaylist() + private(set) var currentPlaylist: RYAudioDeckPlaylist? { + didSet { + delegate?.playlistChanged() + NSNotificationCenter.defaultCenter().postNotificationName(RYAudioDeck.NotificationPlaylistChanged, object: nil) + } + } + private(set) var currentlyPlaying: RYPost? { + didSet { + updateNowPlayingInfo(true) + delegate?.currentlyPlayingChanged() + // Post notification so UI can adjust if needed. + NSNotificationCenter.defaultCenter().postNotificationName(RYAudioDeck.NotificationCurrentlyPlayingChanged, object: nil) + } + } + + weak var delegate: RYAudioDeckDelegate? + private var audioPlayer: AVAudioPlayer? + private var progressTimer: NSTimer? + private var nowPlayingImage: UIImage? + private var nowPlayingDict: [String: AnyObject] = [:] + + override init() { + super.init() + defaultPlaylist.playlistDelegate = self + currentPlaylist = defaultPlaylist + + // Set up timer to update now playing information and notify UI regularly. + let progressTimer = NSTimer.scheduledTimerWithTimeInterval(PlaybackProgressUpdateTimeInterval, target: self, selector: Selector("updateProgress:"), userInfo: nil, repeats: true) + // Add timer to current run loop to make sure UI updates even if a user touch is active. + NSRunLoop.currentRunLoop().addTimer(progressTimer, forMode: NSRunLoopCommonModes) + self.progressTimer = progressTimer + + // Set up AVAudioSession + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setCategory(AVAudioSessionCategoryPlayback) + try audioSession.setActive(true) + } + catch let error as NSError { + print(error.localizedDescription) + } + } + + // MARK: Public + + func play() { + if let player = audioPlayer { + if !player.playing { + player.play() + playbackStatusChanged() + } + } + else { + playNextTrack() + } + } + + func pause() { + if let player = audioPlayer where player.playing { + player.pause() + playbackStatusChanged() + } + } + + func skip() { + playNextTrack() + } + + // MARK: RYAudioDeckPlaylistDelegate + + func playlistChanged() { + // Play next post if added. + if currentlyPlaying == nil { + // play next song + playNextTrack() + } + // Or else if the currently playing isn't at the top of the playlist anymore, go to the next one. + if let currentlyPlaying = currentlyPlaying, firstInPlaylist = currentPlaylist?.readyPosts.first where currentlyPlaying != firstInPlaylist { + stop() + playNextTrack() + } + + delegate?.playlistChanged() + + // Post notification so UI can update if needed. + NSNotificationCenter.defaultCenter().postNotificationName(RYAudioDeck.NotificationPlaylistChanged, object: nil) + delegate?.playlistChanged() + } + + // MARK: AVAudioPlayerDelegate + + func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { + playNextTrack() + } + + // MARK: Private + + /** + Stop the currently playing post if relevant and start playing the next post if possible. + */ + private func playNextTrack() { + if let _ = currentlyPlaying { + stop() + } + + if let nextPost = currentPlaylist?.readyPosts.first { + playPost(nextPost) + } + } + + /** + Set up a post to play. Once playPost() is called to set up Audio Deck for this post, use pause() and play() to + adjust playback, and stop() to finish it. + + :param: post RYPost to play. + */ + private func playPost(post: RYPost) { + if let _ = audioPlayer { + return + } + + let localURL = RYDataManager.urlForTempRiff(post.riffHQURL) + if let localPath = localURL.path where NSFileManager.defaultManager().fileExistsAtPath(localPath) { + do { + try audioPlayer = AVAudioPlayer(contentsOfURL: localURL) + } + catch let error as NSError { + print(error.localizedDescription) + return + } + audioPlayer?.delegate = self + audioPlayer?.play() + currentlyPlaying = post + UIApplication.sharedApplication().beginReceivingRemoteControlEvents() + updateNowPlayingInfo(true) + playbackStatusChanged() + + // Start downloading image data for this post and update now playing when it finishes downloading + if (post.imageURL != nil || post.user.avatarURL != nil) { + let imageURL = post.imageURL ?? post.user.avatarURL + weak var weakself = self + SDWebImageManager.sharedManager().downloadImageWithURL(imageURL, options: [], progress: nil, completed: { (image, error, cacheType, finished, imageURL) -> Void in + if let error = error { + print("Couldn't download image for post: \(error.localizedDescription)") + } + else { + weakself?.nowPlayingImage = image + weakself?.updateNowPlayingInfo(true) + } + }) + } + } + } + + /** + Stop the currently playing post and clear meta data. + Cleans up after playPost(). Should be called after each track is finished playing. + */ + private func stop() { + if let player = audioPlayer { + player.stop() + audioPlayer = nil + } + if let currentlyPlaying = currentlyPlaying { + if let firstInPlaylist = currentPlaylist?.readyPosts.first where currentlyPlaying == firstInPlaylist { + currentPlaylist?.removePost(firstInPlaylist) + } + + self.currentlyPlaying = nil + playbackStatusChanged() + } + + } + + /** + Called whenever playback status changes at all - even every second as playback time progresses. + */ + private func playbackStatusChanged() { + updateNowPlayingInfo(false) + NSNotificationCenter.defaultCenter().postNotificationName(RYAudioDeck.NotificationCurrentlyPlayingChanged, object: nil) + delegate?.playbackStatusChanged() + } + + /** + Update the system now playing information (MPMediaItemProperty) with self.currentlyPlaying. + + :param: updateTrackInfo Should update artist, image, and track name in addition to the playback status. + */ + private func updateNowPlayingInfo(updateTrackInfo: Bool) { + if let currentlyPlaying = currentlyPlaying { + if (updateTrackInfo) { + nowPlayingDict[MPMediaItemPropertyArtist] = currentlyPlaying.user.username + nowPlayingDict[MPMediaItemPropertyTitle] = currentlyPlaying.title + if let nowPlayingImage = nowPlayingImage { + nowPlayingDict[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: nowPlayingImage) + } + } + + if let audioPlayer = audioPlayer { + nowPlayingDict[MPMediaItemPropertyPlaybackDuration] = audioPlayer.duration + nowPlayingDict[MPNowPlayingInfoPropertyElapsedPlaybackTime] = audioPlayer.currentTime + } + MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = nowPlayingDict + } + } + + // MARK: Timer + + func updateProgress(timer: NSTimer) { + if let player = audioPlayer where player.playing { + playbackStatusChanged() + } + } + +} diff --git a/Ryff/Classes/RYAudioDeckConsoleView.swift b/Ryff/Classes/RYAudioDeckConsoleView.swift new file mode 100644 index 0000000..9e3b5d6 --- /dev/null +++ b/Ryff/Classes/RYAudioDeckConsoleView.swift @@ -0,0 +1,30 @@ +// +// RYAudioDeckConsoleView.swift +// Ryff +// +// Created by Christopher Laganiere on 9/11/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +class RYAudioDeckConsoleView: UIView { + + override init(frame: CGRect) { + super.init(frame: frame) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func updateNowPlaying() { + + } + + func updatePlayback() { + + } + +} diff --git a/Ryff/Classes/RYAudioDeckPlaylist.swift b/Ryff/Classes/RYAudioDeckPlaylist.swift new file mode 100644 index 0000000..b3b7100 --- /dev/null +++ b/Ryff/Classes/RYAudioDeckPlaylist.swift @@ -0,0 +1,156 @@ +// +// RYAudioDeckPlaylist.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +protocol RYAudioDeckPlaylistDelegate: class { + func playlistChanged() +} + +@objc class RYAudioDeckPlaylist: NSObject, TrackDownloadDelegate { + + static let PlaylistDownloadProgressNotification = "AudioDeckPlaylistDownloadProgressChanged" + + weak var playlistDelegate: RYAudioDeckPlaylistDelegate? + + private(set) var readyPosts: [RYPost] = [] + private(set) var downloadQueue: [RYPost] = [] + + // MARK: Mutating + + /** + Add a post to the playlist, downloading it if necessary. + + :param: post `RYPost` to add to a playlist. + */ + func addPost(post: RYPost) { + if !hasPost(post) { + downloadQueue.append(post) + RYDataManager.sharedInstance().fetchTempRiff(post.riffHQURL, forDelegate: self) + notifyPlaylistChanged() + } + } + + /** + Removes a post from the playlist. + + :param: post `RYPost` to remove from the playlist or download queue. + */ + func removePost(post: RYPost) { + // Attempt to remove from downloaded posts. + for postIndex in 0.. 0 && fromIndex < readyPosts.count) && (toIndex > 0 && toIndex < readyPosts.count) { + // valid indexes + let post = readyPosts.removeAtIndex(fromIndex) + readyPosts.insert(post, atIndex: toIndex) + + notifyPlaylistChanged() + } + } + + // MARK: Helpers + + /** + Provides a local url for the audio file associated with a post by translating + remote urls into local urls. + + :param: post `RYPost` to retrieve a url for. + + :returns: Local NSURL for the location of an already-downloaded audio file. + */ + func urlForPost(post: RYPost) -> NSURL { + return RYDataManager.urlForTempRiff(post.riffHQURL) + } + + /** + Specifies whether the playlist contains the provided post, either in the ready-to-play posts + or download queue. + + :param: post `RYPost` to look for. + + :returns: Bool for whether the playlist contains the post. + */ + func hasPost(post: RYPost) -> Bool { + for readyPost in readyPosts { + if readyPost == post { + return true + } + } + for download in downloadQueue { + if download == post { + return true + } + } + return false + } + + private func notifyPlaylistChanged() { + playlistDelegate?.playlistChanged() + } + + // MARK: TrackDownloadDelegate + + func track(trackURL: NSURL!, downloadProgressed progress: CGFloat) { + for download in downloadQueue { + if download.riffHQURL == trackURL { + // TODO: notify delegate of download progress + } + } + } + + func track(trackURL: NSURL!, finishedDownloading localURL: NSURL!) { + for downloadIndex in 0.. +@interface RYAudioDeckTableViewCellOLD () @property (weak, nonatomic) IBOutlet UIView *statusWrapperView; @property (weak, nonatomic) IBOutlet RYPlayControl *playControl; @@ -34,7 +33,7 @@ @interface RYAudioDeckTableViewCell () @end -@implementation RYAudioDeckTableViewCell +@implementation RYAudioDeckTableViewCellOLD #pragma mark - #pragma mark - Preparation @@ -53,17 +52,17 @@ - (void) awakeFromNib [_riffTitleLabel setFont:[UIFont fontWithName:kRegularFont size:18.0f]]; [_durationLabel setFont:[UIFont fontWithName:kRegularFont size:18.0f]]; - [_playControl configureWithFrame:_playControl.frame centerImageInset:nil]; +// [_playControl configureWithFrame:_playControl.frame centerImageInset:nil]; [_playControl setControlTintColor:[UIColor whiteColor]]; UITapGestureRecognizer *playControlGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playControlHit:)]; [_statusWrapperView addGestureRecognizer:playControlGesture]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckPlaybackChanged:) name:kPlaybackChangedNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDownloadProgress:) name:kDownloadProgressNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckTrackChanged:) name:kTrackChangedNotification object:nil]; +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckPlaybackChanged:) name:kPlaybackChangedNotification object:nil]; +// +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDownloadProgress:) name:kDownloadProgressNotification object:nil]; +// +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckTrackChanged:) name:kTrackChangedNotification object:nil]; } #pragma mark - @@ -71,11 +70,11 @@ - (void) awakeFromNib - (void) playControlHit:(UITapGestureRecognizer *)tapGesture { - RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; - if (_post.postId == [audioManager currentlyPlayingPost].postId) - [audioManager playTrack:![audioManager isPlaying]]; - else - [audioManager forcePostToTop:_post]; +// RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; +// if (_post.postId == [audioManager currentlyPlayingPost].postId) +// [audioManager playTrack:![audioManager isPlaying]]; +// else +// [audioManager forcePostToTop:_post]; } #pragma mark - @@ -98,49 +97,49 @@ - (void) configureForPost:(RYPost *)post trackIdx:(NSInteger)trackIdx - (void) styleFromAudioDeck { - RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; - if ([audioManager idxOfDownload:_post] >= 0) - { - // currently downloading - [self styleDownloading:YES]; - [_playControl setCenterImage:nil]; - - if ([audioManager idxOfDownload:_post] != 0) - [_playControl setProgress:0.0f animated:NO]; - } - else if (_post.postId == [audioManager currentlyPlayingPost].postId) - { - // currently playing - [self hidePlaylistIndex:YES]; - [self styleDownloading:NO]; - [self styleFromPlaybackProgress]; - - if ([audioManager isPlaying]) - [_playControl setCenterImage:[UIImage imageNamed:@"playing"]]; - else - [_playControl setCenterImage:[UIImage imageNamed:@"play"]]; - [_playControl setProgress:0.0f animated:NO]; - } - else if (_trackIdx > 0) - { - // just in playlist - [self hidePlaylistIndex:NO]; - [self styleDownloading:NO]; - [_trackIndexLabel setText:[NSString stringWithFormat:@"%ld",(long)_trackIdx]]; - [_playControl setCenterImage:nil]; - [_playControl setProgress:0.0f animated:NO]; - } +// RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; +// if ([audioManager idxOfDownload:_post] >= 0) +// { +// // currently downloading +// [self styleDownloading:YES]; +// [_playControl setCenterImage:nil]; +// +// if ([audioManager idxOfDownload:_post] != 0) +// [_playControl setProgress:0.0f animated:NO]; +// } +// else if (_post.postId == [audioManager currentlyPlayingPost].postId) +// { +// // currently playing +// [self hidePlaylistIndex:YES]; +// [self styleDownloading:NO]; +// [self styleFromPlaybackProgress]; +// +// if ([audioManager isPlaying]) +// [_playControl setCenterImage:[UIImage imageNamed:@"playing"]]; +// else +// [_playControl setCenterImage:[UIImage imageNamed:@"play"]]; +// [_playControl setProgress:0.0f animated:NO]; +// } +// else if (_trackIdx > 0) +// { +// // just in playlist +// [self hidePlaylistIndex:NO]; +// [self styleDownloading:NO]; +// [_trackIndexLabel setText:[NSString stringWithFormat:@"%ld",(long)_trackIdx]]; +// [_playControl setCenterImage:nil]; +// [_playControl setProgress:0.0f animated:NO]; +// } } - (void) styleFromPlaybackProgress { - if (_post.postId == [[RYAudioDeckManager sharedInstance] currentlyPlayingPost].postId) - { - CGFloat percentRemaining = (1.0f - [[RYAudioDeckManager sharedInstance] currentPlaybackProgress]); - CGFloat playbackRemaining = percentRemaining*_post.duration; - [_durationLabel setText:[RYStyleSheet convertSecondsToDisplayTime:playbackRemaining]]; - } - +// if (_post.postId == [[RYAudioDeckManager sharedInstance] currentlyPlayingPost].postId) +// { +// CGFloat percentRemaining = (1.0f - [[RYAudioDeckManager sharedInstance] currentPlaybackProgress]); +// CGFloat playbackRemaining = percentRemaining*_post.duration; +// [_durationLabel setText:[RYStyleSheet convertSecondsToDisplayTime:playbackRemaining]]; +// } +// } - (void) hidePlaylistIndex:(BOOL)hidePlaylistIndex diff --git a/Ryff/Classes/RYAudioDeckTableViewCell.swift b/Ryff/Classes/RYAudioDeckTableViewCell.swift new file mode 100644 index 0000000..f547954 --- /dev/null +++ b/Ryff/Classes/RYAudioDeckTableViewCell.swift @@ -0,0 +1,83 @@ +// +// RYAudioDeckTableViewCell.swift +// Ryff +// +// Created by Christopher Laganiere on 9/11/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +class RYAudioDeckTableViewCell: UITableViewCell { + + static let preferredHeight: CGFloat = 50 + private let playControlDimension: CGFloat = 34 + + private let playControl: RYPlayControl + private let titleLabel = UILabel(frame: CGRectZero) + + private var post: RYPost? + + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + playControl = RYPlayControl(frame: CGRectMake(0, 0, playControlDimension, playControlDimension)) + super.init(style: style, reuseIdentifier: reuseIdentifier) + + playControl.translatesAutoresizingMaskIntoConstraints = false + addSubview(playControl) + + titleLabel.translatesAutoresizingMaskIntoConstraints = false + addSubview(titleLabel) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func styleWithReadyPost(post: RYPost) { + self.post = post + titleLabel.text = post.title + + if let currentlyPlaying = RYAudioDeck.sharedAudioDeck.currentlyPlaying where currentlyPlaying == post { + // Style for currentlyPlaying. + playControl.hideProgress(false) + playControl.hideCenterImage(true) + + playControl.setProgress(RYAudioDeck.sharedAudioDeck.playbackProgress, animated: false) + } + else { + // Style for ready in playlist. + playControl.hideProgress(true) + playControl.hideCenterImage(false) + } + } + + func styleWithDownload(post: RYPost) { + self.post = post + titleLabel.text = post.title + playControl.setProgress(0.33, animated: false) + } + + // Layout + + private func subviewConstraints() -> [NSLayoutConstraint] { + let views = ["playControl": playControl, "title": titleLabel] + let metrics = ["relatedPadding": Constants.Global.RelatedElementPadding, "padding": Constants.Global.ElementPadding, "controlDimension": playControlDimension] + var constraints: [NSLayoutConstraint] = [] + + // Horizontal + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(relatedPadding)-[playControl(controlDimension)]-(relatedPadding)-[title]-(relatedPadding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + + // Play Control + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[playControl(controlDimension)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + constraints += [NSLayoutConstraint(item: playControl, attribute: .CenterY, relatedBy: .Equal, toItem: playControl.superview, attribute: .CenterY, multiplier: 1.0, constant: 0.0)] + + // Title + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-[title]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + + return constraints + } + +} diff --git a/Ryff/AudioDeck/RYAudioDeckViewController.h b/Ryff/Classes/RYAudioDeckViewController.h similarity index 63% rename from Ryff/AudioDeck/RYAudioDeckViewController.h rename to Ryff/Classes/RYAudioDeckViewController.h index 7452a14..15dea95 100644 --- a/Ryff/AudioDeck/RYAudioDeckViewController.h +++ b/Ryff/Classes/RYAudioDeckViewController.h @@ -6,8 +6,6 @@ // Copyright (c) 2014 Chris Laganiere. All rights reserved. // -#import "RYCoreViewController.h" - -@interface RYAudioDeckViewController : RYCoreViewController +@interface RYAudioDeckViewControllerOLD : UIViewController @end diff --git a/Ryff/Classes/RYAudioDeckViewController.m b/Ryff/Classes/RYAudioDeckViewController.m new file mode 100644 index 0000000..36a7cd7 --- /dev/null +++ b/Ryff/Classes/RYAudioDeckViewController.m @@ -0,0 +1,435 @@ +// +// RYAudioDeckViewController.m +// Ryff +// +// Created by Christopher Laganiere on 8/10/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +#import "RYAudioDeckViewController.h" + +#import + +#import "Ryff-Swift.h" + +// Data Managers +#import "RYStyleSheet.h" + +// Data Objects +#import "RYPost.h" + +// Custom UI +#import "RYAudioDeckTableViewCell.h" + +// Categories +#import "UIImage+Color.h" +#import "UIImage+Size.h" + +// Associated View Controllers +#import "RYRiffDetailsViewController.h" + +#define kAudioDeckCellReuseID @"audioDeckCell" + +@interface RYAudioDeckViewControllerOLD () + +@property (weak, nonatomic) IBOutlet UITableView *tableView; +@property (weak, nonatomic) IBOutlet UIView *controlWrapperView; +@property (weak, nonatomic) IBOutlet UIButton *playButton; +@property (weak, nonatomic) IBOutlet UIButton *repostButton; +@property (weak, nonatomic) IBOutlet UIButton *nextButton; +@property (weak, nonatomic) IBOutlet UISlider *volumeSlider; +@property (weak, nonatomic) IBOutlet UILabel *nowPlayingLabel; +@property (weak, nonatomic) IBOutlet UISlider *playbackSlider; + +// Data +@property (nonatomic, assign) BOOL progressSliderTouchActive; + +@end + +@implementation RYAudioDeckViewControllerOLD + +#pragma mark - +#pragma mark - ViewController Lifecycle + +- (void) viewDidLoad { + [super viewDidLoad]; + + [self.view setBackgroundColor:[RYStyleSheet audioPadColor]]; + + [_playButton setTintColor:[RYStyleSheet audioActionColor]]; + [_repostButton setTintColor:[RYStyleSheet audioActionColor]]; + [_nextButton setTintColor:[RYStyleSheet audioActionColor]]; + [_volumeSlider setTintColor:[RYStyleSheet audioActionColor]]; + [_nowPlayingLabel setTextColor:[RYStyleSheet audioActionColor]]; + + [_controlWrapperView setBackgroundColor:[[RYStyleSheet audioPadColor] colorWithAlphaComponent:0.85f]]; + [_controlWrapperView setClipsToBounds:YES]; + [_controlWrapperView.layer setCornerRadius:10.0f]; + + + // long press to move cells + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)]; + [self.tableView addGestureRecognizer:longPress]; + + // prevent volume hud + MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: _volumeSlider.frame]; + volumeView.autoresizingMask = _volumeSlider.autoresizingMask; + [volumeView setVolumeThumbImage:[[UIImage imageNamed:@"sliderSmall"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; + [volumeView setTintColor:[RYStyleSheet audioActionColor]]; + [volumeView setRouteButtonImage:[[UIImage imageNamed:@"airplayIcon"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; + [_controlWrapperView addSubview: volumeView]; + + [_volumeSlider removeFromSuperview]; + _volumeSlider = nil; +} + +- (void) viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + +// [[RYAudioDeckManager sharedInstance] setDelegate:self]; + [self styleFromAudioDeck]; + [self.tableView reloadData]; +} + +-(UIStatusBarStyle)preferredStatusBarStyle { + return UIStatusBarStyleLightContent; +} + +#pragma mark - Styling + +- (void) styleFromAudioDeck +{ +// RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; +// +// if ([audioManager isPlaying]) +// [_playButton setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal]; +// else +// [_playButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal]; +// +// if ([audioManager currentlyPlayingPost] || [audioManager riffPlaylist].count > 0) +// { +// // enable audio buttons +// [_playButton setEnabled:YES]; +// [_repostButton setEnabled:YES]; +// [_nextButton setEnabled:YES]; +// [_playbackSlider setUserInteractionEnabled:YES]; +// +// [_playbackSlider setTintColor:[RYStyleSheet audioActionColor]]; +// if ([audioManager isPlaying]) +// [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderSeek"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; +// else +// [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderFull"] colorImage:[RYStyleSheet audioActionColor]] forState:UIControlStateNormal]; +// } +// else +// { +// // disable audio buttons +// [_playButton setEnabled:NO]; +// [_repostButton setEnabled:NO]; +// [_nextButton setEnabled:NO]; +// [_playbackSlider setValue:0.0f]; +// [_playbackSlider setUserInteractionEnabled:NO]; +// [_playbackSlider setTintColor:[RYStyleSheet availableActionColor]]; +// [_playbackSlider setThumbImage:[[UIImage imageNamed:@"sliderSmall"] colorImage:[RYStyleSheet availableActionColor]] forState:UIControlStateNormal]; +// } +// +// if (!_progressSliderTouchActive) +// [_playbackSlider setValue:[audioManager currentPlaybackProgress]]; +// +// [_nowPlayingLabel setText:[audioManager currentlyPlayingPost].title]; +} + +#pragma mark - +#pragma mark - Actions + +- (IBAction)playButtonHit:(id)sender +{ +// BOOL shouldPlay = ![[RYAudioDeckManager sharedInstance] isPlaying]; +// [[RYAudioDeckManager sharedInstance] playTrack:shouldPlay]; +} + +- (IBAction)repostButtonHit:(id)sender +{ +// RYPost *post = [[RYAudioDeckManager sharedInstance] currentlyPlayingPost]; +// if (post) +// { +// RYRiffMixerViewController *riffMixer = [[RYRiffMixerViewController alloc] initWithNibName:nil bundle:nil]; +// [self presentViewController:riffMixer animated:YES completion:nil]; +// } +} + +- (IBAction)nextButtonHit:(id)sender +{ +// [[RYAudioDeckManager sharedInstance] skipTrack]; +} + +- (IBAction)playbackSliderTouchStarted:(id)sender +{ + _progressSliderTouchActive = YES; +} + +- (IBAction)playbackSliderTouchUpInside:(id)sender +{ +// _progressSliderTouchActive = NO; +// [[RYAudioDeckManager sharedInstance] setPlaybackProgress:_playbackSlider.value]; +} + +- (IBAction)playbackSliderTouchUpOutside:(id)sender +{ + _progressSliderTouchActive = NO; +} + +#pragma mark - +#pragma mark - AudioDeck Delegate + +- (void) riffPlaylistUpdated +{ + [self.tableView reloadData]; +} + +- (void) trackChanged +{ + [self styleFromAudioDeck]; +} + +- (void) post:(RYPost *)post playbackTimeChanged:(CGFloat)time progress:(CGFloat)progress +{ + if (!_progressSliderTouchActive) + [_playbackSlider setValue:progress animated:YES]; +} + +#pragma mark - +#pragma mark - TableView Data Source + +- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + +- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ +// return [[RYAudioDeckManager sharedInstance] riffPlaylist].count + [[RYAudioDeckManager sharedInstance] downloadQueue].count; + return 0; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return [_tableView dequeueReusableCellWithIdentifier:kAudioDeckCellReuseID]; +} + +- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return 0.01f; } +- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.01f; } + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } +- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { return NO; } +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath +{ +// if (indexPath.row < [[RYAudioDeckManager sharedInstance] riffPlaylist].count) +// return YES; +// else + return NO; +} + +- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; } + + +#pragma mark - TableView Delegate + +- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath +{ +// RYAudioDeckTableViewCell *audioCell = (RYAudioDeckTableViewCell *)cell; +// NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; +// RYPost *post; +// if (indexPath.row < playlist.count) +// { +// // riff playlist +// post = [playlist objectAtIndex:indexPath.row]; +// } +// else +// { +// NSInteger downloadIdx = indexPath.row-playlist.count; +// post = [[[RYAudioDeckManager sharedInstance] downloadQueue] objectAtIndex:downloadIdx]; +// } +// +// [audioCell configureForPost:post trackIdx:(indexPath.row+1)]; +// +// if (indexPath == movingIndexPath) +// { +// // currently held with long press gesture +// [audioCell setHidden:YES]; +// } +} + +- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + +// [[RYAudioDeckManager sharedInstance] playTrack:NO]; +// +// RYPost *post; +// NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; +// if (indexPath.row < playlist.count) +// { +// // riff playlist +// post = [playlist objectAtIndex:indexPath.row]; +// } +// else +// { +// // riff download +// NSInteger downloadIdx = indexPath.row-playlist.count; +// post = [[[RYAudioDeckManager sharedInstance] downloadQueue] objectAtIndex:downloadIdx]; +// } +// +// NSString *storyboardName = isIpad ? @"Main" : @"MainIphone"; +// RYRiffDetailsViewController *riffDetails = [[UIStoryboard storyboardWithName:storyboardName bundle:NULL] instantiateViewControllerWithIdentifier:@"riffDetails"]; +// [riffDetails configureForPost:post]; +// riffDetails.shouldPreventNavigation = YES; +// [riffDetails addBackButton]; +// +// UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:riffDetails]; +// [self presentViewController:navController animated:YES completion:nil]; +} + +- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath +{ + NSArray *playlist = @[];//[[RYAudioDeckManager sharedInstance] riffPlaylist]; + if (proposedDestinationIndexPath.row >= playlist.count) + { + // only let users drop active rows onto the playlist, not download queue + proposedDestinationIndexPath = [NSIndexPath indexPathForRow:playlist.count-1 inSection:0]; + } + + return proposedDestinationIndexPath; + +} + +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath +{ +// [[RYAudioDeckManager sharedInstance] movePostFromPlaylistIndex:sourceIndexPath.row toIndex:destinationIndexPath.row]; +} + +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ +// if (editingStyle == UITableViewCellEditingStyleDelete) +// { +// RYPost *postToDelete; +// +// NSArray *playlist = [[RYAudioDeckManager sharedInstance] riffPlaylist]; +// NSArray *downloadQueue = [[RYAudioDeckManager sharedInstance] downloadQueue]; +// +// if (indexPath.row < playlist.count) +// postToDelete = playlist[indexPath.row]; +// else if (indexPath.row - playlist.count < downloadQueue.count) +// postToDelete = downloadQueue[indexPath.row - playlist.count]; +// +// [[RYAudioDeckManager sharedInstance] removePostFromPlaylist:postToDelete]; +// } +} + +#pragma mark - +#pragma mark - Long Press Reorder + +static UIView *snapshot; // A snapshot of the row user is moving. +static NSIndexPath *sourceIndexPath; // Initial index path, where gesture begins. +static NSIndexPath *movingIndexPath; // current moving index path +- (void)longPressGesture:(UILongPressGestureRecognizer *)longPress +{ + CGPoint location = [longPress locationInView:self.tableView]; + movingIndexPath = [self.tableView indexPathForRowAtPoint:location]; + location = [self.view convertPoint:location fromView:self.tableView]; + +// NSInteger playlistCount = [[RYAudioDeckManager sharedInstance] riffPlaylist].count; +// +// switch (longPress.state) +// { +// case UIGestureRecognizerStateBegan: +// { +// if (movingIndexPath) +// { +// sourceIndexPath = movingIndexPath; +// +// if (sourceIndexPath.row < playlistCount) +// { +// // playlist cell, allow moving in playlist +// UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:movingIndexPath]; +// +// // Take a snapshot of the selected row using helper method. +// snapshot = [self customSnapshotFromView:cell]; +// +// // Add the snapshot as subview, centered at cell's center... +// __block CGPoint center = [self.view convertPoint:cell.center fromView:self.tableView]; +// snapshot.center = center; +// snapshot.alpha = 0.0; +// [self.view insertSubview:snapshot aboveSubview:_tableView]; +// [UIView animateWithDuration:0.25 animations:^{ +// +// // Offset for gesture location. +// center.y = location.y; +// snapshot.center = center; +// snapshot.transform = CGAffineTransformMakeScale(1.05, 1.05); +// snapshot.alpha = 0.98; +// cell.alpha = 0.0; +// +// } completion:^(BOOL finished) { +// cell.hidden = YES; +// }]; +// } +// } +// break; +// } +// case UIGestureRecognizerStateChanged: +// { +// CGPoint center = snapshot.center; +// center.y = location.y; +// snapshot.center = center; +// +// if (movingIndexPath && ![movingIndexPath isEqual:sourceIndexPath] && movingIndexPath.row < playlistCount) +// { +// // destination valid, different from source, and in playlist +// [[RYAudioDeckManager sharedInstance] movePostFromPlaylistIndex:sourceIndexPath.row toIndex:movingIndexPath.row]; +// +// [self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:movingIndexPath]; +// sourceIndexPath = movingIndexPath; +// } +// break; +// } +// default: +// { +// // Clean up. +// UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:sourceIndexPath]; +// cell.hidden = NO; +// cell.alpha = 0.0; +// +// [UIView animateWithDuration:0.25 animations:^{ +// snapshot.center = [self.view convertPoint:cell.center fromView:self.tableView]; +// snapshot.transform = CGAffineTransformIdentity; +// snapshot.alpha = 0.0; +// cell.alpha = 1.0; +// } completion:^(BOOL finished) { +// sourceIndexPath = nil; +// [snapshot removeFromSuperview]; +// snapshot = nil; +// movingIndexPath = nil; +// }]; +// break; +// } +// } +} + +#pragma mark - Helper methods + +/** + Returns a customized snapshot of a given view. + */ +- (UIView *)customSnapshotFromView:(UIView *)inputView +{ + UIView *snapshot = [inputView snapshotViewAfterScreenUpdates:YES]; + snapshot.layer.masksToBounds = NO; + snapshot.layer.cornerRadius = 0.0; + snapshot.layer.shadowOffset = CGSizeMake(-5.0, 0.0); + snapshot.layer.shadowRadius = 5.0; + snapshot.layer.shadowOpacity = 0.4; + + return snapshot; +} + +@end diff --git a/Ryff/Classes/RYAudioDeckViewController.swift b/Ryff/Classes/RYAudioDeckViewController.swift new file mode 100644 index 0000000..e0f61d8 --- /dev/null +++ b/Ryff/Classes/RYAudioDeckViewController.swift @@ -0,0 +1,134 @@ +// +// RYAudioDeckViewController.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYAudioDeckViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, RYAudioDeckDelegate { + + private let SectionReadyPost = 0 + private let SectionDownloadQueue = 1 + private let AudioDeckTableViewCellReuseIdentifier = "AudioDeckTableViewCell" + + weak var audioDeck: RYAudioDeck? + + private let consoleView = RYAudioDeckConsoleView(frame: CGRectZero) + private let tableView = UITableView(frame: CGRectZero) + + required init(audioDeck: RYAudioDeck) { + super.init(nibName: nil, bundle: nil) + self.audioDeck = audioDeck + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.dataSource = self + tableView.delegate = self + tableView.registerClass(RYAudioDeckTableViewCell.self, forCellReuseIdentifier: AudioDeckTableViewCellReuseIdentifier) + + consoleView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(consoleView) + + tableView.rowHeight = RYAudioDeckTableViewCell.preferredHeight + tableView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(tableView) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + } + + override func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + audioDeck?.delegate = self + } + + // MARK: RYAudioDeckDelegate + + func playbackStatusChanged() { + consoleView.updatePlayback() + reloadCurrentlyPlayingCell() + } + + func currentlyPlayingChanged() { + consoleView.updateNowPlaying() + } + + func playlistChanged() { + tableView.reloadData() + } + + // MARK: Private Styling + + func reloadCurrentlyPlayingCell() { + if let post = audioDeck?.currentlyPlaying, postIndex = audioDeck?.currentPlaylist?.readyPosts.indexOf(post) { + let indexpath = NSIndexPath(index: postIndex) +// if let postCell = tableView.cellForRowAtIndexPath(indexpath) as? RYAudioDeckTableViewCell { +// postCell.styleWithReadyPost(post) +// } + } + } + + // MARK: UITableViewDataSource + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 2 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + switch (section) { + case SectionReadyPost: + return audioDeck?.currentPlaylist?.readyPosts.count ?? 0 + case SectionDownloadQueue: + return audioDeck?.currentPlaylist?.downloadQueue.count ?? 0 + default: + return 0 + } + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + return tableView.dequeueReusableCellWithIdentifier(AudioDeckTableViewCellReuseIdentifier, forIndexPath: indexPath) + } + + // MARK: UITableViewDelegate + + func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + if let deckCell = cell as? RYAudioDeckTableViewCell { + // Style ready posts. + if (indexPath.section == SectionReadyPost) { + if let post = audioDeck?.currentPlaylist?.readyPosts[indexPath.row] { + deckCell.styleWithReadyPost(post) + } + } + // Style download queue. + if (indexPath.section == SectionDownloadQueue) { + if let post = audioDeck?.currentPlaylist?.downloadQueue[indexPath.row] { + deckCell.styleWithDownload(post) + } + } + } + } + + // MARK: Layout + + private func subviewConstraints() -> [NSLayoutConstraint] { + let views = ["tableView": tableView, "consoleView": consoleView] + let metrics = ["padding": Constants.Global.ElementPadding] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[consoleView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) + // TODO: let console self-size + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[consoleView(50)]-(padding)-[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + return constraints + } + +} diff --git a/Ryff/Base Classes/RYCorePageViewController.h b/Ryff/Classes/RYCorePageViewController.h similarity index 100% rename from Ryff/Base Classes/RYCorePageViewController.h rename to Ryff/Classes/RYCorePageViewController.h diff --git a/Ryff/Base Classes/RYCorePageViewController.m b/Ryff/Classes/RYCorePageViewController.m similarity index 86% rename from Ryff/Base Classes/RYCorePageViewController.m rename to Ryff/Classes/RYCorePageViewController.m index bb4dfe9..7ff5749 100644 --- a/Ryff/Base Classes/RYCorePageViewController.m +++ b/Ryff/Classes/RYCorePageViewController.m @@ -21,7 +21,7 @@ - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [self.view setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; +// [self.view setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; } - (BOOL)prefersStatusBarHidden diff --git a/Ryff/UI/Custom/RYCoreViewController.h b/Ryff/Classes/RYCoreViewController.h similarity index 100% rename from Ryff/UI/Custom/RYCoreViewController.h rename to Ryff/Classes/RYCoreViewController.h diff --git a/Ryff/UI/Custom/RYCoreViewController.m b/Ryff/Classes/RYCoreViewController.m similarity index 100% rename from Ryff/UI/Custom/RYCoreViewController.m rename to Ryff/Classes/RYCoreViewController.m diff --git a/Ryff/Data/RYDataManager.h b/Ryff/Classes/RYDataManager.h similarity index 85% rename from Ryff/Data/RYDataManager.h rename to Ryff/Classes/RYDataManager.h index 37c8f8c..4b8f1ae 100644 --- a/Ryff/Data/RYDataManager.h +++ b/Ryff/Classes/RYDataManager.h @@ -11,10 +11,10 @@ @class AFHTTPRequestOperation; @protocol TrackDownloadDelegate -- (void) track:(NSURL*)trackURL DownloadProgressed:(CGFloat)progress; -- (void) track:(NSURL*)trackURL FinishedDownloading:(NSURL*)localURL; +- (void) track:(NSURL*)trackURL downloadProgressed:(CGFloat)progress; +- (void) track:(NSURL*)trackURL finishedDownloading:(NSURL*)localURL; @optional -- (void) track:(NSURL*)trackURL DownloadFailed:(NSString*)reason; +- (void) track:(NSURL*)trackURL downloadFailed:(NSString*)reason; @end @interface DownloadOperation : NSObject diff --git a/Ryff/Data/RYDataManager.m b/Ryff/Classes/RYDataManager.m similarity index 90% rename from Ryff/Data/RYDataManager.m rename to Ryff/Classes/RYDataManager.m index bc20009..5e1b2c2 100644 --- a/Ryff/Data/RYDataManager.m +++ b/Ryff/Classes/RYDataManager.m @@ -10,7 +10,6 @@ // Data Managers #import "RYMediaEditor.h" -#import "RYAudioDeckManager.h" #import "RYRiffAudioEngine.h" // Frameworks @@ -109,8 +108,8 @@ - (void) fetchTempRiff:(NSURL *)riffURL forDelegate:(id)d if ([[NSFileManager defaultManager] fileExistsAtPath:[localURL path]]) { // don't need to download - if (delegate && [delegate respondsToSelector:@selector(track:FinishedDownloading:)]) - [delegate track:riffURL FinishedDownloading:localURL]; + if (delegate && [delegate respondsToSelector:@selector(track:finishedDownloading:)]) + [delegate track:riffURL finishedDownloading:localURL]; } else { @@ -130,10 +129,10 @@ - (void) saveRiffAt:(NSURL*)riffURL toLocalURL:(NSURL *)localURL forDelegate:(id operation.outputStream = [NSOutputStream outputStreamToFileAtPath:[localURL path] append:NO]; [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { - if (delegate && [delegate respondsToSelector:@selector(track:DownloadProgressed:)]) + if (delegate && [delegate respondsToSelector:@selector(track:downloadProgressed:)]) { CGFloat downloadProgress = totalBytesRead / (CGFloat)totalBytesExpectedToRead; - [delegate track:riffURL DownloadProgressed:downloadProgress]; + [delegate track:riffURL downloadProgressed:downloadProgress]; } }]; @@ -141,8 +140,8 @@ - (void) saveRiffAt:(NSURL*)riffURL toLocalURL:(NSURL *)localURL forDelegate:(id [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { [_downloadQueue removeObject:operation]; - if (delegate && [delegate respondsToSelector:@selector(track:FinishedDownloading:)]) - [delegate track:riffURL FinishedDownloading:localURL]; + if (delegate && [delegate respondsToSelector:@selector(track:finishedDownloading:)]) + [delegate track:riffURL finishedDownloading:localURL]; [_downloadQueue removeObject:downloadOperation]; _currentDownload = nil; @@ -150,8 +149,8 @@ - (void) saveRiffAt:(NSURL*)riffURL toLocalURL:(NSURL *)localURL forDelegate:(id } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [_downloadQueue removeObject:downloadOperation]; - if (delegate && [delegate respondsToSelector:@selector(track:DownloadFailed:)]) - [delegate track:riffURL DownloadFailed:[error localizedDescription]]; + if (delegate && [delegate respondsToSelector:@selector(track:downloadFailed:)]) + [delegate track:riffURL downloadFailed:[error localizedDescription]]; [_downloadQueue removeObject:downloadOperation]; _currentDownload = nil; @@ -207,16 +206,19 @@ - (void) startNextDownload */ - (void) clearCache { + return; + +#warning check this out NSString *directory = NSTemporaryDirectory(); NSError *error = nil; for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:&error]) { - if (![[RYAudioDeckManager sharedInstance] playlistContainsFile:file]) - { - [[NSFileManager defaultManager] removeItemAtPath:[directory stringByAppendingPathComponent:file] error:&error]; - if (error) - NSLog(@"clearCache failed: %@",[error localizedDescription]); - } +// if (![[RYAudioDeckManager sharedInstance] playlistContainsFile:file]) +// { +// [[NSFileManager defaultManager] removeItemAtPath:[directory stringByAppendingPathComponent:file] error:&error]; +// if (error) +// NSLog(@"clearCache failed: %@",[error localizedDescription]); +// } } for (DownloadOperation *download in _downloadQueue) diff --git a/Ryff/Data/Services/RYDiscoverServices.h b/Ryff/Classes/RYDiscoverServices.h similarity index 100% rename from Ryff/Data/Services/RYDiscoverServices.h rename to Ryff/Classes/RYDiscoverServices.h diff --git a/Ryff/Data/Services/RYDiscoverServices.m b/Ryff/Classes/RYDiscoverServices.m similarity index 100% rename from Ryff/Data/Services/RYDiscoverServices.m rename to Ryff/Classes/RYDiscoverServices.m diff --git a/Ryff/TagList/RYTagListViewController.h b/Ryff/Classes/RYDiscoverViewController.h similarity index 52% rename from Ryff/TagList/RYTagListViewController.h rename to Ryff/Classes/RYDiscoverViewController.h index a98a6c6..bbba8bd 100644 --- a/Ryff/TagList/RYTagListViewController.h +++ b/Ryff/Classes/RYDiscoverViewController.h @@ -1,13 +1,11 @@ // -// RYTagListViewController.h +// RYDiscoverViewController.h // Ryff // // Created by Christopher Laganiere on 9/15/14. // Copyright (c) 2014 Chris Laganiere. All rights reserved. // -#import "RYCoreViewController.h" - -@interface RYTagListViewController : RYCoreViewController +@interface RYDiscoverViewController : UIViewController @end diff --git a/Ryff/TagList/RYTagListViewController.m b/Ryff/Classes/RYDiscoverViewController.m similarity index 76% rename from Ryff/TagList/RYTagListViewController.m rename to Ryff/Classes/RYDiscoverViewController.m index 2ae1b55..cdc1ac7 100644 --- a/Ryff/TagList/RYTagListViewController.m +++ b/Ryff/Classes/RYDiscoverViewController.m @@ -1,12 +1,12 @@ // -// RYTagListViewController.m +// RYDiscoverViewController.m // Ryff // // Created by Christopher Laganiere on 9/15/14. // Copyright (c) 2014 Chris Laganiere. All rights reserved. // -#import "RYTagListViewController.h" +#import "RYDiscoverViewController.h" // Data Managers #import "RYRegistrationServices.h" @@ -27,21 +27,39 @@ #define kTagCellReuseID @"tagCell" #define kTagHeaderReuseID @"tagListHeader" -@interface RYTagListViewController () +@interface RYDiscoverViewController () -@property (weak, nonatomic) IBOutlet UICollectionView *collectionView; +@property (nonatomic) UICollectionView *collectionView; // Data -@property (nonatomic, strong) NSArray *tagLists; +@property (nonatomic) NSArray *tagLists; @end -@implementation RYTagListViewController +@implementation RYDiscoverViewController + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[[UICollectionViewFlowLayout alloc] init]]; + self.collectionView.dataSource = self; + self.collectionView.delegate = self; + } + return self; +} - (void) viewDidLoad { [super viewDidLoad]; + self.collectionView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:self.collectionView]; + NSDictionary *viewsDict = @{@"collectionView": self.collectionView}; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[collectionView]|" options:0 metrics:nil views:viewsDict]]; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[collectionView]|" options:0 metrics:nil views:viewsDict]]; + + [self.collectionView registerClass:[RYTagCollectionViewCell class] forCellWithReuseIdentifier:kTagCellReuseID]; + [self.collectionView registerClass:[RYTagListHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kTagHeaderReuseID]; + NSMutableArray *tagLists = [[NSMutableArray alloc] initWithCapacity:2]; RYTagList *trending = [[RYTagList alloc] initWithTagListType:TRENDING_LIST]; diff --git a/Ryff/Classes/RYFadingVisualEffectView.swift b/Ryff/Classes/RYFadingVisualEffectView.swift new file mode 100644 index 0000000..8d2ba1e --- /dev/null +++ b/Ryff/Classes/RYFadingVisualEffectView.swift @@ -0,0 +1,72 @@ +// +// RYFadingVisualEffectView.swift +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +/** +Direction of the fade effect. + +- Top: Fade from dark top to transparent bottom. +- Bottom: Fade from dark bottom to transparent top. +*/ +enum RYFadingVisualEffectViewDirection: NSInteger { + case Top = 0 + case Bottom = 1 +} + +/** +Creates a visual effect view whichs has its transparency fading with a gradient view dependent on the supplied direction. +*/ + +class RYFadingVisualEffectView: UIVisualEffectView { + + private static let FractionOfViewToFade: CGFloat = 0.5 + + private let gradientView: CAGradientLayer + + /** + Creates a `RYFadingVisualEffectView` + + :param: effect Desired `UIVisualEffect` + :param: direction `RYFadingVisualEffectViewDirection` for the fade to occur in. + + :returns: Instance of the fading visual effects view. + */ + required init(effect: UIVisualEffect, direction: RYFadingVisualEffectViewDirection) { + gradientView = RYFadingVisualEffectView.gradientTransparencyLayer(direction) + super.init(effect: effect) + self.layer.mask = gradientView + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + gradientView.frame = bounds + } + + // MARK: Private + + private class func gradientTransparencyLayer(direction: RYFadingVisualEffectViewDirection) -> CAGradientLayer { + let gradientLayer = CAGradientLayer() + gradientLayer.colors = [UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] + switch (direction) { + case .Top: + gradientLayer.startPoint = CGPointMake(1.0, FractionOfViewToFade) + gradientLayer.endPoint = CGPointMake(1.0, 1.0) + case .Bottom: + gradientLayer.startPoint = CGPointMake(1.0, 1.0-FractionOfViewToFade) + gradientLayer.endPoint = CGPointMake(1.0, 0.0) + } + return gradientLayer + } + +} diff --git a/Ryff/UI/Profile/RiffCell/RYGroupTableViewCell.h b/Ryff/Classes/RYGroupTableViewCell.h similarity index 100% rename from Ryff/UI/Profile/RiffCell/RYGroupTableViewCell.h rename to Ryff/Classes/RYGroupTableViewCell.h diff --git a/Ryff/UI/Profile/RiffCell/RYGroupTableViewCell.m b/Ryff/Classes/RYGroupTableViewCell.m similarity index 99% rename from Ryff/UI/Profile/RiffCell/RYGroupTableViewCell.m rename to Ryff/Classes/RYGroupTableViewCell.m index bcb892c..ba42b49 100644 --- a/Ryff/UI/Profile/RiffCell/RYGroupTableViewCell.m +++ b/Ryff/Classes/RYGroupTableViewCell.m @@ -27,7 +27,6 @@ - (void)awakeFromNib - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; - // Configure the view for the selected state } diff --git a/Ryff/Style/Custom UI Objects/RYLoadMoreControl.h b/Ryff/Classes/RYLoadMoreControl.h similarity index 100% rename from Ryff/Style/Custom UI Objects/RYLoadMoreControl.h rename to Ryff/Classes/RYLoadMoreControl.h diff --git a/Ryff/Style/Custom UI Objects/RYLoadMoreControl.m b/Ryff/Classes/RYLoadMoreControl.m similarity index 100% rename from Ryff/Style/Custom UI Objects/RYLoadMoreControl.m rename to Ryff/Classes/RYLoadMoreControl.m diff --git a/Ryff/Data/Location/RYLocationServices.h b/Ryff/Classes/RYLocationServices.h similarity index 100% rename from Ryff/Data/Location/RYLocationServices.h rename to Ryff/Classes/RYLocationServices.h diff --git a/Ryff/Data/Location/RYLocationServices.m b/Ryff/Classes/RYLocationServices.m similarity index 100% rename from Ryff/Data/Location/RYLocationServices.m rename to Ryff/Classes/RYLocationServices.m diff --git a/Ryff/Register/Login/RYLoginTableViewCell.h b/Ryff/Classes/RYLoginTableViewCell.h similarity index 100% rename from Ryff/Register/Login/RYLoginTableViewCell.h rename to Ryff/Classes/RYLoginTableViewCell.h diff --git a/Ryff/Register/Login/RYLoginTableViewCell.m b/Ryff/Classes/RYLoginTableViewCell.m similarity index 100% rename from Ryff/Register/Login/RYLoginTableViewCell.m rename to Ryff/Classes/RYLoginTableViewCell.m diff --git a/Ryff/Register/Login/RYLoginViewController.h b/Ryff/Classes/RYLoginViewController.h similarity index 100% rename from Ryff/Register/Login/RYLoginViewController.h rename to Ryff/Classes/RYLoginViewController.h diff --git a/Ryff/Register/Login/RYLoginViewController.m b/Ryff/Classes/RYLoginViewController.m similarity index 98% rename from Ryff/Register/Login/RYLoginViewController.m rename to Ryff/Classes/RYLoginViewController.m index 0359f10..eab8458 100644 --- a/Ryff/Register/Login/RYLoginViewController.m +++ b/Ryff/Classes/RYLoginViewController.m @@ -22,7 +22,9 @@ // Data Managers #import "RYServices.h" #import "RYRegistrationServices.h" -#import "SSKeychain.h" + +// Frameworks +@import SSKeychain; #define kFieldCellReuseID @"FieldCell" #define kLoginCellReuseID @"LoginCell" @@ -227,7 +229,7 @@ - (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)c [usernameField setSecureTextEntry:NO]; [usernameField setTintColor:[UIColor whiteColor]]; - [[cell viewWithTag:8] setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; +// [[cell viewWithTag:8] setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; break; } @@ -242,7 +244,7 @@ - (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)c [passwordField setSecureTextEntry:YES]; [passwordField setTintColor:[UIColor whiteColor]]; - [[cell viewWithTag:8] setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; +// [[cell viewWithTag:8] setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; break; } case kLoginRow: diff --git a/Ryff/Data/RYMediaEditor.h b/Ryff/Classes/RYMediaEditor.h similarity index 100% rename from Ryff/Data/RYMediaEditor.h rename to Ryff/Classes/RYMediaEditor.h diff --git a/Ryff/Data/RYMediaEditor.m b/Ryff/Classes/RYMediaEditor.m similarity index 100% rename from Ryff/Data/RYMediaEditor.m rename to Ryff/Classes/RYMediaEditor.m diff --git a/Ryff/Classes/RYNavigationController.h b/Ryff/Classes/RYNavigationController.h new file mode 100644 index 0000000..9a73a1a --- /dev/null +++ b/Ryff/Classes/RYNavigationController.h @@ -0,0 +1,13 @@ +// +// RYNavigationController.h +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import + +@interface RYNavigationController : UINavigationController + +@end diff --git a/Ryff/Classes/RYNavigationController.m b/Ryff/Classes/RYNavigationController.m new file mode 100644 index 0000000..9dc23f6 --- /dev/null +++ b/Ryff/Classes/RYNavigationController.m @@ -0,0 +1,44 @@ +// +// RYNavigationController.m +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYNavigationController.h" + +@interface RYNavigationController () + +@end + +@implementation RYNavigationController + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.navigationBar setBarTintColor:[RYStyleSheet postActionColor]]; + [self.navigationBar setTranslucent:NO]; + [self.navigationBar setTintColor:[UIColor whiteColor]]; + + NSDictionary *navbarTitleAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor], + NSFontAttributeName: [UIFont fontWithName:kRegularFont size:24.0f]}; + + [[UINavigationBar appearance] setTitleTextAttributes:navbarTitleAttributes]; + +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:3.0f forBarMetrics:UIBarMetricsDefault]; +} + +- (BOOL)prefersStatusBarHidden { + return NO; +} + +-(UIStatusBarStyle)preferredStatusBarStyle { + return UIStatusBarStyleLightContent; +} + +@end diff --git a/Ryff/Newsfeed/RYNewsfeedContainerViewController.h b/Ryff/Classes/RYNewsfeedContainerViewController.h similarity index 100% rename from Ryff/Newsfeed/RYNewsfeedContainerViewController.h rename to Ryff/Classes/RYNewsfeedContainerViewController.h diff --git a/Ryff/Newsfeed/RYNewsfeedContainerViewController.m b/Ryff/Classes/RYNewsfeedContainerViewController.m similarity index 96% rename from Ryff/Newsfeed/RYNewsfeedContainerViewController.m rename to Ryff/Classes/RYNewsfeedContainerViewController.m index 0a9f5db..e2f5f3e 100644 --- a/Ryff/Newsfeed/RYNewsfeedContainerViewController.m +++ b/Ryff/Classes/RYNewsfeedContainerViewController.m @@ -26,7 +26,7 @@ - (void)viewDidLoad UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; [statusBarView setAutoresizesSubviews:UIViewAutoresizingFlexibleWidth]; - [statusBarView setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; +// [statusBarView setBackgroundColor:[RYStyleSheet audioBackgroundColor]]; [self.view insertSubview:statusBarView aboveSubview:_newsfeedContainerView]; [_newsfeedContainerView setAutoresizingMask:UIViewAutoresizingFlexibleHeight]; diff --git a/Ryff/Classes/RYNewsfeedDataSource.h b/Ryff/Classes/RYNewsfeedDataSource.h new file mode 100644 index 0000000..d9928a2 --- /dev/null +++ b/Ryff/Classes/RYNewsfeedDataSource.h @@ -0,0 +1,13 @@ +// +// RYNewsfeedDataSource.h +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYPostsDataSource.h" + +@interface RYNewsfeedDataSource : RYPostsDataSource + +@end diff --git a/Ryff/Classes/RYNewsfeedDataSource.m b/Ryff/Classes/RYNewsfeedDataSource.m new file mode 100644 index 0000000..73a1179 --- /dev/null +++ b/Ryff/Classes/RYNewsfeedDataSource.m @@ -0,0 +1,17 @@ +// +// RYNewsfeedDataSource.m +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYNewsfeedDataSource.h" + +@implementation RYNewsfeedDataSource + +- (void)fetchContent:(NSInteger)page { + [[RYServices sharedInstance] getNewsfeedPostsWithPage:@(page) delegate:self]; +} + +@end diff --git a/Ryff/Newsfeed/RYNewsfeedNavigationController.h b/Ryff/Classes/RYNewsfeedNavigationController.h similarity index 100% rename from Ryff/Newsfeed/RYNewsfeedNavigationController.h rename to Ryff/Classes/RYNewsfeedNavigationController.h diff --git a/Ryff/Newsfeed/RYNewsfeedNavigationController.m b/Ryff/Classes/RYNewsfeedNavigationController.m similarity index 100% rename from Ryff/Newsfeed/RYNewsfeedNavigationController.m rename to Ryff/Classes/RYNewsfeedNavigationController.m diff --git a/Ryff/Newsfeed/RYNewsfeedTableViewController.h b/Ryff/Classes/RYNewsfeedTableViewController.h similarity index 100% rename from Ryff/Newsfeed/RYNewsfeedTableViewController.h rename to Ryff/Classes/RYNewsfeedTableViewController.h diff --git a/Ryff/Newsfeed/RYNewsfeedTableViewController.m b/Ryff/Classes/RYNewsfeedTableViewController.m similarity index 98% rename from Ryff/Newsfeed/RYNewsfeedTableViewController.m rename to Ryff/Classes/RYNewsfeedTableViewController.m index 4ebf1b2..8b843c8 100644 --- a/Ryff/Newsfeed/RYNewsfeedTableViewController.m +++ b/Ryff/Classes/RYNewsfeedTableViewController.m @@ -22,7 +22,7 @@ @interface RYNewsfeedTableViewController () // iPad -@property (nonatomic, strong) RYAudioDeckViewController *audioDeckVC; +@property (nonatomic, strong) RYAudioDeckViewControllerOLD *audioDeckVC; @end @implementation RYNewsfeedTableViewController diff --git a/Ryff/Data/Objects/RYNotification.h b/Ryff/Classes/RYNotification.h similarity index 100% rename from Ryff/Data/Objects/RYNotification.h rename to Ryff/Classes/RYNotification.h diff --git a/Ryff/Data/Objects/RYNotification.m b/Ryff/Classes/RYNotification.m similarity index 100% rename from Ryff/Data/Objects/RYNotification.m rename to Ryff/Classes/RYNotification.m diff --git a/Ryff/Data/Services/RYNotificationsManager.h b/Ryff/Classes/RYNotificationsManager.h similarity index 100% rename from Ryff/Data/Services/RYNotificationsManager.h rename to Ryff/Classes/RYNotificationsManager.h diff --git a/Ryff/Data/Services/RYNotificationsManager.m b/Ryff/Classes/RYNotificationsManager.m similarity index 100% rename from Ryff/Data/Services/RYNotificationsManager.m rename to Ryff/Classes/RYNotificationsManager.m diff --git a/Ryff/UI/Profile/Notifications/RYNotificationsTableViewCell.h b/Ryff/Classes/RYNotificationsTableViewCell.h similarity index 100% rename from Ryff/UI/Profile/Notifications/RYNotificationsTableViewCell.h rename to Ryff/Classes/RYNotificationsTableViewCell.h diff --git a/Ryff/UI/Profile/Notifications/RYNotificationsTableViewCell.m b/Ryff/Classes/RYNotificationsTableViewCell.m similarity index 100% rename from Ryff/UI/Profile/Notifications/RYNotificationsTableViewCell.m rename to Ryff/Classes/RYNotificationsTableViewCell.m diff --git a/Ryff/UI/Profile/Notifications/RYNotificationsTableViewController.h b/Ryff/Classes/RYNotificationsTableViewController.h similarity index 100% rename from Ryff/UI/Profile/Notifications/RYNotificationsTableViewController.h rename to Ryff/Classes/RYNotificationsTableViewController.h diff --git a/Ryff/UI/Profile/Notifications/RYNotificationsTableViewController.m b/Ryff/Classes/RYNotificationsTableViewController.m similarity index 100% rename from Ryff/UI/Profile/Notifications/RYNotificationsTableViewController.m rename to Ryff/Classes/RYNotificationsTableViewController.m diff --git a/Ryff/Classes/RYNowPlayingView.swift b/Ryff/Classes/RYNowPlayingView.swift new file mode 100644 index 0000000..cbbd5c5 --- /dev/null +++ b/Ryff/Classes/RYNowPlayingView.swift @@ -0,0 +1,63 @@ +// +// RYNowPlayingView.swift +// Ryff +// +// Created by Christopher Laganiere on 9/7/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYNowPlayingView: UIView { + + private let imageView = UIImageView(frame: CGRectZero) + private let label = UILabel(frame: CGRectZero) + + override init(frame: CGRect) { + super.init(frame: frame) + + imageView.tintColor = RYStyleSheet.postActionColor() + imageView.contentMode = .ScaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(imageView) + + label.textColor = RYStyleSheet.postActionColor() + label.setDynamicStyle(TextStyle.Body, fontStyle: .Regular) + label.translatesAutoresizingMaskIntoConstraints = false + addSubview(label) + + NSLayoutConstraint.activateConstraints(subviewContraints()) + + style(nowPlaying: true) + } + + // MARK: Styling + + func style(nowPlaying nowPlaying: Bool) { + if (nowPlaying) { + label.text = "Now Playing" + imageView.image = UIImage(named: "audioPlaying") + } + else { + label.text = "Play" + imageView.image = UIImage(named: "play") + } + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func subviewContraints() -> [NSLayoutConstraint] { + let views = ["image": imageView, "text": label] + let metrics = ["padding": Constants.Post.AudioActionPadding, "relatedPadding": Constants.Global.RelatedElementPadding, "actionDimension": Constants.Post.AudioActionHeightSmall] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[image(actionDimension)]-(relatedPadding)-[text]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[image(actionDimension)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: views) + constraints += [NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: imageView, attribute: .CenterY, multiplier: 1.0, constant: 0.0)] + return constraints + } + +} diff --git a/Ryff/Classes/RYPlayControl.h b/Ryff/Classes/RYPlayControl.h new file mode 100644 index 0000000..ffea097 --- /dev/null +++ b/Ryff/Classes/RYPlayControl.h @@ -0,0 +1,22 @@ +// +// RYPlayControl.h +// Ryff +// +// Created by Christopher Laganiere on 7/24/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +@interface RYPlayControl : UIView + +@property (nonatomic, strong, nullable) UIColor *controlTintColor; +@property (nonatomic, strong, nullable) UIImage *centerImage; +@property (nonatomic) CGFloat centerImageInset; +@property (nonatomic) CGFloat strokeWidth; + +- (nonnull instancetype)initWithFrame:(CGRect)frame; +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated; + +- (void)hideProgress:(BOOL)hideProgress; +- (void)hideCenterImage:(BOOL)hideCenterImage; + +@end diff --git a/Ryff/Classes/RYPlayControl.m b/Ryff/Classes/RYPlayControl.m new file mode 100644 index 0000000..0205f32 --- /dev/null +++ b/Ryff/Classes/RYPlayControl.m @@ -0,0 +1,132 @@ +// +// RYPlayControl.m +// Ryff +// +// Created by Christopher Laganiere on 7/24/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +#import + +#import "RYPlayControl.h" + +// Custom UI +#import "RYStyleSheet.h" +#import "UIImage+Color.h" + +@interface RYPlayControl () + +@property (nonatomic, strong) CAShapeLayer *circleShape; +@property (nonatomic, strong) UIImageView *centerImageView; + +@property (nonatomic, strong) NSArray *configuredSubviewConstraints; + +@end + +@implementation RYPlayControl + +- (nonnull instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _controlTintColor = [RYStyleSheet audioActionColor]; + _centerImageInset = 5.0f; + _strokeWidth = 3.0f; + + _centerImageView = [[UIImageView alloc] initWithFrame:CGRectZero]; + _centerImageView.contentMode = UIViewContentModeScaleAspectFit; + [self addSubview:_centerImageView]; + + _configuredSubviewConstraints = [self subviewConstraints]; + [NSLayoutConstraint activateConstraints:self.configuredSubviewConstraints]; + + _circleShape = [self progressCircleWithFrame:self.frame strokeWidth:self.strokeWidth color:self.controlTintColor]; + [self.layer addSublayer:self.circleShape]; + } + return self; +} + +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated { + if (animated) { + [self animateFill:_circleShape toStrokeEnd:progress]; + } + else { + [CATransaction begin]; + [CATransaction setAnimationDuration:0.0]; + self.circleShape.strokeEnd = progress; + [CATransaction commit]; + } +} + +#pragma mark - Visibility + +- (void)hideProgress:(BOOL)hideProgress { + self.circleShape.hidden = YES; +} + +- (void)hideCenterImage:(BOOL)hideCenterImage { + self.centerImageView.hidden = hideCenterImage; +} + +#pragma mark - Properties + +- (void)setCenterImage:(UIImage * __nullable)centerImage { + [_centerImageView setImage:[centerImage colorImage:self.controlTintColor]]; +} + +- (void)setControlTintColor:(UIColor * __nullable)controlTintColor { + _controlTintColor = controlTintColor ?: [UIColor blueColor]; + [self.centerImageView setImage:[self.centerImageView.image colorImage:self.controlTintColor]]; + _circleShape.strokeColor = self.controlTintColor.CGColor; +} + +- (void)setCenterImageInset:(CGFloat)centerImageInset { + _centerImageInset = centerImageInset; + [self resetConstraints]; +} + +#pragma mark - Internal + +- (CAShapeLayer *)progressCircleWithFrame:(CGRect)frame strokeWidth:(CGFloat)strokeWidth color:(UIColor *)color { + CAShapeLayer *circleShape = [CAShapeLayer layer]; + CGPoint circleCenter = CGPointMake(frame.size.width/2, frame.size.height/2); + circleShape.path = [UIBezierPath bezierPathWithArcCenter:circleCenter radius:(frame.size.width-strokeWidth/2) / 2 startAngle:-M_PI_2 endAngle:-M_PI_2 + 2 * M_PI clockwise:YES].CGPath; + circleShape.strokeColor = color.CGColor; + circleShape.fillColor = nil; + circleShape.lineWidth = strokeWidth; + circleShape.strokeEnd = 0.0f; + return circleShape; +} + +- (void)animateFill:(CAShapeLayer*)shapeLayer toStrokeEnd:(CGFloat)strokeEnd { + [shapeLayer removeAnimationForKey:@"strokeEnd"]; + + CGFloat animationDuration = 0.1f; + + CABasicAnimation *fillStroke = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; + fillStroke.duration = animationDuration; + fillStroke.fromValue = @(shapeLayer.strokeEnd); + fillStroke.toValue = @(strokeEnd); + shapeLayer.strokeEnd = strokeEnd; + [shapeLayer addAnimation:fillStroke forKey:@"fill stroke"]; +} + +- (void)resetConstraints { + [NSLayoutConstraint deactivateConstraints:self.configuredSubviewConstraints]; + _configuredSubviewConstraints = [self subviewConstraints]; + [NSLayoutConstraint activateConstraints:self.configuredSubviewConstraints]; +} + +#pragma mark - Layout + +- (NSArray *)subviewConstraints { + NSDictionary *views = @{@"image": self.centerImageView}; + NSDictionary *metrics = @{@"inset": @(self.centerImageInset)}; + NSMutableArray *constraints = [[NSMutableArray alloc] initWithCapacity:16]; + + // Center image view + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(inset)-[image]-(inset)-|" options:0 metrics:metrics views:views]]; + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(inset)-[image]-(inset)-|" options:0 metrics:metrics views:views]]; + + return @[]; +} + +@end diff --git a/Ryff/Newsfeed/RYPost.h b/Ryff/Classes/RYPost.h similarity index 79% rename from Ryff/Newsfeed/RYPost.h rename to Ryff/Classes/RYPost.h index d4e2ab1..c3789f3 100644 --- a/Ryff/Newsfeed/RYPost.h +++ b/Ryff/Classes/RYPost.h @@ -8,9 +8,15 @@ #import +@class RYPost; @class RYUser; -@interface RYPost : NSObject +@protocol RYPostDelegate +- (void)postUpdated:(RYPost *)post; +- (void)postUpdateFailed:(RYPost *)post reason:(NSString *)reason; +@end + +@interface RYPost : NSObject @property (nonatomic, assign) NSInteger postId; @property (nonatomic, strong) RYUser *user; @@ -30,9 +36,16 @@ @property (nonatomic, strong) NSURL *riffHQURL; @property (nonatomic, strong) NSArray *tags; +// Delegate to notify when actions occur. +@property (nonatomic, weak) id delegate; + - (RYPost *)initWithPostId:(NSInteger)postId User:(RYUser *)user Content:(NSString*)content title:(NSString *)title riffURL:(NSURL*)riffURL duration:(CGFloat)duration dateCreated:(NSDate*)dateCreated isUpvoted:(BOOL)isUpvoted isStarred:(BOOL)isStarred upvotes:(NSInteger)upvotes; + (RYPost *)postWithDict:(NSDictionary*)postDict; + (NSArray *)postsFromDictArray:(NSArray *)dictArray; +// Actions + +- (void)toggleStarred; + @end diff --git a/Ryff/Classes/RYPost.m b/Ryff/Classes/RYPost.m new file mode 100644 index 0000000..30e4729 --- /dev/null +++ b/Ryff/Classes/RYPost.m @@ -0,0 +1,241 @@ +// +// RYPost.m +// Ryff +// +// Created by Christopher Laganiere on 4/12/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +#import "RYPost.h" + +// Data Managers +#import "RYServices.h" + +// Data Objects +#import "RYUser.h" + +// Categories +#import "NSDictionary+Safety.h" +#import "NSMutableDictionary+Safety.h" + +// Update Notification Keys +static NSString *PostUpdatedNotificationKey = @"PostUpdatedNotificationKey"; +static NSString *PostNotificationKeyUserID = @"postId"; +static NSString *PostNotificationKeyUserData = @"post"; + +// Dictionary Representation Keys +static NSString *PostDictionaryKeyID = @"id"; +static NSString *PostDictionaryKeyUser = @"user"; +static NSString *PostDictionaryKeyContent = @"content"; +static NSString *PostDictionaryKeyTitle = @"title"; +static NSString *PostDictionaryKeyDuration = @"duration"; +static NSString *PostDictionaryKeyRiffURL = @"riff_url"; +static NSString *PostDictionaryKeyDateCreated = @"date_created"; +static NSString *PostDictionaryKeyIsUpvoted = @"is_upvoted"; +static NSString *PostDictionaryKeyUpvotes = @"upvotes"; +static NSString *PostDictionaryKeyIsStarred = @"is_starred"; +static NSString *PostDictionaryKeyImageURL = @"image_url"; +static NSString *PostDictionaryKeyImageMediumURL = @"image_medium_url"; +static NSString *PostDictionaryKeyImageSmallURL = @"image_small_url"; +static NSString *PostDictionaryKeyRiffHQURL = @"riff_hq_url"; +static NSString *PostDictionaryKeyTags = @"tags"; + +@interface RYPost () + +@end + +@implementation RYPost + +- (instancetype)init { + if (self = [super init]) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(postUpdatedNotification:) name:PostUpdatedNotificationKey object:nil]; + } + return self; +} + +- (RYPost *)initWithPostId:(NSInteger)postId User:(RYUser *)user Content:(NSString*)content title:(NSString *)title riffURL:(NSURL*)riffURL duration:(CGFloat)duration dateCreated:(NSDate*)dateCreated isUpvoted:(BOOL)isUpvoted isStarred:(BOOL)isStarred upvotes:(NSInteger)upvotes +{ + if (self = [self init]) + { + _postId = postId; + _user = user; + _content = content; + _title = title; + _duration = duration; + _riffURL = riffURL; + _dateCreated = dateCreated; + _isUpvoted = isUpvoted; + _upvotes = upvotes; + _isStarred = isStarred; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + ++ (RYPost *)postWithDict:(NSDictionary*)postDict +{ + NSNumber *postId = [postDict objectForKey:@"id"]; + + NSDictionary *userDict = [postDict objectForKey:@"user"]; + RYUser *user = [RYUser userFromDict:userDict]; + + NSString *title = [postDict objectForKey:@"title"]; + NSString *content = [postDict objectForKey:@"content"]; + + NSURL *riffURL = [NSURL URLWithString:[postDict objectForKey:@"riff_url"]]; + CGFloat duration = [[postDict objectForKey:@"duration"] floatValue]; + + NSString *date_created = [userDict objectForKey:@"date_created"]; + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; + NSDate *date = [dateFormatter dateFromString:date_created]; + + BOOL isUpvoted = [postDict[@"is_upvoted"] boolValue]; + NSInteger upvotes = [postDict[@"upvotes"] intValue]; + + BOOL isStarred = [postDict[@"is_starred"] boolValue]; + + RYPost *newPost = [[RYPost alloc] initWithPostId:[postId integerValue] User:user Content:content title:title riffURL:riffURL duration:duration dateCreated:date isUpvoted:isUpvoted isStarred:isStarred upvotes:upvotes]; + + if (postDict[@"image_url"] && ((NSString*)postDict[@"image_url"]).length > 0) + newPost.imageURL = [NSURL URLWithString:postDict[@"image_url"]]; + if (postDict[@"image_medium_url"] && [postDict[@"image_medium_url"] length] > 0) + newPost.imageMediumURL = [NSURL URLWithString:postDict[@"image_medium_url"]]; + if (postDict[@"image_small_url"] && [postDict[@"image_small_url"] length] > 0) + newPost.imageSmallURL = [NSURL URLWithString:postDict[@"image_small_url"]]; + + if (postDict[@"riff_hq_url"] && [postDict[@"riff_hq_url"] length] > 0) + newPost.riffHQURL = [NSURL URLWithString:postDict[@"riff_hq_url"]]; + + return newPost; +} + ++ (NSArray *)postsFromDictArray:(NSArray *)dictArray +{ + NSMutableArray *posts = [[NSMutableArray alloc] init]; + + for (NSDictionary *postDict in dictArray) + { + RYPost *post = [RYPost postWithDict:postDict]; + [posts addObject:post]; + } + + return posts; +} + +#pragma mark - Actions + +- (void)toggleStarred { + [[RYServices sharedInstance] star:!self.isStarred post:self forDelegate:self]; +} + +#pragma mark - ActionDelegate + +- (void) upvoteSucceeded:(RYPost*)updatedPost { + [self.delegate postUpdated:updatedPost]; + + NSDictionary *userInfo = @{PostNotificationKeyUserID: @(updatedPost.postId), PostNotificationKeyUserData: [updatedPost dictionaryRepresentation]}; + [[NSNotificationCenter defaultCenter] postNotificationName:PostUpdatedNotificationKey object:nil userInfo:userInfo]; +} + +- (void) starSucceeded:(RYPost *)updatedPost { + [self.delegate postUpdated:updatedPost]; + + NSDictionary *userInfo = @{PostNotificationKeyUserID: @(updatedPost.postId), PostNotificationKeyUserData: [updatedPost dictionaryRepresentation]}; + [[NSNotificationCenter defaultCenter] postNotificationName:PostUpdatedNotificationKey object:nil userInfo:userInfo]; +} + +- (void) upvoteFailed:(NSString*)reason post:(RYPost *)oldPost { + NSLog(@"Upvote post %ld failed: %@", self.postId, reason); + [self.delegate postUpdateFailed:oldPost reason:reason]; +} + +- (void) starFailed:(NSString *)reason post:(RYPost *)oldPost { + NSLog(@"Star post %ld failed: %@", self.postId, reason); + [self.delegate postUpdateFailed:oldPost reason:reason]; +} + +#pragma mark - Notifications + +- (void)postUpdatedNotification:(NSNotification *)notification { + NSNumber *postId = [notification.userInfo safeObjectForKey:PostNotificationKeyUserID]; + if (postId && postId.integerValue == self.postId) { + // Data updated, should copy changes. + NSDictionary *otherDict = [notification.userInfo safeObjectForKey:PostNotificationKeyUserData]; + if (otherDict) { + [self copyFromDictionary:otherDict]; + [self.delegate postUpdated:self]; + } + } +} + +#pragma mark - Copying + +- (NSDictionary *)dictionaryRepresentation { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:16]; + [dictionary safelySetObject:@(self.postId) forKey:PostDictionaryKeyID]; + [dictionary safelySetObject:self.content forKey:PostDictionaryKeyContent]; + [dictionary safelySetObject:self.title forKey:PostDictionaryKeyTitle]; + [dictionary safelySetObject:self.riffURL forKey:PostDictionaryKeyRiffURL]; + [dictionary safelySetObject:@(self.duration) forKey:PostDictionaryKeyDuration]; + [dictionary safelySetObject:self.dateCreated forKey:PostDictionaryKeyDateCreated]; + [dictionary safelySetObject:@(self.isUpvoted) forKey:PostDictionaryKeyIsUpvoted]; + [dictionary safelySetObject:@(self.isStarred) forKey:PostDictionaryKeyIsStarred]; + [dictionary safelySetObject:@(self.upvotes) forKey:PostDictionaryKeyUpvotes]; + [dictionary safelySetObject:self.riffHQURL forKey:PostDictionaryKeyRiffHQURL]; + [dictionary safelySetObject:self.imageURL forKey:PostDictionaryKeyImageURL]; + [dictionary safelySetObject:self.imageMediumURL forKey:PostDictionaryKeyImageMediumURL]; + [dictionary safelySetObject:self.imageSmallURL forKey:PostDictionaryKeyImageSmallURL]; + [dictionary safelySetObject:[RYTag dictionaryRepresentationForTags:self.tags] forKey:PostDictionaryKeyTags]; + return dictionary; +} + +- (void)copyFromDictionary:(NSDictionary *)dictionaryRepresentation { + self.postId = [[dictionaryRepresentation safeObjectForKey:PostDictionaryKeyID] integerValue]; + self.content = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyContent]; + self.title = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyTitle]; + self.riffURL = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyRiffURL]; + self.duration = [[dictionaryRepresentation safeObjectForKey:PostDictionaryKeyDuration] floatValue]; + self.dateCreated = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyDateCreated]; + self.isUpvoted = [[dictionaryRepresentation safeObjectForKey:PostDictionaryKeyIsUpvoted] boolValue]; + self.isStarred = [[dictionaryRepresentation safeObjectForKey:PostDictionaryKeyIsStarred] boolValue]; + self.upvotes = [[dictionaryRepresentation safeObjectForKey:PostDictionaryKeyUpvotes] integerValue]; + self.riffHQURL = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyRiffHQURL]; + self.imageURL = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyImageURL]; + self.imageMediumURL = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyImageMediumURL]; + self.imageSmallURL = [dictionaryRepresentation safeObjectForKey:PostDictionaryKeyImageSmallURL]; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone +{ + RYPost *other = [[RYPost alloc] init]; + NSDictionary *dictionaryRepresentation = [self dictionaryRepresentation]; + [other copyFromDictionary:dictionaryRepresentation]; + return other; +} + +#pragma mark - NSObject + +- (BOOL) isEqual:(id)object +{ + BOOL equal = NO; + if ([object isKindOfClass:[RYPost class]]) + { + RYPost *other = (RYPost *)object; + if (other.postId == self.postId) + equal = YES; + } + return equal; +} + +- (NSUInteger)hash +{ + return _postId; +} + +@end diff --git a/Ryff/Classes/RYPostDetailsViewController.swift b/Ryff/Classes/RYPostDetailsViewController.swift new file mode 100644 index 0000000..f35be87 --- /dev/null +++ b/Ryff/Classes/RYPostDetailsViewController.swift @@ -0,0 +1,272 @@ +// +// RYPostDetailsViewController.swift +// Ryff +// +// Created by Chris Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYPostDetailsViewController: UIViewController, RYPostDelegate, RYUserDelegate { + + private var post: RYPost { + didSet { + post.delegate = self + post.user.delegate = self + } + } + + private let scrollView = UIScrollView(frame: CGRectZero) + private let containerView = UIView(frame: CGRectZero) + + private let usernameLabel = UILabel(frame: CGRectZero) + private let postTitleLabel = UILabel(frame: CGRectZero) + private let postImageView = UIImageView(frame: CGRectZero) + private let nowPlayingView = RYNowPlayingView(frame: CGRectZero) + private let addToPlaylistView = RYAddToPlaylistView(frame: CGRectZero) + private let postDescriptionTextView = RYPostTextView(frame: CGRectZero) + private let followLabel = UILabel(frame: CGRectZero) + private let starredView = RYStarredView(frame: CGRectZero) + + required init(post: RYPost) { + self.post = post + super.init(nibName: nil, bundle: nil) + post.delegate = self + post.user.delegate = self + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: LifeCycle + + override func viewDidLoad() { + super.viewDidLoad() + + // Styling + + view.backgroundColor = RYStyleSheet.darkBackgroundColor() + + scrollView.backgroundColor = UIColor.clearColor() + scrollView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(scrollView) + + containerView.backgroundColor = UIColor.clearColor() + containerView.translatesAutoresizingMaskIntoConstraints = false + scrollView.addSubview(containerView) + + usernameLabel.textColor = UIColor.lightTextColor() + usernameLabel.setDynamicStyle(TextStyle.Subheadline, fontStyle: .Bold) + usernameLabel.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(usernameLabel) + + postTitleLabel.textColor = UIColor.whiteColor() + postTitleLabel.setDynamicStyle(TextStyle.Subheadline, fontStyle: .Bold) + postTitleLabel.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(postTitleLabel) + + postImageView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(postImageView) + + nowPlayingView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(nowPlayingView) + + addToPlaylistView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(addToPlaylistView) + + postDescriptionTextView.setDynamicStyle(TextStyle.Body, fontStyle: .Regular) + postDescriptionTextView.textContainer.maximumNumberOfLines = 0 + postDescriptionTextView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(postDescriptionTextView) + + followLabel.setDynamicStyle(TextStyle.Body, fontStyle: .Bold) + followLabel.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(followLabel) + + starredView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(starredView) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + + // Actions + + followLabel.userInteractionEnabled = true + let followGesture = UITapGestureRecognizer(target: self, action: Selector("didTapFollow:")) + followLabel.addGestureRecognizer(followGesture) + + let starGesture = UITapGestureRecognizer(target: self, action: Selector("didTapStarred:")) + starredView.addGestureRecognizer(starGesture) + + let nowPlayingGesture = UITapGestureRecognizer(target: self, action: Selector("didTapNowPlaying:")) + nowPlayingView.addGestureRecognizer(nowPlayingGesture) + + let addToPlaylistGesture = UITapGestureRecognizer(target: self, action: Selector("didTapAddToPlaylist:")) + addToPlaylistView.addGestureRecognizer(addToPlaylistGesture) + + } + + override func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + styleForPost(post) + updateNowPlaying() + updateAddToPlaylist() + NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("currentlyPlayingChanged:"), name: RYAudioDeck.NotificationCurrentlyPlayingChanged, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("playlistChanged:"), name: RYAudioDeck.NotificationPlaylistChanged, object: nil) + } + + override func viewWillDisappear(animated: Bool) { + super.viewWillDisappear(animated) + NSNotificationCenter.defaultCenter().removeObserver(self) + } + + // MARK: Actions + + func didTapFollow(tapGesture: UITapGestureRecognizer) { + styleFollowing(!post.user.isFollowing) + post.user.toggleFollowing() + } + + func didTapStarred(tapGesture: UITapGestureRecognizer) { + starredView.style(!post.isStarred) + post.toggleStarred() + } + + func didTapNowPlaying(tapGesture: UITapGestureRecognizer) { + if RYAudioDeck.sharedAudioDeck.playing { + RYAudioDeck.sharedAudioDeck.pause() + } + else { + RYAudioDeck.sharedAudioDeck.play() + } + } + + func didTapAddToPlaylist(tapGesture: UITapGestureRecognizer) { + RYAudioDeck.sharedAudioDeck.defaultPlaylist.addPost(post) + } + + // MARK: RYPostDelegate + + func postUpdated(post: RYPost!) { + self.post = post + styleForPost(post) + } + + func postUpdateFailed(post: RYPost!, reason: String!) { + styleForPost(post) + } + + // MARK: Notifications + + func playlistChanged(notification: NSNotification) { + updateAddToPlaylist() + } + + func currentlyPlayingChanged(notification: NSNotification) { + updateNowPlaying() + } + + // MARK: RYUserDelegate + + func userUpdated(user: RYUser!) { + user.delegate = self + post.user = user + styleForPost(post) + } + + func userUpdateFailed(user: RYUser!, reason: String!) { + styleForPost(post) + } + + // MARK: Styling + + private func styleForPost(post: RYPost) { + self.title = post.title + + usernameLabel.text = post.user.username + postTitleLabel.text = post.title + postDescriptionTextView.text = post.content + styleFollowing(post.user.isFollowing) + starredView.style(post.isStarred, text: "\(post.upvotes)") + + if let imageURL = post.imageURL { + postImageView.sd_setImageWithURL(imageURL) + } + } + + private func styleFollowing(following: Bool) { + if (following) { + followLabel.text = "Unfollow" + followLabel.textColor = UIColor.lightTextColor() + } + else { + followLabel.text = "Follow" + followLabel.textColor = UIColor.whiteColor() + } + } + + /** + The Audio Deck's current playlist changed, should update addToPlaylistView. + */ + private func updateAddToPlaylist() { + // Hide addToPlaylistView if in playlist. + addToPlaylistView.hidden = RYAudioDeck.sharedAudioDeck.currentPlaylist?.hasPost(post) ?? false + } + + /** + The Audio Deck's currently playing post changed, should update nowPlayingView. + */ + private func updateNowPlaying() { + if RYAudioDeck.sharedAudioDeck.currentlyPlaying?.isEqual(post) ?? false { + nowPlayingView.hidden = false + nowPlayingView.style(nowPlaying: RYAudioDeck.sharedAudioDeck.playing) + } + else { + nowPlayingView.hidden = true + } + } + + private func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["scrollView": scrollView, "container": containerView, "username": usernameLabel, "title": postTitleLabel, "image": postImageView, "nowPlaying": nowPlayingView, "addToPlaylist": addToPlaylistView, "description": postDescriptionTextView, "follow": followLabel, "starred": starredView] + let metrics = ["padding": Constants.Global.ElementPadding, "relatedPadding": Constants.Global.RelatedElementPadding, "contentWidth": Constants.Global.ContentMaximumWidth] + + var constraints: [NSLayoutConstraint] = [] + + // Scroll View + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + + // Container View + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=0,==0@900)-[container(<=contentWidth)]-(>=0,==0@900)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: containerView, attribute: .CenterX, relatedBy: .Equal, toItem: containerView.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + + // Vertical Layout + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[username]-(padding)-[image]-(relatedPadding)-[nowPlaying]-(relatedPadding)-[description]-(>=padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Top Labels + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[username]-(padding)-[title]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: postTitleLabel, attribute: .CenterY, relatedBy: .Equal, toItem: usernameLabel, attribute: .CenterY, multiplier: 1.0, constant: 0.0)] + + // Post Image + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[image]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: postImageView, attribute: .Height, relatedBy: .Equal, toItem: postImageView, attribute: .Width, multiplier: 1.0, constant: 0.0)] + + // Now Playing and Add to Playlist + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(relatedPadding)-[nowPlaying]-(>=relatedPadding)-[addToPlaylist]-(relatedPadding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: addToPlaylistView, attribute: .Top, relatedBy: .Equal, toItem: nowPlayingView, attribute: .Top, multiplier: 1.0, constant: 0.0)] + + // Follow + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[description]-(>=padding,==padding@900)-[follow]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: followLabel, attribute: .Top, relatedBy: .Equal, toItem: postDescriptionTextView, attribute: .Top, multiplier: 1.0, constant: 0.0)] + + // Starred + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:[description]-(>=padding,==padding@901)-[starred]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[follow]-(padding)-[starred]-(>=padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + return constraints + } + +} diff --git a/Ryff/Classes/RYPostTableViewCell.swift b/Ryff/Classes/RYPostTableViewCell.swift new file mode 100644 index 0000000..4372601 --- /dev/null +++ b/Ryff/Classes/RYPostTableViewCell.swift @@ -0,0 +1,205 @@ +// +// RYPostTableViewCell.swift +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit +import SDWebImage + +protocol RYPostTableViewCellDelegate: class { + func didTapUser(postCell: RYPostTableViewCell) + func didTapPost(postCell: RYPostTableViewCell) + func didTapStarred(postCell: RYPostTableViewCell) +} + +class RYPostTableViewCell: UITableViewCell { + + /// Delegate to notify when actions are attempted. + private weak var delegate: RYPostTableViewCellDelegate? + + /// Specifies whether the post for which this cell was last styled was starred. + private var postStarred: Bool = false + + private let containerView = UIView(frame: CGRectZero) + + private let topDetailsView = UIView(frame: CGRectZero) + private let topEffectsView = RYFadingVisualEffectView(effect: UIBlurEffect(style: .Dark), direction: .Top) + private let usernameLabel = UILabel(frame: CGRectZero) + private let postTitleLabel = UILabel(frame: CGRectZero) + + private let postImageView = UIImageView(frame: CGRectZero) + + private let bottomDetailsView = UIView(frame: CGRectZero) + private let bottomEffectsView = RYFadingVisualEffectView(effect: UIBlurEffect(style: .Dark), direction: .Bottom) + private let postDescriptionTextView = RYPostTextView(frame: CGRectZero) + private let starredView = RYStarredView(frame: CGRectZero) + + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + // Styling + + backgroundColor = UIColor.clearColor() + + containerView.translatesAutoresizingMaskIntoConstraints = false + containerView.backgroundColor = UIColor.clearColor() + addSubview(containerView) + + postImageView.backgroundColor = RYStyleSheet.tabBarColor() + postImageView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(postImageView) + + topDetailsView.backgroundColor = UIColor.clearColor() + topDetailsView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(topDetailsView) + + topEffectsView.translatesAutoresizingMaskIntoConstraints = false + topDetailsView.addSubview(topEffectsView) + + usernameLabel.textColor = UIColor.lightTextColor() + usernameLabel.setDynamicStyle(TextStyle.Subheadline, fontStyle: .Bold) + usernameLabel.translatesAutoresizingMaskIntoConstraints = false + topDetailsView.addSubview(usernameLabel) + + postTitleLabel.textColor = UIColor.whiteColor() + postTitleLabel.textAlignment = .Right + postTitleLabel.setDynamicStyle(TextStyle.Subheadline, fontStyle: .Bold) + postTitleLabel.translatesAutoresizingMaskIntoConstraints = false + topDetailsView.addSubview(postTitleLabel) + + bottomDetailsView.backgroundColor = UIColor.clearColor() + bottomDetailsView.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(bottomDetailsView) + + bottomEffectsView.translatesAutoresizingMaskIntoConstraints = false + bottomDetailsView.addSubview(bottomEffectsView) + + postDescriptionTextView.setDynamicStyle(TextStyle.Body, fontStyle: .Regular) + postDescriptionTextView.translatesAutoresizingMaskIntoConstraints = false + bottomDetailsView.addSubview(postDescriptionTextView) + + starredView.translatesAutoresizingMaskIntoConstraints = false + bottomDetailsView.addSubview(starredView) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + + // Actions + + usernameLabel.userInteractionEnabled = true + let userTapGesture = UITapGestureRecognizer(target: self, action: Selector("didTapUser:")) + usernameLabel.addGestureRecognizer(userTapGesture) + + postTitleLabel.userInteractionEnabled = true + let postTitleTapGesture = UITapGestureRecognizer(target: self, action: Selector("didTapPost:")) + postTitleLabel.addGestureRecognizer(postTitleTapGesture) + + postImageView.userInteractionEnabled = true + let postTapGesture = UITapGestureRecognizer(target: self, action: Selector("didTapPost:")) + postImageView.addGestureRecognizer(postTapGesture) + + starredView.userInteractionEnabled = true + let starredTapGesture = UITapGestureRecognizer(target: self, action: Selector("didTapStarred:")) + starredView.addGestureRecognizer(starredTapGesture) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Styling + + class func heightForPost(post: RYPost) -> CGFloat { + // if let _ = post.imageURL { + return Constants.Global.ContentMaximumWidth + Constants.Post.FooterHeight + // } + // else { + // return PostCellConstants.MinimumImageHeight + PostCellConstants.FooterHeight + // } + } + + func styleWithPost(post: RYPost, delegate: RYPostTableViewCellDelegate) { + self.delegate = delegate + + usernameLabel.text = post.user.username + postTitleLabel.text = post.title + postDescriptionTextView.text = post.content + postStarred = post.isStarred + starredView.style(postStarred, text: "\(post.upvotes)") + + if let _ = post.imageURL { + postImageView.sd_setImageWithURL(post.imageURL, placeholderImage: nil) + } + else { + postImageView.image = nil + } + self.setNeedsLayout() + self.layoutIfNeeded() + } + + // MARK: Actions + + func didTapUser(tapGesture: UITapGestureRecognizer) { + delegate?.didTapUser(self) + } + + func didTapPost(tapGesture: UITapGestureRecognizer) { + delegate?.didTapPost(self) + } + + func didTapStarred(tapGesture: UITapGestureRecognizer) { + starredView.style(!postStarred) + delegate?.didTapStarred(self) + } + + // MARK: Layout + + private func subviewConstraints() -> [NSLayoutConstraint] { + let metrics = ["maxWidth": Constants.Global.ContentMaximumWidth, "padding": Constants.Global.ElementPadding, "footerHeight": Constants.Post.FooterHeight] + let viewsDict = ["container": containerView, "topView": topDetailsView, "topEffects": topEffectsView, "username": usernameLabel, "title": postTitleLabel, "postImage": postImageView, "bottomView": bottomDetailsView, "bottomEffects": bottomEffectsView, "description": postDescriptionTextView, "starred": starredView] + + var constraints: [NSLayoutConstraint] = [] + + // Container + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=0,==0@900)-[container(<=maxWidth,==maxWidth@900)]-(>=0,==0@900)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: containerView, attribute: .CenterX, relatedBy: .Equal, toItem: containerView.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Top Details View + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[topView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[topView]", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Top Effects View + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[topEffects]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[topEffects]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Top Details Subviews + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[username]-(padding)-[title]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[username]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[title]", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Image + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[postImage]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[postImage]-(footerHeight)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: postImageView, attribute: .Height, relatedBy: .Equal, toItem: postImageView, attribute: .Width, multiplier: 1.0, constant: 0.0)] + + // Bottom Details + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[bottomView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[bottomView]-(footerHeight)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Bottom Effects View + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[bottomEffects]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[bottomEffects]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Bottom Details Subviews + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[description]-(padding)-[starred]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[description]-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=0)-[starred]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + return constraints + } + +} diff --git a/Ryff/Classes/RYPostTextView.swift b/Ryff/Classes/RYPostTextView.swift new file mode 100644 index 0000000..61b9189 --- /dev/null +++ b/Ryff/Classes/RYPostTextView.swift @@ -0,0 +1,29 @@ +// +// RYPostTextView.swift +// Ryff +// +// Created by Chris Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYPostTextView: UITextView { + + override init(frame: CGRect, textContainer: NSTextContainer?) { + super.init(frame: frame, textContainer: textContainer) + backgroundColor = UIColor.clearColor() + textColor = UIColor.lightGrayColor() + editable = false + self.textContainer.maximumNumberOfLines = 3 + self.textContainer.lineBreakMode = .ByTruncatingTail + scrollEnabled = false + setContentCompressionResistancePriority(UILayoutPriority.Low, forAxis: .Horizontal) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/Ryff/Classes/RYPostsDataSource.h b/Ryff/Classes/RYPostsDataSource.h new file mode 100644 index 0000000..d00d29c --- /dev/null +++ b/Ryff/Classes/RYPostsDataSource.h @@ -0,0 +1,68 @@ +// +// RYPostsDataSource.h +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +@import Foundation; + +// Data Managers +#import "RYServices.h" + +@class RYPost; + +@protocol RYPostsDataSourceDelegate +- (void)postUpdatedAtIndex:(NSInteger)postIndex; +- (void)contentUpdated; +- (void)contentFailedToUpdate; +@end + +@protocol RYContentFeedDataSource +- (void)fetchContent:(NSInteger)page; +@end + +@interface RYPostsDataSource : NSObject + +@property (nonatomic, weak, nullable) id delegate; + +// Posts + +/** + * Number of posts available. + */ +- (NSInteger)numberOfPosts; + +/** + * Retrieves a post at the given index if possible, or nil. + * + * @param postIndex NSInteger index of the requested post. + * + * @return `RYPost` object, or nil. + */ +- (RYPost * __nullable)postAtIndex:(NSInteger)postIndex; + +/** + * Should load more content in addition to existing content by fetching more posts from + * the server beginning at one past the last page requested. + */ +- (void)loadMoreContent; + +/** + * Should refresh content by replacing existing content with new posts from the server. + * Will fetch posts starting at page 1. + */ +- (void)refreshContent; + + +// Actions + +/** + * Toggle starred value on the supplied post. + * + * @param post `RYPost` object to attempt to star. + */ +- (void)toggleStarred:(RYPost * __nullable)post; + +@end diff --git a/Ryff/Classes/RYPostsDataSource.m b/Ryff/Classes/RYPostsDataSource.m new file mode 100644 index 0000000..6e1f4b3 --- /dev/null +++ b/Ryff/Classes/RYPostsDataSource.m @@ -0,0 +1,135 @@ +// +// RYPostsDataSource.m +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYPostsDataSource.h" + +@interface RYPostsDataSource () + +@property (nonatomic) NSArray/**/ *feedItems; + +// Last page of content loaded. Should load next page if fetching more content. +@property (nonatomic, assign) NSInteger currentPage; + +@end + +@implementation RYPostsDataSource + +- (instancetype)init { + if (self = [super init]) { + _feedItems = @[]; + } + return self; +} + +- (NSInteger)numberOfPosts { + return self.feedItems.count; +} + +- (RYPost * __nullable)postAtIndex:(NSInteger)postIndex { + if (postIndex >= 0 && postIndex < self.feedItems.count) { + return self.feedItems[postIndex]; + } + return nil; +} + +- (void)loadMoreContent { + [self fetchContent:(_currentPage + 1)]; +} + +- (void)refreshContent { + [self fetchContent:1]; +} + +#pragma mark - Actions + +- (void)toggleStarred:(RYPost * __nullable)post { + [post toggleStarred]; +} + +#pragma mark - Post Delegate + +- (void)postSucceeded:(NSArray *)posts page:(NSNumber *)page { + BOOL shouldClearOldPosts = (!page || page.integerValue <= 1); + [self addPosts:posts clearOldPosts:shouldClearOldPosts]; + + _currentPage = page.integerValue; + [_delegate contentUpdated]; +} + +- (void)postFailed:(NSString *)reason page:(NSNumber *)page { + [_delegate contentFailedToUpdate]; +} + +#pragma mark - RYPostDelegate + +- (void)postUpdated:(RYPost *)post { + [self reloadPost:post]; +} + +- (void)postUpdateFailed:(RYPost *)post reason:(NSString *)reason { + if ([self.feedItems containsObject:post]) { + [self.delegate postUpdatedAtIndex:[self.feedItems indexOfObject:post]]; + } +} + +#pragma mark - Private + +/** + * Start tracking posts by adding them to self.feedItems. Will set delegate on all posts to self. + * + * @param posts NSArray of `RYPost` objects. + * @param clearOldPosts Should delete old posts to refresh content, instead of just adding to existing content. + */ +- (void)addPosts:(NSArray *)posts clearOldPosts:(BOOL)clearOldPosts { + for (RYPost *post in posts) { + post.delegate = self; + } + + if (clearOldPosts) { + self.feedItems = posts; + } + else { + self.feedItems = [self.feedItems arrayByAddingObjectsFromArray:posts]; + } +} + +/** + * Fetch `RYPost` content from server from the given page offset. + * Should be implemented by subclasses. Calling this method on `RYPostsDataSource` is undefined. + * + * @param page Page offset from start. + */ +- (void)fetchContent:(NSInteger)page { +// NSAssert(NO, @"Must subclass RYPostsDataSource to specify appropriate fetch action"); +} + +/** + * Search through self.feedItems and try to find an old post with the same postId as the supplied post. + * If found, replace with the updated post and notify self.delegate that the post changed. + * + * @param post `RYPost` to attempt to reload. + */ +- (void)reloadPost:(RYPost *)post +{ + for (NSInteger postIndex = 0; postIndex < self.feedItems.count; postIndex++) + { + RYPost *oldPost = self.feedItems[postIndex]; + if (oldPost.postId == post.postId) + { + // Found the old post, should replace it. + post.delegate = self; + NSMutableArray *mutableFeedItems = [self.feedItems mutableCopy]; + [mutableFeedItems replaceObjectAtIndex:postIndex withObject:post]; + _feedItems = mutableFeedItems; + + // Notify delegate. + [self.delegate postUpdatedAtIndex:postIndex]; + } + } +} +@end diff --git a/Ryff/Classes/RYPostsViewController.swift b/Ryff/Classes/RYPostsViewController.swift new file mode 100644 index 0000000..f4402d5 --- /dev/null +++ b/Ryff/Classes/RYPostsViewController.swift @@ -0,0 +1,180 @@ +// +// RYPostsViewController.swift +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +@objc class RYPostsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, RYPostsDataSourceDelegate, RYPostTableViewCellDelegate { + + private let RYPostTableViewCellReuseIdentifier = "postCellReuseIdentifier" + + internal var riffSection = 0 + internal var dataSource: RYPostsDataSource? + + internal let tableView = UITableView(frame: CGRectZero, style: .Grouped) + private let refreshControl: RYRefreshControl + + required init(dataSource: RYPostsDataSource?) { + refreshControl = RYRefreshControl(inScrollView: tableView) + super.init(nibName: nil, bundle: nil) + if let dataSource = dataSource { + configure(dataSource) + } + + refreshControl.addTarget(self, action: Selector("refreshContent:"), forControlEvents: .ValueChanged) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.dataSource = self + tableView.delegate = self + tableView.backgroundColor = RYStyleSheet.lightBackgroundColor() + tableView.separatorStyle = .None + tableView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(tableView) + tableView.registerClass(RYPostTableViewCell.self, forCellReuseIdentifier: RYPostTableViewCellReuseIdentifier) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + dataSource?.refreshContent() + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + tableView.reloadData() + } + + func configure(dataSource: RYPostsDataSource) { + self.dataSource = dataSource + dataSource.delegate = self + tableView.reloadData() + } + + // MARK: RYPostTableViewCellDelegate + + func didTapUser(postCell: RYPostTableViewCell) { + if let post = postForIndexPath(tableView.indexPathForCell(postCell)) { + // Check if already looking at that user. + if let userFeed = dataSource as? RYUserFeedDataSource { + if (userFeed.user.userId == post.user.userId) { + return + } + } + pushProfileViewController(post.user) + } + } + + func didTapPost(postCell: RYPostTableViewCell) { + if let post = postForIndexPath(tableView.indexPathForCell(postCell)) { + pushPostDetailsViewController(post) + } + } + + func didTapStarred(postCell: RYPostTableViewCell) { + if let post = postForIndexPath(tableView.indexPathForCell(postCell)) { + dataSource?.toggleStarred(post) + } + } + + private func postForIndexPath(indexPath: NSIndexPath?) -> RYPost? { + if let postIndex = indexPath?.row, post = dataSource?.postAtIndex(postIndex) { + return post + } + return nil + } + + // MARK: RYPostsDataSourceDelegate + + func contentUpdated() { + refreshControl.endRefreshing() + tableView.reloadData() + } + + func contentFailedToUpdate() { + refreshControl.endRefreshing() + } + + func postUpdatedAtIndex(postIndex: Int) { + let indexPath = NSIndexPath(forItem: postIndex, inSection: riffSection) + tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } + + // MARK: Layout + + private func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["tableView": tableView] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[tableView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + return constraints + } + + // MARK: Actions + + func refreshContent(refreshControl: RYRefreshControl) { + dataSource?.refreshContent() + } + + func loadMoreContent(loadMoreControl: RYLoadMoreControl) { + dataSource?.loadMoreContent() + } + + // MARK: UITableViewDataSource + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if section == riffSection { + return dataSource?.numberOfPosts() ?? 0 + } + else { + return 0 + } + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + if indexPath.section == riffSection { + let cell = tableView.dequeueReusableCellWithIdentifier(RYPostTableViewCellReuseIdentifier, forIndexPath: indexPath) + cell.selectionStyle = .None + return cell + } + else { + assert(false, "Error: PostsViewController asked to supply tableview cell for undefined section") + return UITableViewCell() + } + } + + // MARK: UITableViewDelegate + func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + if indexPath.section == riffSection { + if let post = dataSource?.postAtIndex(indexPath.row) { + return RYPostTableViewCell.heightForPost(post) + } + } + return 0.0 + } + + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return UITableViewAutomaticDimension + } + + func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + if indexPath.section == riffSection { + if let postCell = cell as? RYPostTableViewCell, post = dataSource?.postAtIndex(indexPath.row) { + postCell.styleWithPost(post, delegate: self) + } + } + } + +} diff --git a/Ryff/UI/Profile/RYProfileInfoTableViewCell.h b/Ryff/Classes/RYProfileInfoTableViewCell.h similarity index 100% rename from Ryff/UI/Profile/RYProfileInfoTableViewCell.h rename to Ryff/Classes/RYProfileInfoTableViewCell.h diff --git a/Ryff/UI/Profile/RYProfileInfoTableViewCell.m b/Ryff/Classes/RYProfileInfoTableViewCell.m similarity index 93% rename from Ryff/UI/Profile/RYProfileInfoTableViewCell.m rename to Ryff/Classes/RYProfileInfoTableViewCell.m index 3527870..2c1e8e5 100644 --- a/Ryff/UI/Profile/RYProfileInfoTableViewCell.m +++ b/Ryff/Classes/RYProfileInfoTableViewCell.m @@ -87,11 +87,11 @@ - (void) awakeFromNib [_tagListView styleForRyff]; // Dynamic fonts - [[BNRDynamicTypeManager sharedInstance] watchTextField:_nameField textStyle:UIFontTextStyleHeadline fontStyle:FONT_BOLD]; - [[BNRDynamicTypeManager sharedInstance] watchLabel:_usernameLabel textStyle:UIFontTextStyleSubheadline fontStyle:FONT_REGULAR]; - [[BNRDynamicTypeManager sharedInstance] watchTextView:_bioTextView textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; - [[BNRDynamicTypeManager sharedInstance] watchLabel:_followersCountLabel textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; - [[BNRDynamicTypeManager sharedInstance] watchLabel:_karmaCountLabel textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; +// [[BNRDynamicTypeManager sharedInstance] watchTextField:_nameField textStyle:UIFontTextStyleHeadline fontStyle:FONT_BOLD]; +// [[BNRDynamicTypeManager sharedInstance] watchLabel:_usernameLabel textStyle:UIFontTextStyleSubheadline fontStyle:FONT_REGULAR]; +// [[BNRDynamicTypeManager sharedInstance] watchTextView:_bioTextView textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; +// [[BNRDynamicTypeManager sharedInstance] watchLabel:_followersCountLabel textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; +// [[BNRDynamicTypeManager sharedInstance] watchLabel:_karmaCountLabel textStyle:UIFontTextStyleBody fontStyle:FONT_REGULAR]; } - (void) configureForUser:(RYUser *)user delegate:(id)delegate parentTableView:(UITableView *)tableView diff --git a/Ryff/UI/Profile/RYProfileViewController.h b/Ryff/Classes/RYProfileViewController.h similarity index 83% rename from Ryff/UI/Profile/RYProfileViewController.h rename to Ryff/Classes/RYProfileViewController.h index 9eda08c..527673a 100644 --- a/Ryff/UI/Profile/RYProfileViewController.h +++ b/Ryff/Classes/RYProfileViewController.h @@ -11,7 +11,7 @@ @class RYUser; -@interface RYProfileViewController : RYRiffStreamingCoreViewController +@interface RYOLDProfileViewController : RYRiffStreamingCoreViewController - (void) configureForUser:(RYUser *)user; - (void) configureForUsername:(NSString *)username; diff --git a/Ryff/UI/Profile/RYProfileViewController.m b/Ryff/Classes/RYProfileViewController.m similarity index 98% rename from Ryff/UI/Profile/RYProfileViewController.m rename to Ryff/Classes/RYProfileViewController.m index d5f4cbd..ad2fe44 100644 --- a/Ryff/UI/Profile/RYProfileViewController.m +++ b/Ryff/Classes/RYProfileViewController.m @@ -24,7 +24,7 @@ #import "RYLoadMoreControl.h" // Categories -#import "UIImage+Thumbnail.h" +#import "UIImage+Size.h" #import "UIViewController+Extras.h" #import "UIImage+Color.h" #import "UIColor+Hex.h" @@ -42,7 +42,7 @@ #define kProfileInfoCellReuseID @"ProfileInfoCell" #define kLoggedOutCellReuseID @"loggedOutCell" -@interface RYProfileViewController () +@interface RYOLDProfileViewController () @property (strong, nonatomic) IBOutlet UITableView *tableView; @property (nonatomic, strong) UIBarButtonItem *notificationsBarButton; @@ -59,7 +59,7 @@ @interface RYProfileViewController () Int { + return 2 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if section == SectionRiff { + return super.tableView(tableView, numberOfRowsInSection: section) + } + return 1 + } + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + if indexPath.section == SectionRiff { + return super.tableView(tableView, cellForRowAtIndexPath: indexPath) + } + let cell = tableView.dequeueReusableCellWithIdentifier(RYProfileTableViewCellReuseIdentifier, forIndexPath: indexPath) + cell.selectionStyle = .None + return cell + } + + // MARK: UITableViewDelegate + + override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + if indexPath.section == SectionRiff { + return super.tableView(tableView, estimatedHeightForRowAtIndexPath: indexPath) + } + return 150 + } + + override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + if indexPath.section == SectionRiff { + return super.tableView(tableView, heightForRowAtIndexPath: indexPath) + } + return UITableViewAutomaticDimension + } + + override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + if indexPath.section == SectionRiff { + super.tableView(tableView, willDisplayCell: cell, forRowAtIndexPath: indexPath) + } + else if indexPath.section == SectionProfile { + if let profileCell = cell as? RYUserProfileTableViewCell, userDataSource = dataSource as? RYUserFeedDataSource { + profileCell.styleWithUser(userDataSource.user) + } + } + } + +} diff --git a/Ryff/Style/Custom UI Objects/RYRefreshControl.h b/Ryff/Classes/RYRefreshControl.h similarity index 100% rename from Ryff/Style/Custom UI Objects/RYRefreshControl.h rename to Ryff/Classes/RYRefreshControl.h diff --git a/Ryff/Style/Custom UI Objects/RYRefreshControl.m b/Ryff/Classes/RYRefreshControl.m similarity index 100% rename from Ryff/Style/Custom UI Objects/RYRefreshControl.m rename to Ryff/Classes/RYRefreshControl.m diff --git a/Ryff/Data/Services/RYRegistrationServices.h b/Ryff/Classes/RYRegistrationServices.h similarity index 100% rename from Ryff/Data/Services/RYRegistrationServices.h rename to Ryff/Classes/RYRegistrationServices.h diff --git a/Ryff/Data/Services/RYRegistrationServices.m b/Ryff/Classes/RYRegistrationServices.m similarity index 90% rename from Ryff/Data/Services/RYRegistrationServices.m rename to Ryff/Classes/RYRegistrationServices.m index 507c964..ae4ff40 100644 --- a/Ryff/Data/Services/RYRegistrationServices.m +++ b/Ryff/Classes/RYRegistrationServices.m @@ -17,12 +17,16 @@ #import "RYTag.h" // Frameworks -#import "SSKeychain.h" +@import SSKeychain; #import "AFHTTPRequestOperationManager.h" #import "SDWebImageManager.h" @implementation RYRegistrationServices +static NSString *ryffServiceName = @"ryff"; +static NSString *userKey = @"auth_username"; +static NSString *passwordKey = @"auth_password"; + static RYRegistrationServices* _sharedInstance; static RYUser* _loggedInUser; @@ -52,16 +56,21 @@ - (void) setLoggedInUser:(NSDictionary *)userDict username:(NSString *)username [[NSUserDefaults standardUserDefaults] synchronize]; if (password && password.length > 0) - [SSKeychain setPassword:password forService:@"ryff" account:username]; + [SSKeychain setPassword:password forService:ryffServiceName account:username]; } - (BOOL) attemptBackgroundLogIn { + // TEST + [self logInUserWithUsername:@"trachytoid" Password:@"password" forDelegate:nil]; + return YES; + // TEST + BOOL success = NO; NSDictionary *userDict = [[NSUserDefaults standardUserDefaults] objectForKey:kLoggedInUserKey]; RYUser *userObject = [RYUser userFromDict:userDict]; - NSString *password = [SSKeychain passwordForService:@"ryff" account:userObject.username]; + NSString *password = [SSKeychain passwordForService:ryffServiceName account:userObject.username]; if (userObject.username && password) { @@ -73,7 +82,7 @@ - (BOOL) attemptBackgroundLogIn - (void) logOut { - [SSKeychain deletePasswordForService:@"ryff" account:[RYRegistrationServices loggedInUser].username]; + [SSKeychain deletePasswordForService:ryffServiceName account:[RYRegistrationServices loggedInUser].username]; [[NSUserDefaults standardUserDefaults] removeObjectForKey:kLoggedInUserKey]; _loggedInUser = nil; NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; @@ -96,7 +105,7 @@ - (void) updateUserWithParams:(NSDictionary *)params toAction:(NSString *)action if (dictionary[@"success"]) { - [self setLoggedInUser:dictionary[@"user"] username:params[@"username"] password:params[@"password"]]; + [self setLoggedInUser:dictionary[@"user"] username:params[userKey] password:params[passwordKey]]; [[NSNotificationCenter defaultCenter] postNotificationName:kLoggedInNotification object:nil]; if (delegate && [delegate respondsToSelector:@selector(updateSucceeded:)]) @@ -121,7 +130,7 @@ - (void) registerUserWithPOSTDict:(NSDictionary*)params forDelegate:(id)delegate { NSString *action = [NSString stringWithFormat:@"%@%@",kApiRoot,kLogIn]; - NSDictionary *params = @{@"auth_username":username,@"auth_password":password}; + NSDictionary *params = @{userKey:username, passwordKey:password}; [self updateUserWithParams:params toAction:action forDelegate:delegate]; } diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.h b/Ryff/Classes/RYRiffAudioEngine.h similarity index 91% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.h rename to Ryff/Classes/RYRiffAudioEngine.h index 5434579..4669ca7 100644 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.h +++ b/Ryff/Classes/RYRiffAudioEngine.h @@ -16,6 +16,8 @@ extern const NSString * __nonnull RecordingAudioFileFormat; - (nullable RYRiffAudioNode *)nodeAtIndex:(NSInteger)index; - (void)toggleNodeAtIndex:(NSInteger)index; - (void)clearNodeAtIndex:(NSInteger)index; +- (void)playNodeAtIndex:(NSInteger)index; +- (void)loopNodeAtIndex:(NSInteger)index; @end @protocol AudioEngineDelegate diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.m b/Ryff/Classes/RYRiffAudioEngine.m similarity index 80% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.m rename to Ryff/Classes/RYRiffAudioEngine.m index 7929d5a..dba69d5 100644 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioEngine.m +++ b/Ryff/Classes/RYRiffAudioEngine.m @@ -13,16 +13,13 @@ #import "RYRiffAudioNode.h" -static const CGFloat DefaultBPM = 120; const NSString * __nonnull RecordingAudioFileFormat = @".caf"; #pragma mark - Riff Audio Engine -@interface RYRiffAudioEngine() +@interface RYRiffAudioEngine() @property (nonatomic) AVAudioEngine *engine; -@property (nonatomic) NSTimer *beat; - @property (nonatomic) NSArray/*RYRiffAudioNode*/ *riffAudioNodes; @property (nonatomic) NSURL *mixerOutputFileURL; @property (nonatomic) BOOL isRecording; @@ -43,8 +40,6 @@ - (nonnull instancetype)initWithRiffNodeCount:(NSInteger)riffNodeCount _isRecording = NO; _mixerOutputFileURL = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"mixerOutput.caf"]]; -// [self startBeatTimer:(1/DefaultBPM)]; - [self createNodes:riffNodeCount]; // create an instance of the engine and attach the nodes @@ -78,33 +73,9 @@ - (nonnull instancetype)initWithRiffNodeCount:(NSInteger)riffNodeCount return self; } -- (void)startBeatTimer:(NSTimeInterval)timeInterval { - _beat = [NSTimer scheduledTimerWithTimeInterval:(1/DefaultBPM) target:self selector:@selector(beatStrike:) userInfo:nil repeats:YES]; - _beat.tolerance = 0.0001; -} - -- (void)stopBeatTimer { - [_beat invalidate]; -} - -- (void)beatStrike:(NSTimer *)beat { - NSLog(@"beatStrike"); - -// [self startWaitingAudioNodes]; -} - -- (void)startWaitingAudioNodes { - for (RYRiffAudioNode *riffNode in self.riffAudioNodes) { - if (riffNode.isActive && !riffNode.audioPlayerNode.isPlaying) { - [riffNode play]; - } - } -} - -- (void)stopAllNodes { - for (RYRiffAudioNode *riffNode in self.riffAudioNodes) { - [riffNode stop]; - } +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [self endAVAudioSession]; } #pragma mark - Recording @@ -126,7 +97,6 @@ - (void)startRecordingOutputToNode:(RYRiffAudioNode *)riffNode { NSLog(@"startRecordingOutputToNode tap error: %@", [error localizedDescription]); } }]; - riffNode.isRecording = YES; _recordingNode = riffNode; _isRecording = YES; } @@ -143,16 +113,21 @@ - (void)stopRecordingOutput { } [_recordingNode setAudioFile:recordedFile]; - [_recordingNode startWithDelay:0 looping:YES]; - [_recordingNode play]; - _recordingNode.isRecording = NO; - _recordingNode.isActive = YES; + _recordingNode.activeAction = RYRiffActiveAudioNodeActionLooping; _recordingNode = nil; _isRecording = NO; } } +#pragma mark - RYRiffAudioNodeDelegates + +- (void)riffAudioFinished:(RYRiffAudioNode *)node { + [node stop]; + node.status = RYRiffAudioNodeStatusReadyToPlay; + [self.delegate nodeStatusChangedAtIndex:[self.riffAudioNodes indexOfObject:node]]; +} + #pragma mark - RiffAudioDataSource - (nullable RYRiffAudioNode *)nodeAtIndex:(NSInteger)index { @@ -165,25 +140,23 @@ - (nullable RYRiffAudioNode *)nodeAtIndex:(NSInteger)index { - (void)toggleNodeAtIndex:(NSInteger)index { RYRiffAudioNode *riffNode = [self nodeAtIndex:index]; if (riffNode) { - if (!riffNode.isReadyToPlay) { - // toggle recording - if (riffNode.isRecording) { - [self stopRecordingOutput]; - } - else { + switch (riffNode.status) { + case RYRiffAudioNodeStatusEmpty: [self startRecordingOutputToNode:riffNode]; - } - } - else { - // toggle playing - if (riffNode.audioPlayerNode.isPlaying) { - [riffNode pause]; - riffNode.isActive = NO; - } - else { - [riffNode play]; - riffNode.isActive = YES; - } + riffNode.status = RYRiffAudioNodeStatusRecording; + break; + case RYRiffAudioNodeStatusRecording: + [self stopRecordingOutput]; + riffNode.status = RYRiffAudioNodeStatusReadyToPlay; + break; + case RYRiffAudioNodeStatusReadyToPlay: + [self startNode:riffNode]; + riffNode.status = RYRiffAudioNodeStatusActive; + break; + case RYRiffAudioNodeStatusActive: + [riffNode stop]; + riffNode.status = RYRiffAudioNodeStatusReadyToPlay; + break; } [self.delegate nodeStatusChangedAtIndex:index]; @@ -193,14 +166,48 @@ - (void)toggleNodeAtIndex:(NSInteger)index { - (void)clearNodeAtIndex:(NSInteger)index { RYRiffAudioNode *riffNode = [self nodeAtIndex:index]; if (riffNode) { + if (riffNode.status == RYRiffAudioNodeStatusRecording) { + [self stopRecordingOutput]; + } + [riffNode stop]; [riffNode deleteAudio]; - riffNode.isActive = NO; + riffNode.status = RYRiffAudioNodeStatusEmpty; [self.delegate nodeStatusChangedAtIndex:index]; } } +- (void)loopNodeAtIndex:(NSInteger)index { + RYRiffAudioNode *riffNode = [self nodeAtIndex:index]; + if (riffNode) { + if (riffNode.status == RYRiffAudioNodeStatusRecording) { + [self stopRecordingOutput]; + } + + if (!riffNode.audioPlayerNode.isPlaying) { + riffNode.activeAction = RYRiffActiveAudioNodeActionLooping; + [self startNode:riffNode]; + [self.delegate nodeStatusChangedAtIndex:index]; + } + } +} + +- (void)playNodeAtIndex:(NSInteger)index { + RYRiffAudioNode *riffNode = [self nodeAtIndex:index]; + if (riffNode) { + if (riffNode.status == RYRiffAudioNodeStatusRecording) { + [self stopRecordingOutput]; + } + + if (!riffNode.audioPlayerNode.isPlaying) { + riffNode.activeAction = RYRiffActiveAudioNodeActionPlayingOnce; + [self startNode:riffNode]; + [self.delegate nodeStatusChangedAtIndex:index]; + } + } +} + #pragma mark - Private - (void)createEngineAndAttachNodes @@ -231,7 +238,7 @@ - (void)createEngineAndAttachNodes - (void)createNodes:(NSInteger)nodeCount { NSMutableArray *riffAudioNodes = [[NSMutableArray alloc] initWithCapacity:nodeCount]; for (NSInteger nodeIndex = 0; nodeIndex < nodeCount; nodeIndex++) { - RYRiffAudioNode *riffNode = [[RYRiffAudioNode alloc] init]; + RYRiffAudioNode *riffNode = [[RYRiffAudioNode alloc] initWithDelegate:self]; [riffAudioNodes addObject:riffNode]; } self.riffAudioNodes = riffAudioNodes; @@ -274,6 +281,22 @@ - (void)startEngine } } +- (void)startNode:(RYRiffAudioNode *)riffNode { + if (riffNode.audioBuffer && riffNode.status != RYRiffAudioNodeStatusActive) { + BOOL looping = (riffNode.activeAction == RYRiffActiveAudioNodeActionLooping); + [riffNode startWithDelay:0 looping:looping]; + [riffNode play]; + + riffNode.status = RYRiffAudioNodeStatusActive; + } +} + +- (void)stopAllNodes { + for (RYRiffAudioNode *riffNode in self.riffAudioNodes) { + [riffNode stop]; + } +} + #pragma mark AVAudioSession - (void)initAVAudioSession @@ -319,6 +342,21 @@ - (void)initAVAudioSession if (!success) NSLog(@"Error setting session active! %@\n", [error localizedDescription]); } +- (void)endAVAudioSession +{ + // Configure the audio session + AVAudioSession *sessionInstance = [AVAudioSession sharedInstance]; + NSError *error; + + // set the session category + bool success = [sessionInstance setCategory:AVAudioSessionCategoryPlayback error:&error]; + if (!success) NSLog(@"Error setting AVAudioSession category back to playback only! %@\n", [error localizedDescription]); + + // activate the audio session + success = [sessionInstance setActive:NO error:&error]; + if (!success) NSLog(@"Error setting session inactive! %@\n", [error localizedDescription]); +} + - (void)handleInterruption:(NSNotification *)notification { UInt8 theInterruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue]; diff --git a/Ryff/Classes/RYRiffAudioNode.h b/Ryff/Classes/RYRiffAudioNode.h new file mode 100644 index 0000000..ba6b9c8 --- /dev/null +++ b/Ryff/Classes/RYRiffAudioNode.h @@ -0,0 +1,53 @@ +// +// RYRiffAudioNode.h +// Ryff +// +// Created by Christopher Laganiere on 8/15/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +@import Foundation; + +@class AVAudioPCMBuffer; +@class AVAudioPlayerNode; +@class AVAudioTime; +@class AVAudioFile; + +@protocol RYRiffAudioNodeDelegate +- (void)riffAudioFinished:(RYRiffAudioNode * __nonnull)node; +@end + +typedef NS_ENUM(NSInteger, RYRiffAudioNodeStatus) { + RYRiffAudioNodeStatusEmpty = 0, + RYRiffAudioNodeStatusRecording, + RYRiffAudioNodeStatusReadyToPlay, + RYRiffAudioNodeStatusActive +}; + +typedef NS_ENUM(NSInteger, RYRiffActiveAudioNodeAction) { + RYRiffActiveAudioNodeActionPlayingOnce = 0, + RYRiffActiveAudioNodeActionLooping +}; + +@interface RYRiffAudioNode : NSObject + +@property (nonatomic, assign) RYRiffAudioNodeStatus status; +@property (nonatomic, assign) RYRiffActiveAudioNodeAction activeAction; +@property (nonatomic, weak, nullable) id delegate; + +@property (nonatomic, readonly, nonnull) AVAudioPlayerNode *audioPlayerNode; +@property (nonatomic, readonly, nullable) AVAudioPCMBuffer *audioBuffer; + +- (nonnull instancetype)initWithDelegate:(id __nullable)delegate NS_DESIGNATED_INITIALIZER; + +- (void)setAudioBuffer:(AVAudioPCMBuffer * __nonnull)audioBuffer; +- (void)setAudioFile:(AVAudioFile * __nonnull)audioFile; +- (void)deleteAudio; + +- (void)startWithDelay:(AVAudioTime * __nullable)delay looping:(BOOL)looping; + +- (void)play; +- (void)pause; +- (void)stop; + +@end diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.m b/Ryff/Classes/RYRiffAudioNode.m similarity index 82% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.m rename to Ryff/Classes/RYRiffAudioNode.m index 8778952..6e26894 100644 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.m +++ b/Ryff/Classes/RYRiffAudioNode.m @@ -19,9 +19,10 @@ @interface RYRiffAudioNode () @implementation RYRiffAudioNode -- (instancetype)init { +- (nonnull instancetype)initWithDelegate:(id __nullable)delegate { if (self = [super init]) { _audioPlayerNode = [[AVAudioPlayerNode alloc] init]; + _delegate = delegate; } return self; } @@ -44,7 +45,11 @@ - (void)deleteAudio { - (void)startWithDelay:(AVAudioTime * __nullable)delay looping:(BOOL)looping { AVAudioPlayerNodeBufferOptions options = looping ? AVAudioPlayerNodeBufferLoops : 0; [self.audioPlayerNode scheduleBuffer:self.audioBuffer atTime:delay options:options completionHandler:^{ - NSLog(@"schedule audio"); + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.status == RYRiffAudioNodeStatusActive) { + [self.delegate riffAudioFinished:self]; + } + }); }]; } diff --git a/Ryff/UI/Profile/RiffCell/RYRiffCell.h b/Ryff/Classes/RYRiffCell.h similarity index 100% rename from Ryff/UI/Profile/RiffCell/RYRiffCell.h rename to Ryff/Classes/RYRiffCell.h diff --git a/Ryff/UI/Profile/RiffCell/RYRiffCell.m b/Ryff/Classes/RYRiffCell.m similarity index 73% rename from Ryff/UI/Profile/RiffCell/RYRiffCell.m rename to Ryff/Classes/RYRiffCell.m index 92efc9c..72af154 100644 --- a/Ryff/UI/Profile/RiffCell/RYRiffCell.m +++ b/Ryff/Classes/RYRiffCell.m @@ -14,7 +14,6 @@ // Data Managers #import "RYStyleSheet.h" -#import "RYAudioDeckManager.h" #import "RYServices.h" // Custom UI @@ -129,7 +128,7 @@ - (void) awakeFromNib [_playControlView addGestureRecognizer:playControlTap]; [_playControlView setBackgroundColor:[UIColor clearColor]]; - [_playControlView configureWithFrame:_playControlView.bounds centerImageInset:@(_playControlView.frame.size.width/4)]; +// [_playControlView configureWithFrame:_playControlView.bounds centerImageInset:@(_playControlView.frame.size.width/4)]; if (_avatarImageView) { @@ -160,11 +159,11 @@ - (void) awakeFromNib _starButton.imageView.contentMode = UIViewContentModeScaleAspectFit; [_repostButton setTintColor:[RYStyleSheet availableActionColor]]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckPlaylistChanged:) name:kPlaylistChangedNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckTrackChanged:) name:kTrackChangedNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDownloadProgress:) name:kDownloadProgressNotification object:nil]; +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckPlaylistChanged:) name:kPlaylistChangedNotification object:nil]; +// +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioDeckTrackChanged:) name:kTrackChangedNotification object:nil]; +// +// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateDownloadProgress:) name:kDownloadProgressNotification object:nil]; } - (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated{ @@ -184,50 +183,50 @@ - (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated{ - (void) styleFromAudioDeck { - RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; - if (_post.postId == [audioManager currentlyPlayingPost].postId) - { - // currently playing - [_playlistAddButton setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal]; - _playlistAddButton.tintColor = [RYStyleSheet postActionColor]; - - _playControlView.hidden = NO; - _playControlView.controlTintColor = [RYStyleSheet availableActionColor]; - [_playControlView setProgress:0.0f animated:NO]; - if ([[RYAudioDeckManager sharedInstance] idxOfDownload:_post] >= 0) - [_playControlView setCenterImage:nil]; - else if ([audioManager isPlaying]) - [_playControlView setCenterImage:[UIImage imageNamed:@"playing"]]; - else - [_playControlView setCenterImage:[UIImage imageNamed:@"play"]]; - } - else if ([audioManager playlistContainsPost:_post.postId]) - { - // in playlist or downloading - [_playlistAddButton setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal]; - _playlistAddButton.tintColor = [RYStyleSheet postActionColor]; - - _playControlView.hidden = NO; - _playControlView.controlTintColor = [RYStyleSheet availableActionColor]; - if ([[RYAudioDeckManager sharedInstance] idxOfDownload:_post] >= 0) - { - // downloading - [_playControlView setCenterImage:nil]; - } - else - { - // in playlist - [_playControlView setCenterImage:[UIImage imageNamed:@"play"]]; - [_playControlView setProgress:0.0f animated:NO]; - } - } - else - { - [_playlistAddButton setImage:[UIImage imageNamed:@"plus"] forState:UIControlStateNormal]; - _playlistAddButton.tintColor = [RYStyleSheet availableActionColor]; - - _playControlView.hidden = YES; - } +// RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; +// if (_post.postId == [audioManager currentlyPlayingPost].postId) +// { +// // currently playing +// [_playlistAddButton setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal]; +// _playlistAddButton.tintColor = [RYStyleSheet postActionColor]; +// +// _playControlView.hidden = NO; +// _playControlView.controlTintColor = [RYStyleSheet availableActionColor]; +// [_playControlView setProgress:0.0f animated:NO]; +// if ([[RYAudioDeckManager sharedInstance] idxOfDownload:_post] >= 0) +// [_playControlView setCenterImage:nil]; +// else if ([audioManager isPlaying]) +// [_playControlView setCenterImage:[UIImage imageNamed:@"playing"]]; +// else +// [_playControlView setCenterImage:[UIImage imageNamed:@"play"]]; +// } +// else if ([audioManager playlistContainsPost:_post.postId]) +// { +// // in playlist or downloading +// [_playlistAddButton setImage:[UIImage imageNamed:@"check"] forState:UIControlStateNormal]; +// _playlistAddButton.tintColor = [RYStyleSheet postActionColor]; +// +// _playControlView.hidden = NO; +// _playControlView.controlTintColor = [RYStyleSheet availableActionColor]; +// if ([[RYAudioDeckManager sharedInstance] idxOfDownload:_post] >= 0) +// { +// // downloading +// [_playControlView setCenterImage:nil]; +// } +// else +// { +// // in playlist +// [_playControlView setCenterImage:[UIImage imageNamed:@"play"]]; +// [_playControlView setProgress:0.0f animated:NO]; +// } +// } +// else +// { +// [_playlistAddButton setImage:[UIImage imageNamed:@"plus"] forState:UIControlStateNormal]; +// _playlistAddButton.tintColor = [RYStyleSheet availableActionColor]; +// +// _playControlView.hidden = YES; +// } } #pragma mark - @@ -260,18 +259,18 @@ - (void) updateDownloadProgress:(NSNotification *)notification #pragma mark - Actions - (IBAction)playlistAddHit:(id)sender { - if ([[RYAudioDeckManager sharedInstance] playlistContainsPost:_post.postId]) - { - // playlist contains already - [[RYAudioDeckManager sharedInstance] removePostFromPlaylist:_post]; - [_playlistAddButton setTintColor:[RYStyleSheet availableActionColor]]; - } - else - { - // add to playlist - [[RYAudioDeckManager sharedInstance] addPostToPlaylist:_post]; - [_playlistAddButton setTintColor:[RYStyleSheet postActionColor]]; - } +// if ([[RYAudioDeckManager sharedInstance] playlistContainsPost:_post.postId]) +// { +// // playlist contains already +// [[RYAudioDeckManager sharedInstance] removePostFromPlaylist:_post]; +// [_playlistAddButton setTintColor:[RYStyleSheet availableActionColor]]; +// } +// else +// { +// // add to playlist +// [[RYAudioDeckManager sharedInstance] addPostToPlaylist:_post]; +// [_playlistAddButton setTintColor:[RYStyleSheet postActionColor]]; +// } } - (IBAction)repostHit:(id)sender diff --git a/Ryff/UI/Profile/RiffEdit/RYRiffCreateOldViewController.h b/Ryff/Classes/RYRiffCreateOldViewController.h similarity index 100% rename from Ryff/UI/Profile/RiffEdit/RYRiffCreateOldViewController.h rename to Ryff/Classes/RYRiffCreateOldViewController.h diff --git a/Ryff/UI/Profile/RiffEdit/RYRiffCreateOldViewController.m b/Ryff/Classes/RYRiffCreateOldViewController.m similarity index 99% rename from Ryff/UI/Profile/RiffEdit/RYRiffCreateOldViewController.m rename to Ryff/Classes/RYRiffCreateOldViewController.m index cb525cc..1f24ae6 100644 --- a/Ryff/UI/Profile/RiffEdit/RYRiffCreateOldViewController.m +++ b/Ryff/Classes/RYRiffCreateOldViewController.m @@ -12,7 +12,6 @@ #import "RYServices.h" #import "RYMediaEditor.h" #import "RYDataManager.h" -#import "RYAudioDeckManager.h" // Data Objects #import "RYPost.h" @@ -115,7 +114,7 @@ - (void) viewWillAppear:(BOOL)animated { [_tableView reloadData]; - [[RYAudioDeckManager sharedInstance] playTrack:NO]; +// [[RYAudioDeckManager sharedInstance] playTrack:NO]; } - (IBAction)backButtonHit:(id)sender diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateTableViewCell.h b/Ryff/Classes/RYRiffCreateTableViewCell.h similarity index 100% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateTableViewCell.h rename to Ryff/Classes/RYRiffCreateTableViewCell.h diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateTableViewCell.m b/Ryff/Classes/RYRiffCreateTableViewCell.m similarity index 93% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateTableViewCell.m rename to Ryff/Classes/RYRiffCreateTableViewCell.m index aec870e..9b1b6a9 100644 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateTableViewCell.m +++ b/Ryff/Classes/RYRiffCreateTableViewCell.m @@ -34,10 +34,10 @@ - (void) configureForAudioPlayer:(AVAudioPlayer*)player forDelegate:(id UIColor { + switch (status) { + case .Recording: + return RYStyleSheet.recordingColor() + default: + return RYStyleSheet.audioPadColor() + } + } + + /** + Shows or hides subview elements as appropriate for the provided riff node status. + + :param: status RYRiffAudioNodeStatus to style for. + */ + func hideElements(status: RYRiffAudioNodeStatus) { + let inUse = (status != .Empty) + starredView.hidden = inUse + + let actionsHidden = (status == .Empty) + deleteImageView.hidden = actionsHidden + resetImageView.hidden = actionsHidden + playImageView.hidden = actionsHidden + + let notReadyToPlay = (status != .ReadyToPlay && status != .Active) + highlightView.hidden = notReadyToPlay + } + + func colorElements(riffNode: RYRiffAudioNode) { + if (riffNode.status == .Active && riffNode.activeAction == .Looping) { + resetImageView.tintColor = UIColor.whiteColor() + } + else { + resetImageView.tintColor = UIColor.blackColor() + } + + if (riffNode.status == .Active && riffNode.activeAction == .PlayingOnce) { + playImageView.tintColor = UIColor.whiteColor() + } + else { + playImageView.tintColor = UIColor.blackColor() + } + } + + // MARK: Layout + + func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["delete": deleteImageView, "reset": resetImageView, "play": playImageView, "highlight": highlightView, "starred": starredView, "image": postImageView] + let metrics = ["padding": Constants.Global.ElementPadding, "small": Constants.Mixer.ActionDimensionSmall, "large": Constants.Mixer.ActionDimensionLarge] + + var constraints: [NSLayoutConstraint] = [] + + // Highlight + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[highlight]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[highlight]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + + // Post Image + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[image]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[image]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + + // Starred + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:[starred]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[starred]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + // Actions + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(padding)-[delete(small)]-(>=padding)-[reset(large)]-(>=padding)-[play(small)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: resetImageView, attribute: .CenterX, relatedBy: .Equal, toItem: resetImageView.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[delete(small)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[reset(large)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:[play(small)]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + + return constraints + } + +} diff --git a/Ryff/Classes/RYRiffMixerViewController.swift b/Ryff/Classes/RYRiffMixerViewController.swift new file mode 100644 index 0000000..d840d75 --- /dev/null +++ b/Ryff/Classes/RYRiffMixerViewController.swift @@ -0,0 +1,132 @@ +// +// RYRiffMixerCollectionViewController.swift +// Ryff +// +// Created by Christopher Laganiere on 8/15/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit +import KRLCollectionViewGridLayout + +@objc +class RYRiffMixerViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, AudioEngineDelegate, RYRiffMixerNodeCellDelegate { + + private let NumberOfNodes = 8 + private let NodeCellReuseIdentifier = "RiffNodeCell" + + private var riffEngine: RYRiffAudioEngine + + private let collectionViewLayout = KRLCollectionViewGridLayout() + private let collectionView: UICollectionView + + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { + riffEngine = RYRiffAudioEngine(riffNodeCount: NumberOfNodes) + collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: collectionViewLayout) + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + riffEngine.delegate = self + collectionView.dataSource = self + collectionView.delegate = self + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = RYStyleSheet.darkBackgroundColor() + + collectionView.backgroundColor = UIColor.clearColor() + collectionView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(collectionView) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + + collectionView.registerClass(RYRiffMixerNodeCollectionViewCell.self, forCellWithReuseIdentifier: NodeCellReuseIdentifier) + } + + override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + collectionViewLayout.style(self) + } + + override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { + return UIInterfaceOrientationMask.Portrait + } + + // MARK: RYRiffMixerNodeCellDelegate + + func clearHitOnNodeCell(nodeCell: RYRiffMixerNodeCollectionViewCell) { + if let indexPath = collectionView.indexPathForCell(nodeCell) { + riffEngine.clearNodeAtIndex(indexPath.row) + } + } + + func loopHitOnNodeCell(nodeCell: RYRiffMixerNodeCollectionViewCell) { + if let indexPath = collectionView.indexPathForCell(nodeCell) { + riffEngine.loopNodeAtIndex(indexPath.row) + } + } + + func playOnceHitOnNodeCell(nodeCell: RYRiffMixerNodeCollectionViewCell) { + if let indexPath = collectionView.indexPathForCell(nodeCell) { + riffEngine.playNodeAtIndex(indexPath.row) + } + } + + func remixStarredHitOnNodeCell(nodeCell: RYRiffMixerNodeCollectionViewCell) { + // TODO: let user remix starred posts + } + + // MARK: AudioEngineDelegate + + func nodeStatusChangedAtIndex(index: Int) { + if let riffNode = riffEngine.nodeAtIndex(index) { + let indexPath = NSIndexPath(forItem: index, inSection: 0) + if let nodeCell = collectionView.cellForItemAtIndexPath(indexPath) as? RYRiffMixerNodeCollectionViewCell { + nodeCell.styleWithRiffNode(riffNode) + } + } + } + + // MARK: Styling + + func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["collectionView": collectionView] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[collectionView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[collectionView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDict) + return constraints + } + + // MARK: UICollectionViewDataSource + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + return collectionView.dequeueReusableCellWithReuseIdentifier(NodeCellReuseIdentifier, forIndexPath: indexPath) as! RYRiffMixerNodeCollectionViewCell + } + + // MARK: UICollectionViewDelegate + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return NumberOfNodes + } + + func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { + if let nodeCell = cell as? RYRiffMixerNodeCollectionViewCell, riffNode = riffEngine.nodeAtIndex(indexPath.row) { + nodeCell.styleWithRiffNode(riffNode) + nodeCell.delegate = self + } + } + + func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + riffEngine.toggleNodeAtIndex(indexPath.row) + } +} diff --git a/Ryff/Newsfeed/RiffStream/RYRiffStreamViewController.h b/Ryff/Classes/RYRiffStreamViewController.h similarity index 100% rename from Ryff/Newsfeed/RiffStream/RYRiffStreamViewController.h rename to Ryff/Classes/RYRiffStreamViewController.h diff --git a/Ryff/Newsfeed/RiffStream/RYRiffStreamViewController.m b/Ryff/Classes/RYRiffStreamViewController.m similarity index 100% rename from Ryff/Newsfeed/RiffStream/RYRiffStreamViewController.m rename to Ryff/Classes/RYRiffStreamViewController.m diff --git a/Ryff/Base Classes/RYRiffStreamingCoreViewController.h b/Ryff/Classes/RYRiffStreamingCoreViewController.h similarity index 96% rename from Ryff/Base Classes/RYRiffStreamingCoreViewController.h rename to Ryff/Classes/RYRiffStreamingCoreViewController.h index c08280d..15584ab 100644 --- a/Ryff/Base Classes/RYRiffStreamingCoreViewController.h +++ b/Ryff/Classes/RYRiffStreamingCoreViewController.h @@ -15,7 +15,6 @@ // Data Managers #import "RYServices.h" -#import "RYAudioDeckManager.h" // Data Objects #import "RYPost.h" diff --git a/Ryff/Base Classes/RYRiffStreamingCoreViewController.m b/Ryff/Classes/RYRiffStreamingCoreViewController.m similarity index 92% rename from Ryff/Base Classes/RYRiffStreamingCoreViewController.m rename to Ryff/Classes/RYRiffStreamingCoreViewController.m index 1a6ed23..e41d94f 100644 --- a/Ryff/Base Classes/RYRiffStreamingCoreViewController.m +++ b/Ryff/Classes/RYRiffStreamingCoreViewController.m @@ -69,7 +69,7 @@ - (void) follow:(BOOL)following confirmedForUser:(RYUser *)user - (void) followFailed:(NSString *)reason { - + NSLog(@"Follow user failed: %@", reason); } #pragma mark - ProfilePost Delegate @@ -85,24 +85,24 @@ - (void) avatarAction:(NSInteger)riffIndex */ - (void) playerControlAction:(NSInteger)riffIndex { - RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; - RYPost *post = _feedItems[riffIndex]; - if (post.postId == [audioManager currentlyPlayingPost].postId) - { - // currently playing - BOOL shouldPlay = ![audioManager isPlaying]; - [audioManager playTrack:shouldPlay]; - } - else if ([audioManager idxOfDownload:post] >= 0) - { - // currently downloading, should stop download - [audioManager removePostFromPlaylist:post]; - } - else - { - // not active - [audioManager forcePostToTop:post]; - } +// RYAudioDeckManager *audioManager = [RYAudioDeckManager sharedInstance]; +// RYPost *post = _feedItems[riffIndex]; +// if (post.postId == [audioManager currentlyPlayingPost].postId) +// { +// // currently playing +// BOOL shouldPlay = ![audioManager isPlaying]; +// [audioManager playTrack:shouldPlay]; +// } +// else if ([audioManager idxOfDownload:post] >= 0) +// { +// // currently downloading, should stop download +// [audioManager removePostFromPlaylist:post]; +// } +// else +// { +// // not active +// [audioManager forcePostToTop:post]; +// } } /* diff --git a/Ryff/Newsfeed/TagFeed/RYSearchTypeTableViewCell.h b/Ryff/Classes/RYSearchTypeTableViewCell.h similarity index 100% rename from Ryff/Newsfeed/TagFeed/RYSearchTypeTableViewCell.h rename to Ryff/Classes/RYSearchTypeTableViewCell.h diff --git a/Ryff/Newsfeed/TagFeed/RYSearchTypeTableViewCell.m b/Ryff/Classes/RYSearchTypeTableViewCell.m similarity index 100% rename from Ryff/Newsfeed/TagFeed/RYSearchTypeTableViewCell.m rename to Ryff/Classes/RYSearchTypeTableViewCell.m diff --git a/Ryff/Data/RYServices.h b/Ryff/Classes/RYServices.h similarity index 100% rename from Ryff/Data/RYServices.h rename to Ryff/Classes/RYServices.h diff --git a/Ryff/Data/RYServices.m b/Ryff/Classes/RYServices.m similarity index 100% rename from Ryff/Data/RYServices.m rename to Ryff/Classes/RYServices.m diff --git a/Ryff/Style/Custom UI Objects/RYSocialTextView.h b/Ryff/Classes/RYSocialTextView.h similarity index 100% rename from Ryff/Style/Custom UI Objects/RYSocialTextView.h rename to Ryff/Classes/RYSocialTextView.h diff --git a/Ryff/Style/Custom UI Objects/RYSocialTextView.m b/Ryff/Classes/RYSocialTextView.m similarity index 100% rename from Ryff/Style/Custom UI Objects/RYSocialTextView.m rename to Ryff/Classes/RYSocialTextView.m diff --git a/Ryff/Classes/RYStarredView.swift b/Ryff/Classes/RYStarredView.swift new file mode 100644 index 0000000..31bdfff --- /dev/null +++ b/Ryff/Classes/RYStarredView.swift @@ -0,0 +1,71 @@ +// +// RYStarredView.swift +// Ryff +// +// Created by Chris Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYStarredView: UIView { + + private let starredImageView = UIImageView(frame: CGRectZero) + private let starredCountLabel = UILabel(frame: CGRectZero) + + override init(frame: CGRect) { + super.init(frame: frame) + + backgroundColor = UIColor.clearColor() + + starredImageView.image = UIImage(named: "star") + starredImageView.contentMode = .ScaleAspectFit + starredImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(starredImageView) + + starredCountLabel.alpha = 0.5 + starredCountLabel.textAlignment = .Right + starredCountLabel.setDynamicStyle(TextStyle.Body, fontStyle: .Regular) + starredCountLabel.translatesAutoresizingMaskIntoConstraints = false + addSubview(starredCountLabel) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Styling + + func style(starred: Bool, text: String) { + style(starred) + starredCountLabel.text = text + } + + func style(starred: Bool) { + if starred { + starredImageView.tintColor = RYStyleSheet.audioActionColor() + starredCountLabel.textColor = RYStyleSheet.audioActionColor() + } + else { + starredImageView.tintColor = UIColor.lightGrayColor() + starredCountLabel.textColor = UIColor.lightGrayColor() + } + } + + // MARK: Private + + func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["image": starredImageView, "count": starredCountLabel] + let metrics = ["relatedPadding": Constants.Global.RelatedElementPadding, "actionHeight": Constants.Post.AudioActionHeightLarge] + + var constraints: [NSLayoutConstraint] = [] + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[count]-(relatedPadding)-[image(actionHeight)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|[image(actionHeight)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: starredCountLabel, attribute: .CenterY, relatedBy: .Equal, toItem: starredImageView, attribute: .CenterY, multiplier: 1.0, constant: 0.0)] + return constraints + } + +} diff --git a/Ryff/Style/RYStyleSheet.h b/Ryff/Classes/RYStyleSheet.h similarity index 83% rename from Ryff/Style/RYStyleSheet.h rename to Ryff/Classes/RYStyleSheet.h index 28a1a7f..f5beb57 100644 --- a/Ryff/Style/RYStyleSheet.h +++ b/Ryff/Classes/RYStyleSheet.h @@ -10,16 +10,21 @@ @interface RYStyleSheet : NSObject -// Colors +// Social Colors + (UIColor *)audioActionColor; + (UIColor *)availableActionColor; + (UIColor *)postActionColor; + (UIColor *)tabBarColor; -+ (UIColor *)audioBackgroundColor; + (UIColor *)lightBackgroundColor; ++ (UIColor *)darkBackgroundColor; + (UIColor *)profileBackgroundColor; + (UIColor *)darkTextColor; +// Audio Mixer Colors ++ (UIColor *)audioPadColor; ++ (UIColor *)recordingColor; ++ (UIColor *)audioHighlightColor; + // Fonts + (UIFont *)customFontForTextStyle:(NSString *)textStyle; + (UIFont *)boldCustomFontForTextStyle:(NSString *)textStyle; diff --git a/Ryff/Style/RYStyleSheet.m b/Ryff/Classes/RYStyleSheet.m similarity index 93% rename from Ryff/Style/RYStyleSheet.m rename to Ryff/Classes/RYStyleSheet.m index 4d84756..83ea0f2 100644 --- a/Ryff/Style/RYStyleSheet.m +++ b/Ryff/Classes/RYStyleSheet.m @@ -37,16 +37,15 @@ + (UIColor *)tabBarColor return [UIColor colorWithHexString:@"383838"]; } -+ (UIColor *)audioBackgroundColor -{ - return [UIColor colorWithHexString:@"282828"]; -} - + (UIColor *)lightBackgroundColor { return [UIColor colorWithHexString:@"cee5ea"]; } ++ (UIColor *)darkBackgroundColor { + return [UIColor colorWithHexString:@"574a4a"]; +} + + (UIColor *)profileBackgroundColor { return [UIColor colorWithHexString:@"f2f3ed"]; @@ -57,6 +56,21 @@ + (UIColor *)darkTextColor return [UIColor colorWithHexString:@"5c5c5c"]; } +// Audio Mixer Colors + ++ (UIColor *)audioPadColor +{ + return [UIColor colorWithHexString:@"282828"]; +} + ++ (UIColor *)recordingColor { + return [UIColor colorWithHexString:@"ee4056"]; +} + ++ (UIColor *)audioHighlightColor { + return [UIColor whiteColor]; +} + #pragma mark - #pragma mark - Fonts diff --git a/Ryff/RYCoreTabBarViewController.h b/Ryff/Classes/RYTabBarViewController.h similarity index 63% rename from Ryff/RYCoreTabBarViewController.h rename to Ryff/Classes/RYTabBarViewController.h index e9febcf..dd56243 100644 --- a/Ryff/RYCoreTabBarViewController.h +++ b/Ryff/Classes/RYTabBarViewController.h @@ -1,5 +1,5 @@ // -// RYCoreTabBarViewController.h +// RYTabBarViewController.h // Ryff // // Created by Christopher Laganiere on 4/12/14. @@ -8,6 +8,6 @@ #import -@interface RYCoreTabBarViewController : UITabBarController +@interface RYTabBarViewController : UITabBarController @end diff --git a/Ryff/Classes/RYTabBarViewController.m b/Ryff/Classes/RYTabBarViewController.m new file mode 100644 index 0000000..5f29303 --- /dev/null +++ b/Ryff/Classes/RYTabBarViewController.m @@ -0,0 +1,130 @@ +// +// RYTabBarViewController.m +// Ryff +// +// Created by Christopher Laganiere on 4/12/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +#import "RYTabBarViewController.h" + +// Data Managers +#import "RYServices.h" + +// Data Objects +#import "RYUser.h" +#import "RYNewsfeedDataSource.h" +#import "RYUserFeedDataSource.h" + +// Custom UI +#import "RYStyleSheet.h" +#import "UIImage+Color.h" +#import "UIImage+Size.h" +#import "UIViewController+Extras.h" + +// Associated View Controller +#import "RYProfileViewController.h" +#import "RYNewsfeedContainerViewController.h" +#import "RYDiscoverViewController.h" +#import "RYNavigationController.h" + +static const CGSize tabBarIconSize = {25, 25}; + +typedef NS_ENUM (NSInteger, RYTabIndex) { + RYTabIndexNewsfeed = 0, + RYTabIndexDiscover, + RYTabIndexProfile, + RYTabIndexAudioDeck +}; + +@interface RYTabBarViewController () + +@property (nonatomic) RYNavigationController *newsfeedNavigationController; +@property (nonatomic) RYNavigationController *profileNavigationController; +@property (nonatomic) RYNavigationController *discoverNavigationController; +@property (nonatomic) RYNavigationController *audioDeckNavigationController; + +@end + +@implementation RYTabBarViewController + +- (instancetype)init { + if (self = [super initWithNibName:nil bundle:nil]) { + self.delegate = self; + + _newsfeedNavigationController = [self newsfeed]; + _profileNavigationController = [self profile]; + _discoverNavigationController = [self discover]; + _audioDeckNavigationController = [self audioDeck]; + + self.viewControllers = @[self.newsfeedNavigationController, self.discoverNavigationController, self.profileNavigationController, self.audioDeckNavigationController]; + self.selectedIndex = 0; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.tabBar setTintColor:[RYStyleSheet audioActionColor]]; + [self.tabBar setBackgroundImage:[[UIImage imageNamed:@"tabBar"] colorImage:[RYStyleSheet tabBarColor]]]; + [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:kRegularFont size:12.0f]} forState:UIControlStateNormal]; +} + +#pragma mark - +#pragma mark - TabBar Delegate + +- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { + if ([self.selectedViewController isKindOfClass:[RYNewsfeedContainerViewController class]] && [self.selectedViewController.tabBarItem isEqual:item]) + { + UINavigationController *navController = ((RYNewsfeedContainerViewController *)self.selectedViewController).newsfeedNav; + if (navController) + [navController popToRootViewControllerAnimated:YES]; + } +} + +#pragma mark - View Controllers + +- (RYNavigationController *)newsfeed { + RYNewsfeedDataSource *dataSource = [[RYNewsfeedDataSource alloc] init]; + RYPostsViewController *newsfeed = [[RYPostsViewController alloc] initWithDataSource: dataSource]; + newsfeed.title = @"Newsfeed"; + RYNavigationController *newsfeedNavigationController = [[RYNavigationController alloc] initWithRootViewController:newsfeed]; + UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:newsfeed.title image:[[UIImage imageNamed:@"stream"] imageWithSize:tabBarIconSize] tag:RYTabIndexNewsfeed]; + newsfeedNavigationController.tabBarItem = tabBarItem; + [newsfeed addNewPostButtonToNavBar]; + return newsfeedNavigationController; +} + +- (RYNavigationController *)discover { + RYDiscoverViewController *discover = [[RYDiscoverViewController alloc] initWithNibName:nil bundle:nil]; + RYNavigationController *discoverNavigationController = [[RYNavigationController alloc] initWithRootViewController:discover]; + UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Discover" image:[[UIImage imageNamed:@"globe"] imageWithSize:tabBarIconSize] tag:RYTabIndexDiscover]; + discoverNavigationController.tabBarItem = tabBarItem; + return discoverNavigationController; +} + +- (RYNavigationController *)profile { + RYPostsDataSource *dataSource = [RYUserFeedDataSource postsDataSourceWithUser:[RYRegistrationServices loggedInUser]]; + RYProfileViewController *profile = [[RYProfileViewController alloc] initWithDataSource:dataSource]; + RYNavigationController *profileNavigationController = [[RYNavigationController alloc] initWithRootViewController:profile]; + UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:profile.title image:[[UIImage imageNamed:@"user"] imageWithSize:tabBarIconSize] tag:RYTabIndexProfile]; + profileNavigationController.tabBarItem = tabBarItem; + return profileNavigationController; +} + +- (RYNavigationController *)audioDeck { + RYAudioDeckViewController *audioDeck = [[RYAudioDeckViewController alloc] initWithAudioDeck:[RYAudioDeck sharedAudioDeck]]; + RYNavigationController *audioDeckNagivationController = [[RYNavigationController alloc] initWithRootViewController:audioDeck]; + UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Audio Deck" image:[[UIImage imageNamed:@"audioPlaying"] imageWithSize:tabBarIconSize] tag:RYTabIndexAudioDeck]; + audioDeckNagivationController.tabBarItem = tabBarItem; + return audioDeckNagivationController; +} + +#pragma mark - UITabBarControllerDelegate + +- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { + +} + +@end diff --git a/Ryff/Data/Objects/RYTag.h b/Ryff/Classes/RYTag.h similarity index 92% rename from Ryff/Data/Objects/RYTag.h rename to Ryff/Classes/RYTag.h index 3fe0790..078038f 100644 --- a/Ryff/Data/Objects/RYTag.h +++ b/Ryff/Classes/RYTag.h @@ -30,4 +30,6 @@ + (NSArray *)getTagTags:(NSArray *)tags; ++ (NSArray *)dictionaryRepresentationForTags:(NSArray *)tags; + @end diff --git a/Ryff/Data/Objects/RYTag.m b/Ryff/Classes/RYTag.m similarity index 61% rename from Ryff/Data/Objects/RYTag.m rename to Ryff/Classes/RYTag.m index 54c79ba..f616c33 100644 --- a/Ryff/Data/Objects/RYTag.m +++ b/Ryff/Classes/RYTag.m @@ -14,6 +14,14 @@ // Data Objects #import "RYPost.h" +// Categories +#import "NSDictionary+Safety.h" +#import "NSMutableDictionary+Safety.h" + +static NSString *TagDictionaryKeyTag = @"tag"; +static NSString *TagDictionaryKeyNumUsers = @"num_users"; +static NSString *TagDictionaryKeyNumPosts = @"num_posts"; + @interface RYTag () @end @@ -33,9 +41,9 @@ - (RYTag *)initWithTag:(NSString *)tag numUsers:(NSInteger)numUsers numPosts:(NS + (RYTag *)tagFromDict:(NSDictionary *)tagDict { - NSString *tag = tagDict[@"tag"]; - NSInteger numUsers = [tagDict[@"num_users"] integerValue]; - NSInteger numPosts = [tagDict[@"num_posts"] integerValue]; + NSString *tag = [tagDict safeObjectForKey:TagDictionaryKeyTag]; + NSInteger numUsers = [[tagDict safeObjectForKey:TagDictionaryKeyNumUsers] integerValue]; + NSInteger numPosts = [[tagDict safeObjectForKey:TagDictionaryKeyNumPosts] integerValue]; return [[RYTag alloc] initWithTag:tag numUsers:numUsers numPosts:numPosts]; } @@ -87,4 +95,22 @@ - (void) postSucceeded:(NSArray *)posts page:(NSNumber *)page [[NSNotificationCenter defaultCenter] postNotificationName:kRetrievedTrendingPostNotification object:nil userInfo:@{@"tag": _tag}]; } +#pragma mark - Copying + +- (NSDictionary *)dictionaryRepresentation { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:4]; + [dictionary safelySetObject:self.tag forKey:TagDictionaryKeyTag]; + [dictionary safelySetObject:@(self.numUsers) forKey:TagDictionaryKeyNumUsers]; + [dictionary safelySetObject:@(self.numPosts) forKey:TagDictionaryKeyNumPosts]; + return dictionary; +} + ++ (NSArray *)dictionaryRepresentationForTags:(NSArray *)tags { + NSMutableArray *allTags = [[NSMutableArray alloc] initWithCapacity:tags.count]; + for (RYTag *tag in tags) { + [allTags addObject:[tag dictionaryRepresentation]]; + } + return allTags; +} + @end diff --git a/Ryff/TagList/RYTagCollectionViewCell.h b/Ryff/Classes/RYTagCollectionViewCell.h similarity index 100% rename from Ryff/TagList/RYTagCollectionViewCell.h rename to Ryff/Classes/RYTagCollectionViewCell.h diff --git a/Ryff/TagList/RYTagCollectionViewCell.m b/Ryff/Classes/RYTagCollectionViewCell.m similarity index 73% rename from Ryff/TagList/RYTagCollectionViewCell.m rename to Ryff/Classes/RYTagCollectionViewCell.m index cf9ebca..dbe539e 100644 --- a/Ryff/TagList/RYTagCollectionViewCell.m +++ b/Ryff/Classes/RYTagCollectionViewCell.m @@ -29,6 +29,22 @@ @interface RYTagCollectionViewCell () @implementation RYTagCollectionViewCell +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + + _tagLabel.font = [UIFont fontWithName:kBoldFont size:21.0f]; + _tagLabel.layer.shadowColor = [UIColor blackColor].CGColor; + _tagLabel.layer.shadowOffset = CGSizeMake(-1, 1); + _tagLabel.layer.shadowRadius = 2.0f; + + self.layer.cornerRadius = 35.0f; + self.clipsToBounds = YES; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tagUpdated:) name:kRetrievedTrendingPostNotification object:nil]; + } + return self; +} + - (void) configureWithTag:(RYTag *)tag { _currentTag = tag; @@ -56,21 +72,6 @@ - (void) configureWithTag:(RYTag *)tag #pragma mark - #pragma mark - LifeCycle -- (void) awakeFromNib -{ - [super awakeFromNib]; - - _tagLabel.font = [UIFont fontWithName:kBoldFont size:21.0f]; - _tagLabel.layer.shadowColor = [UIColor blackColor].CGColor; - _tagLabel.layer.shadowOffset = CGSizeMake(-1, 1); - _tagLabel.layer.shadowRadius = 2.0f; - - self.layer.cornerRadius = 35.0f; - self.clipsToBounds = YES; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tagUpdated:) name:kRetrievedTrendingPostNotification object:nil]; -} - - (void) prepareForReuse { [super prepareForReuse]; diff --git a/Ryff/Newsfeed/TagFeed/RYTagFeedViewController.h b/Ryff/Classes/RYTagFeedViewController.h similarity index 100% rename from Ryff/Newsfeed/TagFeed/RYTagFeedViewController.h rename to Ryff/Classes/RYTagFeedViewController.h diff --git a/Ryff/Newsfeed/TagFeed/RYTagFeedViewController.m b/Ryff/Classes/RYTagFeedViewController.m similarity index 100% rename from Ryff/Newsfeed/TagFeed/RYTagFeedViewController.m rename to Ryff/Classes/RYTagFeedViewController.m diff --git a/Ryff/TagList/RYTagList.h b/Ryff/Classes/RYTagList.h similarity index 100% rename from Ryff/TagList/RYTagList.h rename to Ryff/Classes/RYTagList.h diff --git a/Ryff/TagList/RYTagList.m b/Ryff/Classes/RYTagList.m similarity index 100% rename from Ryff/TagList/RYTagList.m rename to Ryff/Classes/RYTagList.m diff --git a/Ryff/TagList/RYTagListHeaderView.h b/Ryff/Classes/RYTagListHeaderView.h similarity index 100% rename from Ryff/TagList/RYTagListHeaderView.h rename to Ryff/Classes/RYTagListHeaderView.h diff --git a/Ryff/TagList/RYTagListHeaderView.m b/Ryff/Classes/RYTagListHeaderView.m similarity index 62% rename from Ryff/TagList/RYTagListHeaderView.m rename to Ryff/Classes/RYTagListHeaderView.m index ae8f9c3..3fbdfd1 100644 --- a/Ryff/TagList/RYTagListHeaderView.m +++ b/Ryff/Classes/RYTagListHeaderView.m @@ -22,17 +22,17 @@ @interface RYTagListHeaderView () @implementation RYTagListHeaderView -- (void) titleSection:(NSString *)title -{ - _titleLabel.text = title; +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _titleLabel.textColor = [RYStyleSheet darkTextColor]; +// [[BNRDynamicTypeManager sharedInstance] watchLabel:_titleLabel textStyle:UIFontTextStyleHeadline fontStyle:FONT_BOLD]; + } + return self; } -- (void) awakeFromNib +- (void) titleSection:(NSString *)title { - [super awakeFromNib]; - - _titleLabel.textColor = [RYStyleSheet darkTextColor]; - [[BNRDynamicTypeManager sharedInstance] watchLabel:_titleLabel textStyle:UIFontTextStyleHeadline fontStyle:FONT_BOLD]; + _titleLabel.text = title; } @end diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYTrackDownloadTableViewCell.h b/Ryff/Classes/RYTrackDownloadTableViewCell.h similarity index 100% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYTrackDownloadTableViewCell.h rename to Ryff/Classes/RYTrackDownloadTableViewCell.h diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYTrackDownloadTableViewCell.m b/Ryff/Classes/RYTrackDownloadTableViewCell.m similarity index 100% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RYTrackDownloadTableViewCell.m rename to Ryff/Classes/RYTrackDownloadTableViewCell.m diff --git a/Ryff/Data/Objects/RYUser.h b/Ryff/Classes/RYUser.h similarity index 77% rename from Ryff/Data/Objects/RYUser.h rename to Ryff/Classes/RYUser.h index fb91db4..310df52 100644 --- a/Ryff/Data/Objects/RYUser.h +++ b/Ryff/Classes/RYUser.h @@ -8,7 +8,14 @@ #import -@interface RYUser : NSObject +@class RYUser; + +@protocol RYUserDelegate +- (void)userUpdated:(RYUser *)user; +- (void)userUpdateFailed:(RYUser *)user reason:(NSString *)reason; +@end + +@interface RYUser : NSObject @property (nonatomic, assign) NSInteger userId; @property (nonatomic, strong) NSString *username; @@ -26,9 +33,18 @@ @property (nonatomic, strong) NSURL *avatarSmallURL; @property (nonatomic, strong) NSString *nickname; +// Delegate to notify when actions occur. +@property (nonatomic, weak) id delegate; + - (RYUser *)initWithUser:(NSInteger)userId username:(NSString *)username nickname:(NSString *)nickname karma:(NSInteger)karma bio:(NSString*)bio dateCreated:(NSDate *)dateCreated isFollowing:(BOOL)isFollowing numFollowers:(NSInteger)numFollowers numFollowing:(NSInteger)numFollowing tags:(NSArray *)tags; + (RYUser *)userFromDict:(NSDictionary*)userDict; + (NSArray *) usersFromDictArray:(NSArray *)dictArray; ++ (RYUser *)sampleUser; + +// Actions + +- (void)toggleFollowing; + @end diff --git a/Ryff/Classes/RYUser.m b/Ryff/Classes/RYUser.m new file mode 100644 index 0000000..23039ed --- /dev/null +++ b/Ryff/Classes/RYUser.m @@ -0,0 +1,215 @@ +// +// RYUser.m +// Ryff +// +// Created by Christopher Laganiere on 4/12/14. +// Copyright (c) 2014 Chris Laganiere. All rights reserved. +// + +#import "RYUser.h" + +// Data Objects +#import "RYPost.h" +#import "RYTag.h" + +// Data Managers +#import "RYServices.h" + +// Categories +#import "NSDictionary+Safety.h" +#import "NSMutableDictionary+Safety.h" + +// Update Notification Keys +static NSString *UserUpdatedNotificationKey = @"UserUpdatedNotificationKey"; +static NSString *UserNotificationKeyUserID = @"userId"; +static NSString *UserNotificationKeyUserData = @"user"; + +// Dictionary Representation Keys +static NSString *UserDictionaryKeyID = @"id"; +static NSString *UserDictionaryKeyUsername = @"username"; +static NSString *UserDictionaryKeyName = @"name"; +static NSString *UserDictionaryKeyKarma = @"karma"; +static NSString *UserDictionaryKeyBio = @"bio"; +static NSString *UserDictionaryKeyDateCreated = @"date_created"; +static NSString *UserDictionaryKeyIsFollowing = @"is_following"; +static NSString *UserDictionaryKeyNumFollowers = @"num_followers"; +static NSString *UserDictionaryKeyNumFollowing = @"num_following"; +static NSString *UserDictionaryKeyTags = @"tags"; +static NSString *UserDictionaryKeyAvatarURL = @"avatar_url"; +static NSString *UserDictionaryKeyAvatarSmallURL = @"avatar_url_small"; + +@interface RYUser () + +@end + +@implementation RYUser + +- (instancetype)init { + if (self = [super init]) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userUpdatedNotification:) name:UserUpdatedNotificationKey object:nil]; + } + return self; +} + +- (RYUser *)initWithUser:(NSInteger)userId username:(NSString *)username nickname:(NSString *)nickname karma:(NSInteger)karma bio:(NSString*)bio dateCreated:(NSDate *)dateCreated isFollowing:(BOOL)isFollowing numFollowers:(NSInteger)numFollowers numFollowing:(NSInteger)numFollowing tags:(NSArray *)tags +{ + if (self = [self init]) + { + _userId = userId; + _username = username; + _nickname = nickname; + _karma = karma; + _bio = bio; + _isFollowing = isFollowing; + _numFollowers = numFollowers; + _numFollowing = numFollowing; + _tags = tags; + } + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + ++ (RYUser *)userFromDict:(NSDictionary*)userDict +{ + NSNumber *userId = [userDict safeObjectForKey:UserDictionaryKeyID]; + NSString *username = [userDict safeObjectForKey:UserDictionaryKeyUsername]; + NSString *name = [userDict safeObjectForKey:UserDictionaryKeyName]; + NSNumber *karma = [userDict safeObjectForKey:UserDictionaryKeyKarma]; + NSString *bio = [userDict safeObjectForKey:UserDictionaryKeyBio]; + NSString *dateCreated = [userDict safeObjectForKey:UserDictionaryKeyDateCreated]; + BOOL isFollowing = [[userDict safeObjectForKey:UserDictionaryKeyIsFollowing] boolValue]; + NSInteger numFollowers = [[userDict safeObjectForKey:UserDictionaryKeyNumFollowers] intValue]; + NSInteger numFollowing = [[userDict safeObjectForKey:UserDictionaryKeyNumFollowing] intValue]; + NSArray *tags = [RYTag tagsFromDictArray:[userDict safeObjectForKey:UserDictionaryKeyTags]]; + + NSDate *date; + if (dateCreated) + { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; + date = [dateFormatter dateFromString:dateCreated]; + } + + RYUser *newUser = [[RYUser alloc] initWithUser:userId.intValue username:username nickname:name karma:karma.intValue bio:bio dateCreated:date isFollowing:isFollowing numFollowers:numFollowers numFollowing:numFollowing tags:tags]; + + if (userDict[@"avatar_url"] && [userDict[@"avatar_url"] length] > 0) + newUser.avatarURL = [NSURL URLWithString:userDict[@"avatar_url"]]; + if (userDict[@"avatar_small_url"] && [userDict[@"avatar_small_url"] length] > 0) + newUser.avatarSmallURL = [NSURL URLWithString:userDict[@"avatar_small_url"]]; + + + return newUser; +} + ++ (NSArray *) usersFromDictArray:(NSArray *)dictArray +{ + NSMutableArray *users = [[NSMutableArray alloc] initWithCapacity:dictArray.count]; + for (NSDictionary *userDict in dictArray) + { + RYUser *newUser = [RYUser userFromDict:userDict]; + [users addObject:newUser]; + } + return users; +} + ++ (RYUser *)sampleUser { + return [[RYUser alloc] initWithUser:1 username:@"dabeat" nickname:@"Pat" karma:3 bio:@"here's some stuff about me" dateCreated:[NSDate date] isFollowing:NO numFollowers:4 numFollowing:2 tags:@[]]; +} + +#pragma mark - Actions + +- (void)toggleFollowing { + [[RYServices sharedInstance] follow:!self.isFollowing user:self.userId forDelegate:self]; +} + +#pragma mark - FollowDelegate + +- (void)follow:(BOOL)following confirmedForUser:(RYUser *)user { + [self.delegate userUpdated:user]; + + NSDictionary *userInfo = @{UserNotificationKeyUserID: @(user.userId), UserNotificationKeyUserData: [user dictionaryRepresentation]}; + [[NSNotificationCenter defaultCenter] postNotificationName:UserUpdatedNotificationKey object:nil userInfo:userInfo]; +} + +- (void)followFailed:(NSString *)reason { + NSLog(@"Follow user %ld failed: %@", self.userId, reason); + [self.delegate userUpdateFailed:self reason:reason]; +} + +#pragma mark - Notifications + +- (void)userUpdatedNotification:(NSNotification *)notification { + NSNumber *userID = [notification.userInfo safeObjectForKey:UserNotificationKeyUserID]; + if (userID && userID.integerValue == self.userId) { + // Data updated, should copy changes. + NSDictionary *otherDict = [notification.userInfo safeObjectForKey:UserNotificationKeyUserData]; + if (otherDict) { + [self copyFromDictionary:otherDict]; + [self.delegate userUpdated:self]; + } + } +} + +#pragma mark - Copying + +- (NSDictionary *)dictionaryRepresentation { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:16]; + [dictionary safelySetObject:@(self.userId) forKey:UserDictionaryKeyID]; + [dictionary safelySetObject:self.username forKey:UserDictionaryKeyUsername]; + [dictionary safelySetObject:self.nickname forKey:UserDictionaryKeyName]; + [dictionary safelySetObject:self.bio forKey:UserDictionaryKeyBio]; + [dictionary safelySetObject:self.dateCreated forKey:UserDictionaryKeyBio]; + [dictionary safelySetObject:@(self.isFollowing) forKey:UserDictionaryKeyIsFollowing]; + [dictionary safelySetObject:@(self.numFollowers) forKey:UserDictionaryKeyNumFollowers]; + [dictionary safelySetObject:@(self.numFollowing) forKey:UserDictionaryKeyNumFollowing]; + [dictionary safelySetObject:self.avatarURL forKey:UserDictionaryKeyAvatarURL]; + [dictionary safelySetObject:self.avatarSmallURL forKey:UserDictionaryKeyAvatarSmallURL]; + [dictionary safelySetObject:[RYTag dictionaryRepresentationForTags:self.tags] forKey:UserDictionaryKeyTags]; + return dictionary; +} + +- (void)copyFromDictionary:(NSDictionary *)dictionaryRepresentation { + self.userId = [[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyID] integerValue]; + self.username = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyUsername]; + self.nickname = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyName]; + self.karma = [[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyKarma] integerValue]; + self.bio = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyBio]; + self.dateCreated = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyDateCreated]; + self.isFollowing = [[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyIsFollowing] boolValue]; + self.numFollowers = [[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyNumFollowers] integerValue]; + self.numFollowing = [[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyNumFollowing] integerValue]; + self.avatarURL = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyAvatarURL]; + self.avatarSmallURL = [dictionaryRepresentation safeObjectForKey:UserDictionaryKeyAvatarSmallURL]; + self.tags = [RYTag tagsFromDictArray:[dictionaryRepresentation safeObjectForKey:UserDictionaryKeyTags]]; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone { + RYUser *other = [[RYUser alloc] init]; + NSDictionary *dictionaryRepresentation = [self dictionaryRepresentation]; + [other copyFromDictionary:dictionaryRepresentation]; + return other; +} + +#pragma mark - NSObject + +- (BOOL) isEqual:(id)object { + BOOL equal = NO; + if ([object isKindOfClass:[RYUser class]]) + { + RYUser *other = (RYUser *)object; + if (other.userId == self.userId) + equal = YES; + } + return equal; +} + +- (NSUInteger)hash { + return self.userId; +} + +@end diff --git a/Ryff/Classes/RYUserFeedDataSource.h b/Ryff/Classes/RYUserFeedDataSource.h new file mode 100644 index 0000000..3d0caf3 --- /dev/null +++ b/Ryff/Classes/RYUserFeedDataSource.h @@ -0,0 +1,21 @@ +// +// RYUserFeedDataSource.h +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYPostsDataSource.h" + +@class RYUser; + +@interface RYUserFeedDataSource : RYPostsDataSource + +@property (nonatomic, readonly, nonnull) RYUser *user; + +- (nonnull instancetype)initWithUser:(RYUser * __nonnull)user NS_DESIGNATED_INITIALIZER; + ++ (RYPostsDataSource * __nonnull)postsDataSourceWithUser:(RYUser * __nullable)user; + +@end diff --git a/Ryff/Classes/RYUserFeedDataSource.m b/Ryff/Classes/RYUserFeedDataSource.m new file mode 100644 index 0000000..bc477d8 --- /dev/null +++ b/Ryff/Classes/RYUserFeedDataSource.m @@ -0,0 +1,53 @@ +// +// RYUserFeedDataSource.m +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#import "RYUserFeedDataSource.h" + +@interface RYUserFeedDataSource () + +@end + +@implementation RYUserFeedDataSource + +- (nonnull instancetype)initWithUser:(RYUser * __nonnull)user { + NSParameterAssert(user); + if (self = [super init]) { + _user = user; + } + return self; +} + ++ (RYPostsDataSource * __nonnull)postsDataSourceWithUser:(RYUser * __nullable)user { + if (user) { + return [[RYUserFeedDataSource alloc] initWithUser:user]; + } + else { + return [[RYPostsDataSource alloc] init]; + } +} + +#pragma mark - Private + +- (void)fetchContent:(NSInteger)page { + if (page <= 1) { + [[RYServices sharedInstance] getUserWithId:@(_user.userId) orUsername:nil delegate:self]; + } + [[RYServices sharedInstance] getUserPostsForUser:_user.userId page:@(page) delegate:self]; +} + +#pragma mark - UsersDelegate + +- (void)retrievedUsers:(NSArray *)users { + RYUser *user = users.firstObject; + if (user) { + _user = user; + [self.delegate contentUpdated]; + } +} + +@end diff --git a/Ryff/Newsfeed/UserList/RYUserListCollectionViewCell.h b/Ryff/Classes/RYUserListCollectionViewCell.h similarity index 100% rename from Ryff/Newsfeed/UserList/RYUserListCollectionViewCell.h rename to Ryff/Classes/RYUserListCollectionViewCell.h diff --git a/Ryff/Newsfeed/UserList/RYUserListCollectionViewCell.m b/Ryff/Classes/RYUserListCollectionViewCell.m similarity index 100% rename from Ryff/Newsfeed/UserList/RYUserListCollectionViewCell.m rename to Ryff/Classes/RYUserListCollectionViewCell.m diff --git a/Ryff/Newsfeed/UserList/RYUserListViewController.h b/Ryff/Classes/RYUserListViewController.h similarity index 100% rename from Ryff/Newsfeed/UserList/RYUserListViewController.h rename to Ryff/Classes/RYUserListViewController.h diff --git a/Ryff/Newsfeed/UserList/RYUserListViewController.m b/Ryff/Classes/RYUserListViewController.m similarity index 100% rename from Ryff/Newsfeed/UserList/RYUserListViewController.m rename to Ryff/Classes/RYUserListViewController.m diff --git a/Ryff/Classes/RYUserProfileTableViewCell.swift b/Ryff/Classes/RYUserProfileTableViewCell.swift new file mode 100644 index 0000000..f0835bc --- /dev/null +++ b/Ryff/Classes/RYUserProfileTableViewCell.swift @@ -0,0 +1,74 @@ +// +// RYUserProfileTableViewCell.swift +// Ryff +// +// Created by Chris Laganiere on 9/5/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import UIKit + +class RYUserProfileTableViewCell: UITableViewCell { + + private let avatarImageView = UIImageView(frame: CGRectZero) + private let usernameLabel = UILabel(frame: CGRectZero) + private let userBioTextView = RYPostTextView(frame: CGRectZero) + + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + backgroundColor = UIColor.clearColor() + + RYStyleSheet.styleProfileImageView(avatarImageView) + avatarImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(avatarImageView) + + usernameLabel.textAlignment = .Center + usernameLabel.translatesAutoresizingMaskIntoConstraints = false + addSubview(usernameLabel) + + userBioTextView.translatesAutoresizingMaskIntoConstraints = false + addSubview(userBioTextView) + + NSLayoutConstraint.activateConstraints(subviewConstraints()) + } + + @available(*, unavailable) + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Styling + + func styleWithUser(user: RYUser) { + avatarImageView.sd_setImageWithURL(user.avatarURL) + usernameLabel.text = user.username + userBioTextView.text = user.bio + } + + // MARK: Layout + + private func subviewConstraints() -> [NSLayoutConstraint] { + let viewsDict = ["avatar": avatarImageView, "username": usernameLabel, "bio": userBioTextView] + let metrics = ["padding": Constants.Global.ElementPadding, "avatarHeight": Constants.User.AvatarHeight, "maxWidth": Constants.Global.ContentMaximumWidth] + + var constraints: [NSLayoutConstraint] = [] + + // Avatar + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=padding)-[avatar(avatarHeight)]-(>=padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: avatarImageView, attribute: .CenterX, relatedBy: .Equal, toItem: avatarImageView.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + + // Username Label + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=padding,==padding@900)-[username(<=maxWidth)]-(>=padding,==padding@900)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: usernameLabel, attribute: .CenterX, relatedBy: .Equal, toItem: usernameLabel.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + + // User Bio TextView + constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|-(>=padding,==padding@900)-[bio(<=maxWidth)]-(>=padding,==padding@900)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + constraints += [NSLayoutConstraint(item: userBioTextView, attribute: .CenterX, relatedBy: .Equal, toItem: userBioTextView.superview, attribute: .CenterX, multiplier: 1.0, constant: 0.0)] + + + constraints += NSLayoutConstraint.constraintsWithVisualFormat("V:|-(padding)-[avatar(avatarHeight)]-(padding)-[username]-(padding)-[bio]-(padding)-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: metrics, views: viewsDict) + return constraints + } + +} diff --git a/Ryff/Constants.swift b/Ryff/Constants.swift new file mode 100644 index 0000000..5c8b9d9 --- /dev/null +++ b/Ryff/Constants.swift @@ -0,0 +1,43 @@ +// +// Constants.swift +// Ryff +// +// Created by Chris Laganiere on 9/6/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +import Foundation + +struct Constants { + + struct Global { + static let ContentMaximumWidth: CGFloat = 500 + static let ElementPadding: CGFloat = 15 + static let RelatedElementPadding: CGFloat = 8 + } + + struct Post { + static let MinimumImageHeight: CGFloat = 150 + static let FooterHeight: CGFloat = 45 + static let AudioActionHeightSmall: CGFloat = 15 + static let AudioActionHeightLarge: CGFloat = 20 + static let AudioActionPadding: CGFloat = 10 + } + + struct User { + static let AvatarHeight: CGFloat = 60 + } + + struct Mixer { + static let PadSpacingRegular: CGFloat = 30 + static let PadSpacingCompact: CGFloat = 20 + static let ActionDimensionSmall: CGFloat = 15 + static let ActionDimensionLarge: CGFloat = 20 + } + + struct AudioDeck { + static let ConsolePostImageDimensionCompact: CGFloat = 50 + static let ConsolePostImageDimensionRegular: CGFloat = 100 + } + +} diff --git a/Ryff/Data/Objects/RYUser.m b/Ryff/Data/Objects/RYUser.m deleted file mode 100644 index 712a2bf..0000000 --- a/Ryff/Data/Objects/RYUser.m +++ /dev/null @@ -1,86 +0,0 @@ -// -// RYUser.m -// Ryff -// -// Created by Christopher Laganiere on 4/12/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import "RYUser.h" - -// Data Objects -#import "RYPost.h" -#import "RYTag.h" - -@implementation RYUser - -- (RYUser *)initWithUser:(NSInteger)userId username:(NSString *)username nickname:(NSString *)nickname karma:(NSInteger)karma bio:(NSString*)bio dateCreated:(NSDate *)dateCreated isFollowing:(BOOL)isFollowing numFollowers:(NSInteger)numFollowers numFollowing:(NSInteger)numFollowing tags:(NSArray *)tags -{ - if (self = [super init]) - { - _userId = userId; - _username = username; - _nickname = nickname; - _karma = karma; - _bio = bio; - _isFollowing = isFollowing; - _numFollowers = numFollowers; - _numFollowing = numFollowing; - _tags = tags; - } - return self; -} - -+ (RYUser *)userFromDict:(NSDictionary*)userDict -{ - NSNumber *userId = [userDict objectForKey:@"id"]; - NSString *username = [userDict objectForKey:@"username"]; - NSString *name = [userDict objectForKey:@"name"]; - NSNumber *karma = [userDict objectForKey:@"karma"]; - NSString *bio = [userDict objectForKey:@"bio"]; - NSString *dateCreated = [userDict objectForKey:@"date_created"]; - BOOL isFollowing = [[userDict objectForKey:@"is_following"] boolValue]; - NSInteger numFollowers = [[userDict objectForKey:@"num_followers"] intValue]; - NSInteger numFollowing = [[userDict objectForKey:@"num_following"] intValue]; - NSArray *tags = [RYTag tagsFromDictArray:[userDict objectForKey:@"tags"]]; - - NSDate *date; - if (dateCreated) - { - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; - date = [dateFormatter dateFromString:dateCreated]; - } - - RYUser *newUser = [[RYUser alloc] initWithUser:userId.intValue username:username nickname:name karma:karma.intValue bio:bio dateCreated:date isFollowing:isFollowing numFollowers:numFollowers numFollowing:numFollowing tags:tags]; - - if (userDict[@"avatar_url"] && [userDict[@"avatar_url"] length] > 0) - newUser.avatarURL = [NSURL URLWithString:userDict[@"avatar_url"]]; - if (userDict[@"avatar_small_url"] && [userDict[@"avatar_small_url"] length] > 0) - newUser.avatarSmallURL = [NSURL URLWithString:userDict[@"avatar_small_url"]]; - - - return newUser; -} - -+ (NSArray *) usersFromDictArray:(NSArray *)dictArray -{ - NSMutableArray *users = [[NSMutableArray alloc] initWithCapacity:dictArray.count]; - for (NSDictionary *userDict in dictArray) - { - RYUser *newUser = [RYUser userFromDict:userDict]; - [users addObject:newUser]; - } - return users; -} - --(id)copyWithZone:(NSZone *)zone -{ - // We'll ignore the zone for now - RYUser *newUser = [[RYUser alloc] initWithUser:self.userId username:self.username nickname:self.nickname karma:self.karma bio:self.bio dateCreated:self.dateCreated isFollowing:self.isFollowing numFollowers:self.numFollowers numFollowing:self.numFollowing tags:self.tags]; - newUser.avatarURL = _avatarURL; - newUser.avatarSmallURL = _avatarSmallURL; - return newUser; -} - -@end diff --git a/Ryff/Data/SSKeychain/en.lproj/SSKeychain.strings b/Ryff/Data/SSKeychain/en.lproj/SSKeychain.strings deleted file mode 100755 index faeb205..0000000 Binary files a/Ryff/Data/SSKeychain/en.lproj/SSKeychain.strings and /dev/null differ diff --git a/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.h b/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.h index d7b0e04..bead4fc 100755 --- a/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.h +++ b/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.h @@ -15,10 +15,10 @@ size. */ -typedef enum : NSUInteger { - FONT_REGULAR = 0, - FONT_BOLD, -} FontStyle; +typedef NS_ENUM(NSInteger, FontStyle) { + FontStyleRegular = 0, + FontStyleBold +}; @interface BNRDynamicTypeManager : NSObject diff --git a/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.m b/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.m index f985c2d..f3b3cf4 100755 --- a/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.m +++ b/Ryff/Frameworks/BNRDynamicTypeManager/Core/BNRDynamicTypeManager.m @@ -125,10 +125,14 @@ - (void)watchElement:(id)element fontKeypath:(NSString *)fontKeypath textStyle:( } if (fontKeypath && style) { - if (fontStyle == FONT_REGULAR) - [element setValue:[RYStyleSheet customFontForTextStyle:style] forKeyPath:fontKeypath]; - else if (fontStyle == FONT_BOLD) - [element setValue:[RYStyleSheet boldCustomFontForTextStyle:style] forKey:fontKeypath]; + switch (fontStyle) { + case FontStyleRegular: + [element setValue:[RYStyleSheet customFontForTextStyle:style] forKeyPath:fontKeypath]; + break; + case FontStyleBold: + [element setValue:[RYStyleSheet boldCustomFontForTextStyle:style] forKey:fontKeypath]; + break; + } BNRDynamicTypeTuple *tuple = [[BNRDynamicTypeTuple alloc] initWithKeypath:fontKeypath textStyle:style fontStyle:fontStyle]; [self.elementToTupleTable setObject:tuple @@ -144,10 +148,14 @@ - (void)noteContentSizeCategoryDidChange:(NSNotification *)note // UIContentSize for (id element in elementToTupleTable) { BNRDynamicTypeTuple *tuple = [elementToTupleTable objectForKey:element]; - if (tuple.fontStyle == FONT_REGULAR) - [element setValue:[RYStyleSheet customFontForTextStyle:tuple.textStyle] forKeyPath:tuple.keypath]; - else if (tuple.fontStyle == FONT_BOLD) - [element setValue:[RYStyleSheet boldCustomFontForTextStyle:tuple.textStyle] forKey:tuple.keypath]; + switch (tuple.fontStyle) { + case FontStyleRegular: + [element setValue:[RYStyleSheet customFontForTextStyle:tuple.textStyle] forKeyPath:tuple.keypath]; + break; + case FontStyleBold: + [element setValue:[RYStyleSheet boldCustomFontForTextStyle:tuple.textStyle] forKey:tuple.keypath]; + break; + } } } diff --git a/Ryff/UI/Custom/BlockAlert/BlockAlertView.h b/Ryff/Frameworks/BlockAlert/BlockAlertView.h similarity index 100% rename from Ryff/UI/Custom/BlockAlert/BlockAlertView.h rename to Ryff/Frameworks/BlockAlert/BlockAlertView.h diff --git a/Ryff/UI/Custom/BlockAlert/BlockAlertView.m b/Ryff/Frameworks/BlockAlert/BlockAlertView.m similarity index 100% rename from Ryff/UI/Custom/BlockAlert/BlockAlertView.m rename to Ryff/Frameworks/BlockAlert/BlockAlertView.m diff --git a/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.h b/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.h deleted file mode 100755 index e7f9903..0000000 --- a/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.h +++ /dev/null @@ -1,124 +0,0 @@ -// -// MKAnnotationView+WebCache.h -// SDWebImage -// -// Created by Olivier Poitrey on 14/03/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// - -#import "MapKit/MapKit.h" -#import "SDWebImageManager.h" - -/** - * Integrates SDWebImage async downloading and caching of remote images with MKAnnotationView. - */ -@interface MKAnnotationView (WebCache) - -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use sd_setImage: directly. - */ -- (NSURL *)sd_imageURL; - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - */ -- (void)sd_setImageWithURL:(NSURL *)url; - -/** - * Set the imageView `image` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @see sd_setImageWithURL:placeholderImage:options: - */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ - -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrived from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrived from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrived from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; - -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentImageLoad; - -@end - - -@interface MKAnnotationView (WebCacheDeprecated) - -- (NSURL *)imageURL __deprecated_msg("Use `sd_imageURL`"); - -- (void)setImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:`"); - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:completed:`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelCurrentImageLoad`"); - -@end diff --git a/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.m b/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.m deleted file mode 100755 index cc75da0..0000000 --- a/Ryff/Frameworks/SDWebImage/MKAnnotationView+WebCache.m +++ /dev/null @@ -1,126 +0,0 @@ -// -// MKAnnotationView+WebCache.m -// SDWebImage -// -// Created by Olivier Poitrey on 14/03/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// - -#import "MKAnnotationView+WebCache.h" -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" - -static char imageURLKey; - -@implementation MKAnnotationView (WebCache) - -- (NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - -- (void)sd_setImageWithURL:(NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:nil]; -} - -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:nil]; -} - -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_cancelCurrentImageLoad]; - - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - self.image = placeholder; - - if (url) { - __weak MKAnnotationView *wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong MKAnnotationView *sself = wself; - if (!sself) return; - if (image) { - sself.image = image; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:@"MKAnnotationViewImage"]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"MKAnnotationViewImage"]; -} - -@end - - -@implementation MKAnnotationView (WebCacheDeprecated) - -- (NSURL *)imageURL { - return [self sd_imageURL]; -} - -- (void)setImageWithURL:(NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentImageLoad { - [self sd_cancelCurrentImageLoad]; -} - -@end diff --git a/Ryff/Frameworks/SDWebImage/UIImage+WebP.h b/Ryff/Frameworks/SDWebImage/UIImage+WebP.h deleted file mode 100755 index b791e6f..0000000 --- a/Ryff/Frameworks/SDWebImage/UIImage+WebP.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// UIImage+WebP.h -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// - -#ifdef SD_WEBP - -#import - -// Fix for issue #416 Undefined symbols for architecture armv7 since WebP introduction when deploying to device -void WebPInitPremultiplyNEON(void); - -void WebPInitUpsamplersNEON(void); - -void VP8DspInitNEON(void); - -@interface UIImage (WebP) - -+ (UIImage *)sd_imageWithWebPData:(NSData *)data; - -@end - -#endif diff --git a/Ryff/Frameworks/SDWebImage/UIImage+WebP.m b/Ryff/Frameworks/SDWebImage/UIImage+WebP.m deleted file mode 100755 index e6e8464..0000000 --- a/Ryff/Frameworks/SDWebImage/UIImage+WebP.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// UIImage+WebP.m -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// - -#ifdef SD_WEBP -#import "UIImage+WebP.h" -#import "webp/decode.h" - -// Callback for CGDataProviderRelease -static void FreeImageData(void *info, const void *data, size_t size) -{ - free((void *)data); -} - -@implementation UIImage (WebP) - -+ (UIImage *)sd_imageWithWebPData:(NSData *)data { - WebPDecoderConfig config; - if (!WebPInitDecoderConfig(&config)) { - return nil; - } - - config.output.colorspace = MODE_rgbA; - config.options.use_threads = 1; - - // Decode the WebP image data into a RGBA value array. - if (WebPDecode(data.bytes, data.length, &config) != VP8_STATUS_OK) { - return nil; - } - - int width = config.input.width; - int height = config.input.height; - if (config.options.use_scaling) { - width = config.options.scaled_width; - height = config.options.scaled_height; - } - - // Construct a UIImage from the decoded RGBA value array. - CGDataProviderRef provider = - CGDataProviderCreateWithData(NULL, config.output.u.RGBA.rgba, config.output.u.RGBA.size, FreeImageData); - CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); - CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast; - CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; - CGImageRef imageRef = CGImageCreate(width, height, 8, 32, 4 * width, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); - - CGColorSpaceRelease(colorSpaceRef); - CGDataProviderRelease(provider); - - UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; - CGImageRelease(imageRef); - - return image; -} - -@end - -#if !COCOAPODS -// Functions to resolve some undefined symbols when using WebP and force_load flag -void WebPInitPremultiplyNEON(void) {} -void WebPInitUpsamplersNEON(void) {} -void VP8DspInitNEON(void) {} -#endif - -#endif diff --git a/Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.m b/Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.m deleted file mode 100755 index 689ae9a..0000000 --- a/Ryff/Frameworks/UIKit+AFNetworking/UIButton+AFNetworking.m +++ /dev/null @@ -1,185 +0,0 @@ -// UIButton+AFNetworking.m -// -// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "UIButton+AFNetworking.h" - -#import - -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) - -#import "AFHTTPRequestOperation.h" - -@interface UIButton (_AFNetworking) -@property (readwrite, nonatomic, strong, setter = af_setImageRequestOperation:) AFHTTPRequestOperation *af_imageRequestOperation; -@property (readwrite, nonatomic, strong, setter = af_setBackgroundImageRequestOperation:) AFHTTPRequestOperation *af_backgroundImageRequestOperation; -@end - -@implementation UIButton (_AFNetworking) - -+ (NSOperationQueue *)af_sharedImageRequestOperationQueue { - static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; - _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; - }); - - return _af_sharedImageRequestOperationQueue; -} - -- (AFHTTPRequestOperation *)af_imageRequestOperation { - return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_imageRequestOperation)); -} - -- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation { - objc_setAssociatedObject(self, @selector(af_imageRequestOperation), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (AFHTTPRequestOperation *)af_backgroundImageRequestOperation { - return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_backgroundImageRequestOperation)); -} - -- (void)af_setBackgroundImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation { - objc_setAssociatedObject(self, @selector(af_backgroundImageRequestOperation), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -@end - -#pragma mark - - -@implementation UIButton (AFNetworking) - -- (void)setImageForState:(UIControlState)state - withURL:(NSURL *)url -{ - [self setImageForState:state withURL:url placeholderImage:nil]; -} - -- (void)setImageForState:(UIControlState)state - withURL:(NSURL *)url - placeholderImage:(UIImage *)placeholderImage -{ - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; - - [self setImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; -} - -- (void)setImageForState:(UIControlState)state - withURLRequest:(NSURLRequest *)urlRequest - placeholderImage:(UIImage *)placeholderImage - success:(void (^)(NSHTTPURLResponse *response, UIImage *image))success - failure:(void (^)(NSError *error))failure -{ - [self cancelImageRequestOperation]; - - [self setImage:placeholderImage forState:state]; - - __weak __typeof(self)weakSelf = self; - self.af_imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; - self.af_imageRequestOperation.responseSerializer = [AFImageResponseSerializer serializer]; - [self.af_imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { - __strong __typeof(weakSelf)strongSelf = weakSelf; - if ([[urlRequest URL] isEqual:[operation.request URL]]) { - if (success) { - success(operation.response, responseObject); - } else if (responseObject) { - [strongSelf setImage:responseObject forState:state]; - } - } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if ([[urlRequest URL] isEqual:[operation.response URL]]) { - if (failure) { - failure(error); - } - } - }]; - - [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation]; -} - -#pragma mark - - -- (void)setBackgroundImageForState:(UIControlState)state - withURL:(NSURL *)url -{ - [self setBackgroundImageForState:state withURL:url placeholderImage:nil]; -} - -- (void)setBackgroundImageForState:(UIControlState)state - withURL:(NSURL *)url - placeholderImage:(UIImage *)placeholderImage -{ - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; - - [self setBackgroundImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; -} - -- (void)setBackgroundImageForState:(UIControlState)state - withURLRequest:(NSURLRequest *)urlRequest - placeholderImage:(UIImage *)placeholderImage - success:(void (^)(NSHTTPURLResponse *response, UIImage *image))success - failure:(void (^)(NSError *error))failure -{ - [self cancelBackgroundImageRequestOperation]; - - [self setBackgroundImage:placeholderImage forState:state]; - - __weak __typeof(self)weakSelf = self; - self.af_backgroundImageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; - self.af_backgroundImageRequestOperation.responseSerializer = [AFImageResponseSerializer serializer]; - [self.af_backgroundImageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { - __strong __typeof(weakSelf)strongSelf = weakSelf; - if ([[urlRequest URL] isEqual:[operation.request URL]]) { - if (success) { - success(operation.response, responseObject); - } else if (responseObject) { - [strongSelf setBackgroundImage:responseObject forState:state]; - } - } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if ([[urlRequest URL] isEqual:[operation.response URL]]) { - if (failure) { - failure(error); - } - } - }]; - - [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_backgroundImageRequestOperation]; -} - -#pragma mark - - -- (void)cancelImageRequestOperation { - [self.af_imageRequestOperation cancel]; - self.af_imageRequestOperation = nil; -} - -- (void)cancelBackgroundImageRequestOperation { - [self.af_backgroundImageRequestOperation cancel]; - self.af_backgroundImageRequestOperation = nil; -} - -@end - -#endif diff --git a/Ryff/Images.xcassets/AppIcon.appiconset/Contents.json b/Ryff/Images.xcassets/AppIcon.appiconset/Contents.json index a396706..118c98f 100644 --- a/Ryff/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Ryff/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,15 +5,30 @@ "size" : "29x29", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" } ], "info" : { diff --git a/Ryff/Images.xcassets/Ryff Icon.appiconset/Contents.json b/Ryff/Images.xcassets/Ryff Icon.appiconset/Contents.json index 7913ae8..9e634a0 100644 --- a/Ryff/Images.xcassets/Ryff Icon.appiconset/Contents.json +++ b/Ryff/Images.xcassets/Ryff Icon.appiconset/Contents.json @@ -12,12 +12,22 @@ "filename" : "AppIcon29x29@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "size" : "40x40", "idiom" : "iphone", "filename" : "AppIcon40x40.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "size" : "57x57", "idiom" : "iphone", @@ -36,6 +46,11 @@ "filename" : "AppIcon60x60@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "ipad", diff --git a/Ryff/Images.xcassets/first.imageset/first.png b/Ryff/Images.xcassets/first.imageset/first.png deleted file mode 100644 index 9300ee2..0000000 Binary files a/Ryff/Images.xcassets/first.imageset/first.png and /dev/null differ diff --git a/Ryff/Images.xcassets/first.imageset/first@2x.png b/Ryff/Images.xcassets/first.imageset/first@2x.png deleted file mode 100644 index 374d78e..0000000 Binary files a/Ryff/Images.xcassets/first.imageset/first@2x.png and /dev/null differ diff --git a/Ryff/Images.xcassets/second.imageset/Contents.json b/Ryff/Images.xcassets/second.imageset/Contents.json deleted file mode 100644 index 2136402..0000000 --- a/Ryff/Images.xcassets/second.imageset/Contents.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x", - "filename" : "second.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "second@2x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Ryff/Images.xcassets/second.imageset/second.png b/Ryff/Images.xcassets/second.imageset/second.png deleted file mode 100644 index 1100b48..0000000 Binary files a/Ryff/Images.xcassets/second.imageset/second.png and /dev/null differ diff --git a/Ryff/Images.xcassets/second.imageset/second@2x.png b/Ryff/Images.xcassets/second.imageset/second@2x.png deleted file mode 100644 index 368d38f..0000000 Binary files a/Ryff/Images.xcassets/second.imageset/second@2x.png and /dev/null differ diff --git a/Ryff/Images/2_0/airplayIcon@2x.png b/Ryff/Images/2_0/airplayIcon@2x.png new file mode 100644 index 0000000..2ef0c1f Binary files /dev/null and b/Ryff/Images/2_0/airplayIcon@2x.png differ diff --git a/Ryff/Images/2_0/audioPlaying@2x.png b/Ryff/Images/2_0/audioPlaying@2x.png new file mode 100644 index 0000000..2ca3109 Binary files /dev/null and b/Ryff/Images/2_0/audioPlaying@2x.png differ diff --git a/Ryff/Images/2_0/create@2x.png b/Ryff/Images/2_0/create@2x.png new file mode 100644 index 0000000..2dbc4ee Binary files /dev/null and b/Ryff/Images/2_0/create@2x.png differ diff --git a/Ryff/Images/2_0/deck_next@2x.png b/Ryff/Images/2_0/deck_next@2x.png new file mode 100644 index 0000000..19baa78 Binary files /dev/null and b/Ryff/Images/2_0/deck_next@2x.png differ diff --git a/Ryff/Images/2_0/deck_pause@2x.png b/Ryff/Images/2_0/deck_pause@2x.png new file mode 100644 index 0000000..7b9caba Binary files /dev/null and b/Ryff/Images/2_0/deck_pause@2x.png differ diff --git a/Ryff/Images/2_0/deck_play@2x.png b/Ryff/Images/2_0/deck_play@2x.png new file mode 100644 index 0000000..9291bf6 Binary files /dev/null and b/Ryff/Images/2_0/deck_play@2x.png differ diff --git a/Ryff/Images/2_0/deck_remix@2x.png b/Ryff/Images/2_0/deck_remix@2x.png new file mode 100644 index 0000000..7c139aa Binary files /dev/null and b/Ryff/Images/2_0/deck_remix@2x.png differ diff --git a/Ryff/Images/2_0/globe@2x.png b/Ryff/Images/2_0/globe@2x.png new file mode 100644 index 0000000..59de546 Binary files /dev/null and b/Ryff/Images/2_0/globe@2x.png differ diff --git a/Ryff/Images/2_0/notification@2x.png b/Ryff/Images/2_0/notification@2x.png new file mode 100644 index 0000000..2413216 Binary files /dev/null and b/Ryff/Images/2_0/notification@2x.png differ diff --git a/Ryff/Images/2_0/play@2x.png b/Ryff/Images/2_0/play@2x.png new file mode 100644 index 0000000..d4c76f8 Binary files /dev/null and b/Ryff/Images/2_0/play@2x.png differ diff --git a/Ryff/Images/2_0/plus@2x.png b/Ryff/Images/2_0/plus@2x.png new file mode 100644 index 0000000..e6f187a Binary files /dev/null and b/Ryff/Images/2_0/plus@2x.png differ diff --git a/Ryff/Images/2_0/remix@2x.png b/Ryff/Images/2_0/remix@2x.png new file mode 100644 index 0000000..8640e62 Binary files /dev/null and b/Ryff/Images/2_0/remix@2x.png differ diff --git a/Ryff/Images/2_0/reset@2x.png b/Ryff/Images/2_0/reset@2x.png new file mode 100644 index 0000000..196c5f2 Binary files /dev/null and b/Ryff/Images/2_0/reset@2x.png differ diff --git a/Ryff/Images/2_0/sliderSmall@2x.png b/Ryff/Images/2_0/sliderSmall@2x.png new file mode 100644 index 0000000..9f2f59c Binary files /dev/null and b/Ryff/Images/2_0/sliderSmall@2x.png differ diff --git a/Ryff/Images/2_0/star@2x.png b/Ryff/Images/2_0/star@2x.png new file mode 100644 index 0000000..8ed8f43 Binary files /dev/null and b/Ryff/Images/2_0/star@2x.png differ diff --git a/Ryff/Images/2_0/stream@2x.png b/Ryff/Images/2_0/stream@2x.png new file mode 100644 index 0000000..5a878f0 Binary files /dev/null and b/Ryff/Images/2_0/stream@2x.png differ diff --git a/Ryff/Images/2_0/userIcon@2x.png b/Ryff/Images/2_0/userIcon@2x.png new file mode 100644 index 0000000..466b76e Binary files /dev/null and b/Ryff/Images/2_0/userIcon@2x.png differ diff --git a/Ryff/Images/2_0/x@2x.png b/Ryff/Images/2_0/x@2x.png new file mode 100644 index 0000000..273953c Binary files /dev/null and b/Ryff/Images/2_0/x@2x.png differ diff --git a/Ryff/Launch Screen.storyboard b/Ryff/Launch Screen.storyboard new file mode 100644 index 0000000..e90adf6 --- /dev/null +++ b/Ryff/Launch Screen.storyboard @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ryff/Main.storyboard b/Ryff/Main.storyboard index 7e8d9ae..d8d1780 100644 --- a/Ryff/Main.storyboard +++ b/Ryff/Main.storyboard @@ -509,7 +509,7 @@ - + diff --git a/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/Contents.json new file mode 100644 index 0000000..15c3bd5 --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "airplayIcon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/airplayIcon@2x.png b/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/airplayIcon@2x.png new file mode 100644 index 0000000..2ef0c1f Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/airplayIcon.imageset/airplayIcon@2x.png differ diff --git a/Ryff/Media.xcassets/audio deck/deck_next.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/deck_next.imageset/Contents.json new file mode 100644 index 0000000..5f65d39 --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/deck_next.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "deck_next@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/deck_next.imageset/deck_next@2x.png b/Ryff/Media.xcassets/audio deck/deck_next.imageset/deck_next@2x.png new file mode 100644 index 0000000..19baa78 Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/deck_next.imageset/deck_next@2x.png differ diff --git a/Ryff/Media.xcassets/audio deck/deck_pause.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/deck_pause.imageset/Contents.json new file mode 100644 index 0000000..b6f0926 --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/deck_pause.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "deck_pause@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/deck_pause.imageset/deck_pause@2x.png b/Ryff/Media.xcassets/audio deck/deck_pause.imageset/deck_pause@2x.png new file mode 100644 index 0000000..7b9caba Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/deck_pause.imageset/deck_pause@2x.png differ diff --git a/Ryff/Media.xcassets/audio deck/deck_play.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/deck_play.imageset/Contents.json new file mode 100644 index 0000000..ce1547c --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/deck_play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "deck_play@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/deck_play.imageset/deck_play@2x.png b/Ryff/Media.xcassets/audio deck/deck_play.imageset/deck_play@2x.png new file mode 100644 index 0000000..9291bf6 Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/deck_play.imageset/deck_play@2x.png differ diff --git a/Ryff/Media.xcassets/audio deck/deck_remix.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/deck_remix.imageset/Contents.json new file mode 100644 index 0000000..b42152c --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/deck_remix.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "deck_remix@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/deck_remix.imageset/deck_remix@2x.png b/Ryff/Media.xcassets/audio deck/deck_remix.imageset/deck_remix@2x.png new file mode 100644 index 0000000..7c139aa Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/deck_remix.imageset/deck_remix@2x.png differ diff --git a/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/Contents.json b/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/Contents.json new file mode 100644 index 0000000..2612cf5 --- /dev/null +++ b/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sliderSmall@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/sliderSmall@2x.png b/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/sliderSmall@2x.png new file mode 100644 index 0000000..9f2f59c Binary files /dev/null and b/Ryff/Media.xcassets/audio deck/sliderSmall.imageset/sliderSmall@2x.png differ diff --git a/Ryff/Media.xcassets/audioPlaying.imageset/Contents.json b/Ryff/Media.xcassets/audioPlaying.imageset/Contents.json new file mode 100644 index 0000000..b58d63d --- /dev/null +++ b/Ryff/Media.xcassets/audioPlaying.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "audioPlaying@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/audioPlaying.imageset/audioPlaying@2x.png b/Ryff/Media.xcassets/audioPlaying.imageset/audioPlaying@2x.png new file mode 100644 index 0000000..2ca3109 Binary files /dev/null and b/Ryff/Media.xcassets/audioPlaying.imageset/audioPlaying@2x.png differ diff --git a/Ryff/Media.xcassets/create.imageset/Contents.json b/Ryff/Media.xcassets/create.imageset/Contents.json new file mode 100644 index 0000000..0ccdf60 --- /dev/null +++ b/Ryff/Media.xcassets/create.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "create@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/create.imageset/create@2x.png b/Ryff/Media.xcassets/create.imageset/create@2x.png new file mode 100644 index 0000000..2dbc4ee Binary files /dev/null and b/Ryff/Media.xcassets/create.imageset/create@2x.png differ diff --git a/Ryff/Media.xcassets/globe.imageset/Contents.json b/Ryff/Media.xcassets/globe.imageset/Contents.json new file mode 100644 index 0000000..c8ef159 --- /dev/null +++ b/Ryff/Media.xcassets/globe.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "globe@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/globe.imageset/globe@2x.png b/Ryff/Media.xcassets/globe.imageset/globe@2x.png new file mode 100644 index 0000000..59de546 Binary files /dev/null and b/Ryff/Media.xcassets/globe.imageset/globe@2x.png differ diff --git a/Ryff/Media.xcassets/notification.imageset/Contents.json b/Ryff/Media.xcassets/notification.imageset/Contents.json new file mode 100644 index 0000000..2a3ed5f --- /dev/null +++ b/Ryff/Media.xcassets/notification.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "notification@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/notification.imageset/notification@2x.png b/Ryff/Media.xcassets/notification.imageset/notification@2x.png new file mode 100644 index 0000000..2413216 Binary files /dev/null and b/Ryff/Media.xcassets/notification.imageset/notification@2x.png differ diff --git a/Ryff/Media.xcassets/play.imageset/Contents.json b/Ryff/Media.xcassets/play.imageset/Contents.json new file mode 100644 index 0000000..d18bc15 --- /dev/null +++ b/Ryff/Media.xcassets/play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "play@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/play.imageset/play@2x.png b/Ryff/Media.xcassets/play.imageset/play@2x.png new file mode 100644 index 0000000..d4c76f8 Binary files /dev/null and b/Ryff/Media.xcassets/play.imageset/play@2x.png differ diff --git a/Ryff/Media.xcassets/plus.imageset/Contents.json b/Ryff/Media.xcassets/plus.imageset/Contents.json new file mode 100644 index 0000000..823756a --- /dev/null +++ b/Ryff/Media.xcassets/plus.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "plus@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/plus.imageset/plus@2x.png b/Ryff/Media.xcassets/plus.imageset/plus@2x.png new file mode 100644 index 0000000..e6f187a Binary files /dev/null and b/Ryff/Media.xcassets/plus.imageset/plus@2x.png differ diff --git a/Ryff/Media.xcassets/remix.imageset/Contents.json b/Ryff/Media.xcassets/remix.imageset/Contents.json new file mode 100644 index 0000000..94c8170 --- /dev/null +++ b/Ryff/Media.xcassets/remix.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "remix@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/remix.imageset/remix@2x.png b/Ryff/Media.xcassets/remix.imageset/remix@2x.png new file mode 100644 index 0000000..8640e62 Binary files /dev/null and b/Ryff/Media.xcassets/remix.imageset/remix@2x.png differ diff --git a/Ryff/Media.xcassets/reset.imageset/Contents.json b/Ryff/Media.xcassets/reset.imageset/Contents.json new file mode 100644 index 0000000..2b0ce80 --- /dev/null +++ b/Ryff/Media.xcassets/reset.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "reset@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/reset.imageset/reset@2x.png b/Ryff/Media.xcassets/reset.imageset/reset@2x.png new file mode 100644 index 0000000..196c5f2 Binary files /dev/null and b/Ryff/Media.xcassets/reset.imageset/reset@2x.png differ diff --git a/Ryff/Media.xcassets/star.imageset/Contents.json b/Ryff/Media.xcassets/star.imageset/Contents.json new file mode 100644 index 0000000..c805c60 --- /dev/null +++ b/Ryff/Media.xcassets/star.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "star@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/star.imageset/star@2x.png b/Ryff/Media.xcassets/star.imageset/star@2x.png new file mode 100644 index 0000000..8ed8f43 Binary files /dev/null and b/Ryff/Media.xcassets/star.imageset/star@2x.png differ diff --git a/Ryff/Media.xcassets/stream.imageset/Contents.json b/Ryff/Media.xcassets/stream.imageset/Contents.json new file mode 100644 index 0000000..e5a4e79 --- /dev/null +++ b/Ryff/Media.xcassets/stream.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "stream@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/stream.imageset/stream@2x.png b/Ryff/Media.xcassets/stream.imageset/stream@2x.png new file mode 100644 index 0000000..5a878f0 Binary files /dev/null and b/Ryff/Media.xcassets/stream.imageset/stream@2x.png differ diff --git a/Ryff/Images.xcassets/first.imageset/Contents.json b/Ryff/Media.xcassets/tabBar.imageset/Contents.json similarity index 61% rename from Ryff/Images.xcassets/first.imageset/Contents.json rename to Ryff/Media.xcassets/tabBar.imageset/Contents.json index a345b09..12d3c9f 100644 --- a/Ryff/Images.xcassets/first.imageset/Contents.json +++ b/Ryff/Media.xcassets/tabBar.imageset/Contents.json @@ -2,13 +2,16 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "first.png" + "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x", - "filename" : "first@2x.png" + "filename" : "tabBar@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/Ryff/Media.xcassets/tabBar.imageset/tabBar@2x.png b/Ryff/Media.xcassets/tabBar.imageset/tabBar@2x.png new file mode 100644 index 0000000..caf6f89 Binary files /dev/null and b/Ryff/Media.xcassets/tabBar.imageset/tabBar@2x.png differ diff --git a/Ryff/Media.xcassets/user.imageset/Contents.json b/Ryff/Media.xcassets/user.imageset/Contents.json new file mode 100644 index 0000000..de5e9d6 --- /dev/null +++ b/Ryff/Media.xcassets/user.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "userIcon@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/user.imageset/userIcon@2x.png b/Ryff/Media.xcassets/user.imageset/userIcon@2x.png new file mode 100644 index 0000000..466b76e Binary files /dev/null and b/Ryff/Media.xcassets/user.imageset/userIcon@2x.png differ diff --git a/Ryff/Media.xcassets/x.imageset/Contents.json b/Ryff/Media.xcassets/x.imageset/Contents.json new file mode 100644 index 0000000..1aea3ab --- /dev/null +++ b/Ryff/Media.xcassets/x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "x@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode", + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Ryff/Media.xcassets/x.imageset/x@2x.png b/Ryff/Media.xcassets/x.imageset/x@2x.png new file mode 100644 index 0000000..273953c Binary files /dev/null and b/Ryff/Media.xcassets/x.imageset/x@2x.png differ diff --git a/Ryff/Newsfeed/RYPost.m b/Ryff/Newsfeed/RYPost.m deleted file mode 100644 index c6bd25c..0000000 --- a/Ryff/Newsfeed/RYPost.m +++ /dev/null @@ -1,104 +0,0 @@ -// -// RYPost.m -// Ryff -// -// Created by Christopher Laganiere on 4/12/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import "RYPost.h" - -// Data Objects -#import "RYUser.h" - -@implementation RYPost - -- (RYPost *)initWithPostId:(NSInteger)postId User:(RYUser *)user Content:(NSString*)content title:(NSString *)title riffURL:(NSURL*)riffURL duration:(CGFloat)duration dateCreated:(NSDate*)dateCreated isUpvoted:(BOOL)isUpvoted isStarred:(BOOL)isStarred upvotes:(NSInteger)upvotes -{ - if (self = [super init]) - { - _postId = postId; - _user = user; - _content = content; - _title = title; - _duration = duration; - _riffURL = riffURL; - _dateCreated = dateCreated; - _isUpvoted = isUpvoted; - _upvotes = upvotes; - _isStarred = isStarred; - } - return self; -} - -+ (RYPost *)postWithDict:(NSDictionary*)postDict -{ - NSNumber *postId = [postDict objectForKey:@"id"]; - - NSDictionary *userDict = [postDict objectForKey:@"user"]; - RYUser *user = [RYUser userFromDict:userDict]; - - NSString *title = [postDict objectForKey:@"title"]; - NSString *content = [postDict objectForKey:@"content"]; - - NSURL *riffURL = [NSURL URLWithString:[postDict objectForKey:@"riff_url"]]; - CGFloat duration = [[postDict objectForKey:@"duration"] floatValue]; - - NSString *date_created = [userDict objectForKey:@"date_created"]; - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; - NSDate *date = [dateFormatter dateFromString:date_created]; - - BOOL isUpvoted = [postDict[@"is_upvoted"] boolValue]; - NSInteger upvotes = [postDict[@"upvotes"] intValue]; - - BOOL isStarred = [postDict[@"is_starred"] boolValue]; - - RYPost *newPost = [[RYPost alloc] initWithPostId:[postId integerValue] User:user Content:content title:title riffURL:riffURL duration:duration dateCreated:date isUpvoted:isUpvoted isStarred:isStarred upvotes:upvotes]; - - if (postDict[@"image_url"] && ((NSString*)postDict[@"image_url"]).length > 0) - newPost.imageURL = [NSURL URLWithString:postDict[@"image_url"]]; - if (postDict[@"image_medium_url"] && [postDict[@"image_medium_url"] length] > 0) - newPost.imageMediumURL = [NSURL URLWithString:postDict[@"image_medium_url"]]; - if (postDict[@"image_small_url"] && [postDict[@"image_small_url"] length] > 0) - newPost.imageSmallURL = [NSURL URLWithString:postDict[@"image_small_url"]]; - - if (postDict[@"riff_hq_url"] && [postDict[@"riff_hq_url"] length] > 0) - newPost.riffHQURL = [NSURL URLWithString:postDict[@"riff_hq_url"]]; - - return newPost; -} - -+ (NSArray *)postsFromDictArray:(NSArray *)dictArray -{ - NSMutableArray *posts = [[NSMutableArray alloc] init]; - - for (NSDictionary *postDict in dictArray) - { - RYPost *post = [RYPost postWithDict:postDict]; - [posts addObject:post]; - } - - return posts; -} - -#pragma mark - Internal - -- (BOOL) isEqual:(id)object -{ - BOOL equal = NO; - if ([object isKindOfClass:[RYPost class]]) - { - RYPost *other = (RYPost *)object; - if (other.postId == self.postId) - equal = YES; - } - return equal; -} - -- (NSUInteger)hash -{ - return _postId; -} - -@end diff --git a/Ryff/RYAppDelegate.m b/Ryff/RYAppDelegate.m index 65db964..6849f2c 100644 --- a/Ryff/RYAppDelegate.m +++ b/Ryff/RYAppDelegate.m @@ -12,13 +12,21 @@ #import "RYServices.h" #import "RYRegistrationServices.h" #import "RYDataManager.h" -#import "RYAudioDeckManager.h" #import "RYNotificationsManager.h" // Frameworks -#import "SSKeychain.h" +@import SSKeychain; #import "Crittercism.h" +// View Controllers +#import "RYTabBarViewController.h" + +@interface RYAppDelegate () + +@property (nonatomic) RYTabBarViewController *tabBarViewController; + +@end + @implementation RYAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions @@ -26,11 +34,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( // log crash events [Crittercism enableWithAppID:@"5421e1f8b573f17c9b000004"]; - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - // Present main storyboard - NSString *storyboardName = (isIpad) ? @"Main" : @"MainIphone"; - UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:NULL]; - [self.window setRootViewController:[mainStoryboard instantiateViewControllerWithIdentifier:@"coreTabController"]]; + _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + _tabBarViewController = [[RYTabBarViewController alloc] init]; + self.window.rootViewController = self.tabBarViewController; [self.window makeKeyAndVisible]; [[RYRegistrationServices sharedInstance] attemptBackgroundLogIn]; @@ -75,21 +81,26 @@ - (void)applicationWillTerminate:(UIApplication *)application - (void)remoteControlReceivedWithEvent:(UIEvent *)event { - RYAudioDeckManager *audioDeck = [RYAudioDeckManager sharedInstance]; + RYAudioDeck *audioDeck = [RYAudioDeck sharedAudioDeck]; if(event.type == UIEventTypeRemoteControl) { switch (event.subtype) { case UIEventSubtypeRemoteControlPlay: - [audioDeck playTrack:YES]; + [audioDeck play]; break; case UIEventSubtypeRemoteControlPause: - [audioDeck playTrack:NO]; + [audioDeck pause]; break; case UIEventSubtypeRemoteControlTogglePlayPause: - [audioDeck playTrack:![audioDeck isPlaying]]; + if (audioDeck.isPlaying) { + [audioDeck pause]; + } + else { + [audioDeck play]; + } break; case UIEventSubtypeRemoteControlNextTrack: - [audioDeck skipTrack]; + [audioDeck skip]; break; case UIEventSubtypeRemoteControlPreviousTrack: [audioDeck setPlaybackProgress:0.0f]; diff --git a/Ryff/RYCoreTabBarViewController.m b/Ryff/RYCoreTabBarViewController.m deleted file mode 100644 index 2aec741..0000000 --- a/Ryff/RYCoreTabBarViewController.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// RYCoreTabBarViewController.m -// Ryff -// -// Created by Christopher Laganiere on 4/12/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import "RYCoreTabBarViewController.h" - -// Data Managers -#import "RYServices.h" - -// Data Objects -#import "RYUser.h" - -// Custom UI -#import "RYStyleSheet.h" -#import "UIImage+Color.h" - -// Associated View Controller -#import "RYProfileViewController.h" -#import "RYNewsfeedContainerViewController.h" - -@interface RYCoreTabBarViewController () - -@end - -@implementation RYCoreTabBarViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - [self.tabBar setTintColor:[RYStyleSheet audioActionColor]]; - [self.tabBar setTranslucent:NO]; - [self.tabBar setBackgroundImage:[[UIImage imageNamed:@"tabBar"] colorImage:[RYStyleSheet tabBarColor]]]; - [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:kRegularFont size:12.0f]} forState:UIControlStateNormal]; - - for (UIViewController *viewController in self.viewControllers) - { - if ([viewController isKindOfClass:[UINavigationController class]]) - { - UIViewController *potentialProfile = ((UINavigationController*)viewController).viewControllers.firstObject; - if ([potentialProfile isKindOfClass:[RYProfileViewController class]]) - [((RYProfileViewController *)potentialProfile) addSettingsOptions]; - } - } -} - -#pragma mark - -#pragma mark - TabBar Delegate - -- (void) tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item -{ - if ([self.selectedViewController isKindOfClass:[RYNewsfeedContainerViewController class]] && [self.selectedViewController.tabBarItem isEqual:item]) - { - UINavigationController *navController = ((RYNewsfeedContainerViewController *)self.selectedViewController).newsfeedNav; - if (navController) - [navController popToRootViewControllerAnimated:YES]; - } -} - -@end diff --git a/Ryff/UI/Profile/RiffCell/RYRiffCell.xib b/Ryff/RYRiffCell.xib similarity index 100% rename from Ryff/UI/Profile/RiffCell/RYRiffCell.xib rename to Ryff/RYRiffCell.xib diff --git a/Ryff/UI/Profile/RiffCell/RYRiffCellAvatar.xib b/Ryff/RYRiffCellAvatar.xib similarity index 100% rename from Ryff/UI/Profile/RiffCell/RYRiffCellAvatar.xib rename to Ryff/RYRiffCellAvatar.xib diff --git a/Ryff/UI/Profile/RiffCell/RYRiffDetailsCell.xib b/Ryff/RYRiffDetailsCell.xib similarity index 100% rename from Ryff/UI/Profile/RiffCell/RYRiffDetailsCell.xib rename to Ryff/RYRiffDetailsCell.xib diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RiffCreate.storyboard b/Ryff/RiffCreate.storyboard similarity index 100% rename from Ryff/UI/Profile/RiffEdit/RiffCreate/RiffCreate.storyboard rename to Ryff/RiffCreate.storyboard diff --git a/Ryff/Ryff-Info.plist b/Ryff/Ryff-Info.plist index 950c235..47b6ce3 100644 --- a/Ryff/Ryff-Info.plist +++ b/Ryff/Ryff-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,6 +24,10 @@ 1.0 LSRequiresIPhoneOS + NSLocationUsageDescription + Locations used to find nearby users are never shared with third parties or used without your permission. + NSPhotoLibraryUsageDescription + Photos selected for upload will never be used without your permission, and are deleted when removed from your account. UIAppFonts Lato-RegIta.ttf @@ -31,6 +35,12 @@ Lato-Bol.ttf Lato-Reg.ttf + UIBackgroundModes + + audio + + UILaunchStoryboardName + Launch Screen UIRequiredDeviceCapabilities armv7 @@ -54,15 +64,11 @@ UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown - NSPhotoLibraryUsageDescription - Photos selected for upload will never be used without your permission, and are deleted when removed from your account. - NSLocationUsageDescription - Locations used to find nearby users are never shared with third parties or used without your permission. - UIBackgroundModes - - audio - UIViewControllerBasedStatusBarAppearance + NSAppTransportSecurity + + NSAllowsArbitraryLoads + diff --git a/Ryff/Ryff-Prefix.pch b/Ryff/Ryff-Prefix.pch index 08d912b..362de66 100644 --- a/Ryff/Ryff-Prefix.pch +++ b/Ryff/Ryff-Prefix.pch @@ -13,6 +13,7 @@ #ifdef __OBJC__ #import #import + #import "SwiftCompatability.h" #endif #define isIpad UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad @@ -24,5 +25,3 @@ #define kItalicFont @"Lato-Light" #import "NSObject+block.h" - -#import "Ryff-Swift.h" \ No newline at end of file diff --git a/Ryff/Style/Custom UI Objects/RYPlayControl.h b/Ryff/Style/Custom UI Objects/RYPlayControl.h deleted file mode 100644 index b9082c6..0000000 --- a/Ryff/Style/Custom UI Objects/RYPlayControl.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// RYPlayControl.h -// Ryff -// -// Created by Christopher Laganiere on 7/24/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -@interface RYPlayControl : UIView - -@property (nonatomic, strong) UIColor *controlTintColor; - -- (void) configureWithFrame:(CGRect)frame centerImageInset:(NSNumber *)centerImageInset; -- (void) setProgress:(CGFloat)progress animated:(BOOL)animated; -- (void) setCenterImage:(UIImage *)image; - -@end diff --git a/Ryff/Style/Custom UI Objects/RYPlayControl.m b/Ryff/Style/Custom UI Objects/RYPlayControl.m deleted file mode 100644 index dd6b3e2..0000000 --- a/Ryff/Style/Custom UI Objects/RYPlayControl.m +++ /dev/null @@ -1,93 +0,0 @@ -// -// RYPlayControl.m -// Ryff -// -// Created by Christopher Laganiere on 7/24/14. -// Copyright (c) 2014 Chris Laganiere. All rights reserved. -// - -#import - -#import "RYPlayControl.h" - -// Custom UI -#import "RYStyleSheet.h" -#import "UIImage+Color.h" - -@interface RYPlayControl () - -@property (nonatomic, strong) CAShapeLayer *circleShape; -@property (nonatomic, strong) UIImageView *centerImageView; - -@end - -@implementation RYPlayControl - -- (void) configureWithFrame:(CGRect)frame centerImageInset:(NSNumber *)centerImageInset -{ - if (!_controlTintColor) - _controlTintColor = [RYStyleSheet audioActionColor]; - - CGFloat outerStrokeWidth = 3.0f; - - _circleShape = [CAShapeLayer layer]; - CGPoint circleCenter = CGPointMake(frame.size.width/2, frame.size.height/2); - _circleShape.path = [UIBezierPath bezierPathWithArcCenter:circleCenter radius:(frame.size.width-outerStrokeWidth/2) / 2 startAngle:-M_PI_2 endAngle:-M_PI_2 + 2 * M_PI clockwise:YES].CGPath; - _circleShape.strokeColor = _controlTintColor.CGColor; - _circleShape.fillColor = nil; - _circleShape.lineWidth = outerStrokeWidth; - _circleShape.strokeEnd = 0.0f; - [self.layer addSublayer:_circleShape]; - - CGFloat inset = centerImageInset ? centerImageInset.floatValue : 2*outerStrokeWidth; - CGRect imageFrame = CGRectMake(inset, inset, frame.size.width-2*inset, frame.size.height-2*inset); - _centerImageView = [[UIImageView alloc] initWithFrame:imageFrame]; - _centerImageView.contentMode = UIViewContentModeScaleAspectFit; - [self addSubview:_centerImageView]; -} - -- (void) setControlTintColor:(UIColor *)controlTintColor -{ - _controlTintColor = controlTintColor; - [_centerImageView setImage:[_centerImageView.image colorImage:_controlTintColor]]; - _circleShape.strokeColor = _controlTintColor.CGColor; -} - -- (void) setProgress:(CGFloat)progress animated:(BOOL)animated -{ - if (animated) - [self animateFill:_circleShape toStrokeEnd:progress]; - else - { - [CATransaction begin]; - [CATransaction setAnimationDuration:0.0]; - _circleShape.strokeEnd = progress; - [CATransaction commit]; - } -} - -- (void) setCenterImage:(UIImage *)image -{ - if (image) - [_centerImageView setImage:[image colorImage:_controlTintColor]]; - else - [_centerImageView setImage:nil]; -} - -#pragma mark - Internal - -- (void) animateFill:(CAShapeLayer*)shapeLayer toStrokeEnd:(CGFloat)strokeEnd -{ - [shapeLayer removeAnimationForKey:@"strokeEnd"]; - - CGFloat animationDuration = 0.1f; - - CABasicAnimation *fillStroke = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; - fillStroke.duration = animationDuration; - fillStroke.fromValue = @(shapeLayer.strokeEnd); - fillStroke.toValue = @(strokeEnd); - shapeLayer.strokeEnd = strokeEnd; - [shapeLayer addAnimation:fillStroke forKey:@"fill stroke"]; -} - -@end diff --git a/Ryff/SwiftCompatability.h b/Ryff/SwiftCompatability.h new file mode 100644 index 0000000..604f172 --- /dev/null +++ b/Ryff/SwiftCompatability.h @@ -0,0 +1,15 @@ +// +// SwiftCompatability.h +// Ryff +// +// Created by Chris Laganiere on 9/4/15. +// Copyright (c) 2015 Chris Laganiere. All rights reserved. +// + +#ifdef RYFF +#import "Ryff-Swift.h" +#endif + +#ifdef RYFFTESTS +#import "RyffTests-Swift.h" +#endif diff --git a/Ryff/UI/Custom/FDWaveformView/FDWaveformView.h b/Ryff/UI/Custom/FDWaveformView/FDWaveformView.h deleted file mode 100755 index 01a199d..0000000 --- a/Ryff/UI/Custom/FDWaveformView/FDWaveformView.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// FDWaveformView -// -// Created by William Entriken on 10/6/13. -// Copyright (c) 2013 William Entriken. All rights reserved. -// - -#import -#import -#import - -@protocol FDWaveformViewDelegate; - -@interface FDWaveformView : UIView -@property (nonatomic, weak) id delegate; -@property (nonatomic, strong) NSURL *audioURL; -@property (nonatomic, assign, readonly) unsigned long int totalSamples; -@property (nonatomic, assign) unsigned long int progressSamples; -@property (nonatomic, assign) unsigned long int zoomStartSamples; -@property (nonatomic, assign) unsigned long int zoomEndSamples; -@property (nonatomic) BOOL doesAllowScrubbing; -@property (nonatomic) BOOL doesAllowStretch; -@property (nonatomic) BOOL doesAllowScroll; -@property (nonatomic, copy) UIColor *wavesColor; -@property (nonatomic, copy) UIColor *progressColor; -@end - -@protocol FDWaveformViewDelegate -@optional -- (void)waveformViewWillRender:(FDWaveformView *)waveformView; -- (void)waveformViewDidRender:(FDWaveformView *)waveformView; -- (void)waveformViewWillLoad:(FDWaveformView *)waveformView; -- (void)waveformViewDidLoad:(FDWaveformView *)waveformView; -- (void)waveformDidBeginPanning:(FDWaveformView *)waveformView; -- (void)waveformDidEndPanning:(FDWaveformView *)waveformView; -@end \ No newline at end of file diff --git a/Ryff/UI/Custom/FDWaveformView/FDWaveformView.m b/Ryff/UI/Custom/FDWaveformView/FDWaveformView.m deleted file mode 100755 index 1d79bd8..0000000 --- a/Ryff/UI/Custom/FDWaveformView/FDWaveformView.m +++ /dev/null @@ -1,430 +0,0 @@ -// -// FDWaveformView -// -// Created by William Entriken on 10/6/13. -// Copyright (c) 2013 William Entriken. All rights reserved. -// - - -// FROM http://stackoverflow.com/questions/5032775/drawing-waveform-with-avassetreader -// DO SEE http://stackoverflow.com/questions/1191868/uiimageview-scaling-interpolation -// see http://stackoverflow.com/questions/3514066/how-to-tint-a-transparent-png-image-in-iphone - -#import "FDWaveFormView.h" -#import - -#define absX(x) ((x)<0?0-(x):(x)) -#define minMaxX(x,mn,mx) ((x)<=(mn)?(mn):((x)>=(mx)?(mx):(x))) -#define noiseFloor (-50.0) -#define decibel(amplitude) (20.0 * log10(absX(amplitude)/32767.0)) - -// Drawing a larger image than needed to have it available for scrolling -#define horizontalMinimumBleed 0.1 -#define horizontalMaximumBleed 3 -#define horizontalTargetBleed 0.5 -// Drawing more pixels than shown to get antialiasing -#define horizontalMinimumOverdraw 2 -#define horizontalMaximumOverdraw 5 -#define horizontalTargetOverdraw 3 -#define verticalMinimumOverdraw 1 -#define verticalMaximumOverdraw 3 -#define verticalTargetOverdraw 2 - - -@interface FDWaveformView() -@property (nonatomic, strong) UIImageView *image; -@property (nonatomic, strong) UIImageView *highlightedImage; -@property (nonatomic, strong) UIView *clipping; -@property (nonatomic, strong) AVAsset *asset; -@property (nonatomic, strong) AVAssetTrack *assetTrack; -@property (nonatomic, assign) unsigned long int totalSamples; -@property (nonatomic, assign) unsigned long int cachedStartSamples; -@property (nonatomic, assign) unsigned long int cachedEndSamples; -@property (nonatomic, strong) UIPinchGestureRecognizer *pinchRecognizer; -@property (nonatomic, strong) UIPanGestureRecognizer *panRecognizer; -@property (nonatomic, strong) UITapGestureRecognizer *tapRecognizer; -@property BOOL renderingInProgress; -@property BOOL loadingInProgress; -@end - -@implementation FDWaveformView - -- (void)initialize -{ - self.image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; - self.highlightedImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; - self.image.contentMode = UIViewContentModeScaleToFill; - self.highlightedImage.contentMode = UIViewContentModeScaleToFill; - [self addSubview:self.image]; - self.clipping = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; - [self.clipping addSubview:self.highlightedImage]; - self.clipping.clipsToBounds = YES; - [self addSubview:self.clipping]; - self.clipsToBounds = YES; - - self.wavesColor = [UIColor blackColor]; - self.progressColor = [UIColor blueColor]; - - self.pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; - self.pinchRecognizer.delegate = self; - [self addGestureRecognizer:self.pinchRecognizer]; - - self.panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; - self.panRecognizer.delegate = self; - [self addGestureRecognizer:self.panRecognizer]; - - self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; - [self addGestureRecognizer:self.tapRecognizer]; -} - -- (instancetype)initWithCoder:(NSCoder *)aCoder -{ - if (self = [super initWithCoder:aCoder]) - [self initialize]; - return self; -} - -- (instancetype)initWithFrame:(CGRect)rect -{ - if (self = [super initWithFrame:rect]) - [self initialize]; - return self; -} - -- (void)setAudioURL:(NSURL *)audioURL -{ - _audioURL = audioURL; - self.loadingInProgress = YES; - if ([self.delegate respondsToSelector:@selector(waveformViewWillLoad:)]) - [self.delegate waveformViewWillLoad:self]; - self.asset = [AVURLAsset URLAssetWithURL:audioURL options:nil]; - self.assetTrack = [[self.asset tracksWithMediaType:AVMediaTypeAudio] firstObject]; - - [self.asset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler:^() { - self.loadingInProgress = NO; - if ([self.delegate respondsToSelector:@selector(waveformViewDidLoad:)]) - [self.delegate waveformViewDidLoad:self]; - - NSError *error = nil; - AVKeyValueStatus durationStatus = [self.asset statusOfValueForKey:@"duration" error:&error]; - switch (durationStatus) { - case AVKeyValueStatusLoaded:{ - self.image.image = nil; - self.highlightedImage.image = nil; - _progressSamples = 0; // skip setter - _zoomStartSamples = 0; // skip setter - - NSArray *formatDesc = self.assetTrack.formatDescriptions; - CMAudioFormatDescriptionRef item = (__bridge CMAudioFormatDescriptionRef)formatDesc[0]; - const AudioStreamBasicDescription *asbd = CMAudioFormatDescriptionGetStreamBasicDescription(item); - unsigned long int samples = asbd->mSampleRate * (float)self.asset.duration.value/self.asset.duration.timescale; - _totalSamples = _zoomEndSamples = samples; - [self setNeedsDisplay]; - [self performSelectorOnMainThread:@selector(setNeedsLayout) withObject:nil waitUntilDone:NO]; - break; - } - case AVKeyValueStatusUnknown: - case AVKeyValueStatusLoading: - case AVKeyValueStatusFailed: - case AVKeyValueStatusCancelled: - NSLog(@"FDWaveformView could not load asset: %@", error.localizedDescription); - break; - default: - break; - } - }]; -} - -- (void)setProgressSamples:(unsigned long)progressSamples -{ - _progressSamples = progressSamples; - if (self.totalSamples) { - float progress = (float)self.progressSamples / self.totalSamples; - self.clipping.frame = CGRectMake(0,0,self.frame.size.width*progress,self.frame.size.height); - [self setNeedsLayout]; - } -} - -- (void)setZoomStartSamples:(unsigned long)startSamples -{ - _zoomStartSamples = startSamples; - [self setNeedsDisplay]; - [self setNeedsLayout]; -} - -- (void)setZoomEndSamples:(unsigned long)endSamples -{ - _zoomEndSamples = endSamples; - [self setNeedsDisplay]; - [self setNeedsLayout]; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - if (!self.assetTrack || self.renderingInProgress || self.zoomEndSamples == 0) - return; - - unsigned long int displayRange = self.zoomEndSamples - self.zoomStartSamples; - BOOL needToRender = NO; - if (!self.image.image) - needToRender = YES; - if (self.cachedStartSamples < (unsigned long)minMaxX((float)self.zoomStartSamples - displayRange * horizontalMaximumBleed, 0, self.totalSamples)) - needToRender = YES; - if (self.cachedStartSamples > (unsigned long)minMaxX((float)self.zoomStartSamples - displayRange * horizontalMinimumBleed, 0, self.totalSamples)) - needToRender = YES; - if (self.cachedEndSamples < (unsigned long)minMaxX((float)self.zoomEndSamples + displayRange * horizontalMinimumBleed, 0, self.totalSamples)) - needToRender = YES; - if (self.cachedEndSamples > (unsigned long)minMaxX((float)self.zoomEndSamples + displayRange * horizontalMaximumBleed, 0, self.totalSamples)) - needToRender = YES; - if (self.image.image.size.width < self.frame.size.width * [UIScreen mainScreen].scale * horizontalMinimumOverdraw) - needToRender = YES; - if (self.image.image.size.width > self.frame.size.width * [UIScreen mainScreen].scale * horizontalMaximumOverdraw) - needToRender = YES; - if (self.image.image.size.height < self.frame.size.height * [UIScreen mainScreen].scale * verticalMinimumOverdraw) - needToRender = YES; - if (self.image.image.size.height > self.frame.size.height * [UIScreen mainScreen].scale * verticalMaximumOverdraw) - needToRender = YES; - if (needToRender) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ - [self renderAsset]; - }); - return; - } - - // We need to place the images which have samples from cachedStart..cachedEnd - // inside our frame which represents startSamples..endSamples - // all figures are a portion of our frame size - float scaledStart = 0, scaledProgress = 0, scaledEnd = 1, scaledWidth = 1; - if (self.cachedEndSamples > self.cachedStartSamples) { - scaledStart = ((float)self.cachedStartSamples-self.zoomStartSamples)/(self.zoomEndSamples-self.zoomStartSamples); - scaledEnd = ((float)self.cachedEndSamples-self.zoomStartSamples)/(self.zoomEndSamples-self.zoomStartSamples); - scaledWidth = scaledEnd - scaledStart; - scaledProgress = ((float)self.progressSamples-self.zoomStartSamples)/(self.zoomEndSamples-self.zoomStartSamples); - } - CGRect frame = CGRectMake(self.frame.size.width*scaledStart, 0, self.frame.size.width*scaledWidth, self.frame.size.height); - self.image.frame = self.highlightedImage.frame = frame; - self.clipping.frame = CGRectMake(0,0,self.frame.size.width*scaledProgress,self.frame.size.height); - self.clipping.hidden = self.progressSamples <= self.zoomStartSamples; -} - -- (void)renderAsset -{ - if (self.renderingInProgress) - return; - self.renderingInProgress = YES; - if ([self.delegate respondsToSelector:@selector(waveformViewWillRender:)]) - [self.delegate waveformViewWillRender:self]; - unsigned long int displayRange = self.zoomEndSamples - self.zoomStartSamples; - unsigned long int renderStartSamples = minMaxX((long)self.zoomStartSamples - displayRange * horizontalTargetBleed, 0, self.totalSamples); - unsigned long int renderEndSamples = minMaxX((long)self.zoomEndSamples + displayRange * horizontalTargetBleed, 0, self.totalSamples); - - CGFloat widthInPixels = self.frame.size.width * [UIScreen mainScreen].scale * horizontalTargetOverdraw; - CGFloat heightInPixels = self.frame.size.height * [UIScreen mainScreen].scale * verticalTargetOverdraw; - [FDWaveformView sliceAndDownsampleAsset:self.asset - track:self.assetTrack - startSamples:renderStartSamples - endSamples:renderEndSamples - targetSamples:widthInPixels - done:^(NSData *samples, NSInteger sampleCount, Float32 sampleMax) { - [self plotLogGraph:samples - maximumValue:sampleMax - mimimumValue:noiseFloor - sampleCount:sampleCount - imageHeight:heightInPixels - done:^(UIImage *image, UIImage *selectedImage) { - dispatch_async(dispatch_get_main_queue(), ^{ - self.image.image = image; - self.highlightedImage.image = selectedImage; - self.cachedStartSamples = renderStartSamples; - self.cachedEndSamples = renderEndSamples; - self.renderingInProgress = NO; - [self layoutSubviews]; // warning - if ([self.delegate respondsToSelector:@selector(waveformViewDidRender:)]) - [self.delegate waveformViewDidRender:self]; - }); - } - ]; - }]; -} - -+ (void)sliceAndDownsampleAsset:(AVAsset *)songAsset - track:(AVAssetTrack *)songTrack - startSamples:(unsigned long int)start - endSamples:(unsigned long int)end - targetSamples:(unsigned long int)targetSamples - done:(void(^)(NSData *samples, NSInteger sampleCount, Float32 sampleMax))done -{ - NSError *error = nil; - AVAssetReader *reader = [AVAssetReader assetReaderWithAsset:songAsset error:&error]; - reader.timeRange = CMTimeRangeMake(CMTimeMake(start, songAsset.duration.timescale), CMTimeMake((end-start), songAsset.duration.timescale)); - NSDictionary *outputSettingsDict = @{AVFormatIDKey: @(kAudioFormatLinearPCM), - AVLinearPCMBitDepthKey: @16, - AVLinearPCMIsBigEndianKey: @NO, - AVLinearPCMIsFloatKey: @NO, - AVLinearPCMIsNonInterleaved: @NO}; - AVAssetReaderTrackOutput *output = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:songTrack outputSettings:outputSettingsDict]; - output.alwaysCopiesSampleData = NO; - [reader addOutput:output]; - UInt32 channelCount; - NSArray *formatDesc = songTrack.formatDescriptions; - for(unsigned int i = 0; i < [formatDesc count]; ++i) { - CMAudioFormatDescriptionRef item = (__bridge CMAudioFormatDescriptionRef)formatDesc[i]; - const AudioStreamBasicDescription* fmtDesc = CMAudioFormatDescriptionGetStreamBasicDescription(item); - if (!fmtDesc) return; //! - channelCount = fmtDesc->mChannelsPerFrame; - } - - UInt32 bytesPerInputSample = 2 * channelCount; - Float32 sampleMax = noiseFloor; - Float64 tally = 0; - Float32 tallyCount = 0; - - NSInteger downsampleFactor = (end-start) / targetSamples; - downsampleFactor = downsampleFactor<1 ? 1 : downsampleFactor; - NSMutableData *fullSongData = [NSMutableData dataWithCapacity:(NSUInteger)songAsset.duration.value/downsampleFactor*2]; // 16-bit samples - [reader startReading]; - - while (reader.status == AVAssetReaderStatusReading) { - AVAssetReaderTrackOutput * trackOutput = (AVAssetReaderTrackOutput *)(reader.outputs)[0]; - CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer]; - if (sampleBufferRef) { - CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef); - size_t bufferLength = CMBlockBufferGetDataLength(blockBufferRef); - void *data = malloc(bufferLength); - CMBlockBufferCopyDataBytes(blockBufferRef, 0, bufferLength, data); - - SInt16 *samples = (SInt16 *) data; - int sampleCount = (int) bufferLength / bytesPerInputSample; - for (int i=0; i sample ? sampleMax : sample; - [fullSongData appendBytes:&sample length:sizeof(sample)]; - tally = 0; - tallyCount = 0; - } - } - CMSampleBufferInvalidate(sampleBufferRef); - CFRelease(sampleBufferRef); - free(data); - } - } - - // if (reader.status == AVAssetReaderStatusFailed || reader.status == AVAssetReaderStatusUnknown) - // Something went wrong. Handle it. - if (reader.status == AVAssetReaderStatusCompleted){ - done(fullSongData, fullSongData.length/4, sampleMax); - } -} - -- (void)plotLogGraph:(NSData *) samplesData - maximumValue:(Float32) normalizeMax - mimimumValue:(Float32) normalizeMin - sampleCount:(NSInteger) sampleCount - imageHeight:(float) imageHeight - done:(void(^)(UIImage *image, UIImage *selectedImage))done -{ - Float32 *samples = (Float32 *)samplesData.bytes; - - - // TODO: switch to a synchronous function that paints onto a given context? (for issue #2) - CGSize imageSize = CGSizeMake(sampleCount, imageHeight); - UIGraphicsBeginImageContext(imageSize); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetAlpha(context,1.0); - CGContextSetLineWidth(context, 1.0); - CGContextSetStrokeColorWithColor(context, [self.wavesColor CGColor]); - - float halfGraphHeight = (imageHeight / 2); - float centerLeft = halfGraphHeight; - float sampleAdjustmentFactor = imageHeight / (normalizeMax - noiseFloor) / 2; - - for (NSInteger intSample=0; intSample= 0) - _zoomStartSamples = middleSamples - 1/recognizer.scale*rangeSamples/2; - else - _zoomStartSamples = 0; - if (middleSamples + 1/recognizer.scale*rangeSamples/2 <= self.totalSamples) - _zoomEndSamples = middleSamples + 1/recognizer.scale*rangeSamples/2; - else - _zoomEndSamples = self.totalSamples; - [self setNeedsDisplay]; - [self setNeedsLayout]; - recognizer.scale = 1; -} - -- (void)handlePanGesture:(UIPanGestureRecognizer *)recognizer -{ - CGPoint point = [recognizer translationInView:self]; - NSLog(@"translation: %f", point.x); - - if (self.doesAllowScroll) { - if (recognizer.state == UIGestureRecognizerStateBegan && [self.delegate respondsToSelector:@selector(waveformDidBeginPanning:)]) - [self.delegate waveformDidBeginPanning:self]; - - long translationSamples = (float)(self.zoomEndSamples-self.zoomStartSamples) * point.x / self.bounds.size.width; - [recognizer setTranslation:CGPointZero inView:self]; - if ((float)self.zoomStartSamples - translationSamples < 0) - translationSamples = (float)self.zoomStartSamples; - if ((float)self.zoomEndSamples - translationSamples > self.totalSamples) - translationSamples = self.zoomEndSamples - self.totalSamples; - _zoomStartSamples -= translationSamples; - _zoomEndSamples -= translationSamples; - - if (recognizer.state == UIGestureRecognizerStateEnded && [self.delegate respondsToSelector:@selector(waveformDidEndPanning:)]) - [self.delegate waveformDidEndPanning:self]; - - [self setNeedsDisplay]; - [self setNeedsLayout]; - } else if (self.doesAllowScrubbing) { - self.progressSamples = self.zoomStartSamples + (float)(self.zoomEndSamples-self.zoomStartSamples) * [recognizer locationInView:self].x / self.bounds.size.width; - } -} - -- (void)handleTapGesture:(UITapGestureRecognizer *)recognizer -{ - if (self.doesAllowScrubbing) { - self.progressSamples = self.zoomStartSamples + (float)(self.zoomEndSamples-self.zoomStartSamples) * [recognizer locationInView:self].x / self.bounds.size.width; - } -} - -@end diff --git a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD-Prefix.pch b/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD-Prefix.pch deleted file mode 100755 index e81c669..0000000 --- a/Ryff/UI/Custom/MBProgressHUD/MBProgressHUD-Prefix.pch +++ /dev/null @@ -1,15 +0,0 @@ -// -// Prefix header for all source files of the 'MBProgressHUD' target in the 'MBProgressHUD' project -// - -#import - -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iOS SDK 3.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import - #import -#endif diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.h b/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.h deleted file mode 100644 index 7a2d7e6..0000000 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffAudioNode.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// RYRiffAudioNode.h -// Ryff -// -// Created by Christopher Laganiere on 8/15/15. -// Copyright (c) 2015 Chris Laganiere. All rights reserved. -// - -@import Foundation; - -@class AVAudioPCMBuffer; -@class AVAudioPlayerNode; -@class AVAudioTime; -@class AVAudioFile; - -@interface RYRiffAudioNode : NSObject - -@property (nonatomic, assign) BOOL isReadyToPlay; -@property (nonatomic, assign) BOOL isActive; -@property (nonatomic, assign) BOOL isRecording; - -@property (nonatomic, readonly, nonnull) AVAudioPlayerNode *audioPlayerNode; -@property (nonatomic, readonly, nullable) AVAudioPCMBuffer *audioBuffer; - -- (void)setAudioBuffer:(AVAudioPCMBuffer * __nonnull)audioBuffer; -- (void)setAudioFile:(AVAudioFile * __nonnull)audioFile; -- (void)deleteAudio; - -- (void)startWithDelay:(AVAudioTime * __nullable)delay looping:(BOOL)looping; - -- (void)play; -- (void)pause; -- (void)stop; - -@end diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateCollectionViewController.swift b/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateCollectionViewController.swift deleted file mode 100644 index 5d9be9c..0000000 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateCollectionViewController.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// RYRiffCreateCollectionViewController.swift -// Ryff -// -// Created by Christopher Laganiere on 8/15/15. -// Copyright (c) 2015 Chris Laganiere. All rights reserved. -// - -import UIKit - -@objc -class RYRiffCreateCollectionViewController : UICollectionViewController, AudioEngineDelegate, RYRiffCreateNodeCellDelegate { - - private let NumberOfNodes = 12 - private let NodeCellReuseIdentifier = "RiffNodeCell" - - private var riffEngine: RYRiffAudioEngine - - required init(coder aDecoder: NSCoder) { - riffEngine = RYRiffAudioEngine(riffNodeCount: NumberOfNodes) - super.init(coder: aDecoder) - riffEngine.delegate = self - } - - // MARK: RYRiffCreateNodeCellDelegate - - func clearHitOnNodeCell(nodeCell: RYRiffCreateNodeCollectionViewCell) { - if let indexPath = self.collectionView?.indexPathForCell(nodeCell) { - riffEngine.clearNodeAtIndex(indexPath.row) - } - } - - // MARK: AudioEngineDelegate - - func nodeStatusChangedAtIndex(index: Int) { - if let riffNode = self.riffEngine.nodeAtIndex(index) { - let indexPath = NSIndexPath(forItem: index, inSection: 0) - if let nodeCell = self.collectionView?.cellForItemAtIndexPath(indexPath) as? RYRiffCreateNodeCollectionViewCell { - nodeCell.styleWithRiffNode(riffNode) - } - } - } - - // MARK: UICollectionViewDataSource - - override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { - return 1 - } - - override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - return collectionView.dequeueReusableCellWithReuseIdentifier(NodeCellReuseIdentifier, forIndexPath: indexPath) as! RYRiffCreateNodeCollectionViewCell - } - - // MARK: UICollectionViewDelegate - - override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return NumberOfNodes - } - - override func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { - if let nodeCell = cell as? RYRiffCreateNodeCollectionViewCell, riffNode = riffEngine.nodeAtIndex(indexPath.row) { - nodeCell.styleWithRiffNode(riffNode) - nodeCell.delegate = self - } - } - - override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { - riffEngine.toggleNodeAtIndex(indexPath.row) - } -} diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateNodeCollectionViewCell.swift b/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateNodeCollectionViewCell.swift deleted file mode 100644 index bd20759..0000000 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/RYRiffCreateNodeCollectionViewCell.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// RYRiffCreateNodeCollectionViewCell.swift -// Ryff -// -// Created by Christopher Laganiere on 8/15/15. -// Copyright (c) 2015 Chris Laganiere. All rights reserved. -// - -import UIKit - -protocol RYRiffCreateNodeCellDelegate: class { - func clearHitOnNodeCell(nodeCell: RYRiffCreateNodeCollectionViewCell) -} - -class RYRiffCreateNodeCollectionViewCell: UICollectionViewCell { - - @IBOutlet weak var clearButton: UIButton! - - weak var delegate: RYRiffCreateNodeCellDelegate? - - required init(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - - func styleWithRiffNode(riffNode: RYRiffAudioNode) { - if (riffNode.isRecording) { - self.backgroundColor = UIColor.redColor() - } - else if (riffNode.isActive) { - self.backgroundColor = UIColor.whiteColor() - } - else if (riffNode.isReadyToPlay) { - self.backgroundColor = UIColor.grayColor() - } - else { - self.backgroundColor = UIColor.blueColor() - } - } - - // MARK: Actions - - @IBAction func clearButtonHit(sender: AnyObject) { - delegate?.clearHitOnNodeCell(self) - } - -} diff --git a/Ryff/UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h b/Ryff/UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h deleted file mode 100644 index bd692cf..0000000 --- a/Ryff/UI/Profile/RiffEdit/RiffCreate/Ryff-Bridging-Header.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -// Data Managers -#import "RYAudioDeckManager.h" -#import "RYDataManager.h" -#import "RYDiscoverServices.h" -#import "RYMediaEditor.h" -#import "RYRegistrationServices.h" -#import "RYRiffAudioEngine.h" -#import "RYRiffAudioNode.h" -#import "RYServices.h" -#import "RYStyleSheet.h" - -// Data Objects -#import "RYPost.h" -#import "RYTag.h" -#import "RYUser.h" - -// Custom UI -#import "FDWaveformView.h" \ No newline at end of file diff --git a/RyffTests/RyffTests-Info.plist b/RyffTests/RyffTests-Info.plist index 0fcbf92..169b6f7 100644 --- a/RyffTests/RyffTests-Info.plist +++ b/RyffTests/RyffTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.ChrisLaganiere.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType