From 9710964e3892452ffe6127b906a62a2dcdf5efd0 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Sat, 23 Sep 2017 23:37:30 -0400 Subject: [PATCH] Sketch out the GIF manager. // FREEBIE --- Signal.xcodeproj/project.pbxproj | 4 + .../src/ViewControllers/HomeViewController.m | 2 + Signal/src/network/GifManager.swift | 83 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 Signal/src/network/GifManager.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 4dd53ee2b..53cc51c4c 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 341BB7491DB727EE001E2975 /* JSQMediaItem+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */; }; 341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */ = {isa = PBXBuildFile; fileRef = 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */; }; 342FCE6B1EF9C375002690AD /* OWS105AttachmentFilePaths.m in Sources */ = {isa = PBXBuildFile; fileRef = 342FCE6A1EF9C375002690AD /* OWS105AttachmentFilePaths.m */; }; + 3430FE181F7751D4000EC51B /* GifManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3430FE171F7751D4000EC51B /* GifManager.swift */; }; 34330A5A1E7875FB00DF2FB9 /* fontawesome-webfont.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A591E7875FB00DF2FB9 /* fontawesome-webfont.ttf */; }; 34330A5C1E787A9800DF2FB9 /* dripicons-v2.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5B1E787A9800DF2FB9 /* dripicons-v2.ttf */; }; 34330A5E1E787BD800DF2FB9 /* ElegantIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 34330A5D1E787BD800DF2FB9 /* ElegantIcons.ttf */; }; @@ -418,6 +419,7 @@ 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugUIMisc.m; sourceTree = ""; }; 342FCE691EF9C375002690AD /* OWS105AttachmentFilePaths.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWS105AttachmentFilePaths.h; path = Migrations/OWS105AttachmentFilePaths.h; sourceTree = ""; }; 342FCE6A1EF9C375002690AD /* OWS105AttachmentFilePaths.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWS105AttachmentFilePaths.m; path = Migrations/OWS105AttachmentFilePaths.m; sourceTree = ""; }; + 3430FE171F7751D4000EC51B /* GifManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GifManager.swift; sourceTree = ""; }; 34330A591E7875FB00DF2FB9 /* fontawesome-webfont.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "fontawesome-webfont.ttf"; sourceTree = ""; }; 34330A5B1E787A9800DF2FB9 /* dripicons-v2.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "dripicons-v2.ttf"; sourceTree = ""; }; 34330A5D1E787BD800DF2FB9 /* ElegantIcons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ElegantIcons.ttf; sourceTree = ""; }; @@ -1406,6 +1408,7 @@ 76EB041D18170B33006006FC /* network */ = { isa = PBXGroup; children = ( + 3430FE171F7751D4000EC51B /* GifManager.swift */, B6B9ECFA198B31BA00C620D3 /* PushManager.h */, B6B9ECFB198B31BA00C620D3 /* PushManager.m */, ); @@ -2247,6 +2250,7 @@ 3400C7961EAF99F4008A8584 /* SelectThreadViewController.m in Sources */, 34D5CCB11EAE7E7F005515DB /* SelectRecipientViewController.m in Sources */, 34B3F88F1E8DF1710035BE1A /* RegistrationViewController.m in Sources */, + 3430FE181F7751D4000EC51B /* GifManager.swift in Sources */, 3448BFCD1EDF0EA7005B2D69 /* OWSMessagesInputToolbar.m in Sources */, 34B3F8901E8DF1710035BE1A /* AppSettingsViewController.m in Sources */, 34FD93701E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m in Sources */, diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index cb30b3f68..377c75db6 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -272,6 +272,8 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; } [self updateBarButtonItems]; + + [GifManager.sharedInstance test]; } - (void)updateBarButtonItems diff --git a/Signal/src/network/GifManager.swift b/Signal/src/network/GifManager.swift new file mode 100644 index 000000000..069a4d237 --- /dev/null +++ b/Signal/src/network/GifManager.swift @@ -0,0 +1,83 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +import Foundation + +@objc class GifManager: NSObject { + + // MARK: - Properties + + static let TAG = "[GifManager]" + + static let sharedInstance = GifManager() + + // Force usage as a singleton + override private init() {} + + deinit { + NotificationCenter.default.removeObserver(self) + } + + private let kGiphyBaseURL = "https://api.giphy.com/" + + private func giphySessionManager() -> AFHTTPSessionManager? { + guard let baseUrl = NSURL(string:kGiphyBaseURL) else { + Logger.error("\(GifManager.TAG) Invalid base URL.") + return nil + } + // TODO: Is this right? + let sessionConf = URLSessionConfiguration.ephemeral + // TODO: Is this right? + sessionConf.connectionProxyDictionary = [ + kCFProxyHostNameKey as String: "giphy-proxy-production.whispersystems.org", + kCFProxyPortNumberKey as String: "80", + kCFProxyTypeKey as String: kCFProxyTypeHTTPS + ] + + let sessionManager = AFHTTPSessionManager(baseURL:baseUrl as URL, + sessionConfiguration:sessionConf) + sessionManager.requestSerializer = AFJSONRequestSerializer() + sessionManager.responseSerializer = AFJSONResponseSerializer() + + return sessionManager + } + + public func test() { + guard let sessionManager = giphySessionManager() else { + Logger.error("\(GifManager.TAG) Couldn't create session manager.") + return + } + guard let baseUrl = NSURL(string:kGiphyBaseURL) else { + Logger.error("\(GifManager.TAG) Invalid base URL.") + return + } + + // TODO: Should we use a separate API key? + let kGiphyApiKey = "3o6ZsYH6U6Eri53TXy" + let kGiphyPageSize = 200 + // TODO: + let kGiphyPageOffset = 0 + // TODO: + let query = "monkey" + // TODO: + guard let queryEncoded = query.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { + Logger.error("\(GifManager.TAG) Could not URL encode query: \(query).") + return + } +// Logger.error("\(GifManager.TAG) queryEncoded: \(queryEncoded) \(queryEncoded).") + let urlString = "/v1/gifs/search?api_key=\(kGiphyApiKey)&offset=\(kGiphyPageOffset)&limit=\(kGiphyPageSize)&q=\(queryEncoded)" +// Logger.error("\(GifManager.TAG) urlString: \(urlString).") +// Logger.error("\(GifManager.TAG) baseUrl: \(baseUrl).") + + sessionManager.get(urlString, + parameters: {}, + progress:nil, + success: { _, value in + Logger.error("\(GifManager.TAG) ---- success: \(value)") + }, + failure: { _, error in + Logger.error("\(GifManager.TAG) ---- failure: \(error)") + }) + } +}