From 9e9bf56fba505a48ee900cbc6decff6325db79e8 Mon Sep 17 00:00:00 2001 From: Florian Gabach Date: Mon, 27 Feb 2017 17:07:34 +0100 Subject: [PATCH] First commit --- .../project.pbxproj | 349 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 12507 bytes .../xcschemes/OpenSourceController.xcscheme | 80 ++++ .../xcschemes/xcschememanagement.plist | 22 ++ .../OpenSourceController.h | 19 + .../Controller/OpenSourceController.swift | 32 ++ .../Controller/OpenSourceViewController.swift | 158 ++++++++ .../Source/Model/LicenceDownloader.swift | 38 ++ .../Source/Model/LicenceFile.swift | 56 +++ .../Source/View/OpenSourceTableViewCell.swift | 63 ++++ 11 files changed, 824 insertions(+) create mode 100644 OpenSourceController/OpenSourceController.xcodeproj/project.pbxproj create mode 100644 OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/xcuserdata/floriangabach.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 OpenSourceController/OpenSourceController.xcodeproj/xcshareddata/xcschemes/OpenSourceController.xcscheme create mode 100644 OpenSourceController/OpenSourceController.xcodeproj/xcuserdata/floriangabach.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 OpenSourceController/OpenSourceController/OpenSourceController.h create mode 100644 OpenSourceController/Source/Controller/OpenSourceController.swift create mode 100644 OpenSourceController/Source/Controller/OpenSourceViewController.swift create mode 100644 OpenSourceController/Source/Model/LicenceDownloader.swift create mode 100644 OpenSourceController/Source/Model/LicenceFile.swift create mode 100644 OpenSourceController/Source/View/OpenSourceTableViewCell.swift diff --git a/OpenSourceController/OpenSourceController.xcodeproj/project.pbxproj b/OpenSourceController/OpenSourceController.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7aeff44 --- /dev/null +++ b/OpenSourceController/OpenSourceController.xcodeproj/project.pbxproj @@ -0,0 +1,349 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 7608FF731E6485A700656BA2 /* OpenSourceController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7608FF711E6485A700656BA2 /* OpenSourceController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7608FF7E1E6485D000656BA2 /* LicenceDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7608FF7C1E6485D000656BA2 /* LicenceDownloader.swift */; }; + 7608FF7F1E6485D000656BA2 /* LicenceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7608FF7D1E6485D000656BA2 /* LicenceFile.swift */; }; + 7608FF811E6485D600656BA2 /* OpenSourceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7608FF801E6485D600656BA2 /* OpenSourceTableViewCell.swift */; }; + 7608FF841E6485DE00656BA2 /* OpenSourceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7608FF821E6485DE00656BA2 /* OpenSourceController.swift */; }; + 7608FF851E6485DE00656BA2 /* OpenSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7608FF831E6485DE00656BA2 /* OpenSourceViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 7608FF6E1E6485A700656BA2 /* OpenSourceController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenSourceController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7608FF711E6485A700656BA2 /* OpenSourceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenSourceController.h; sourceTree = ""; }; + 7608FF721E6485A700656BA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7608FF7C1E6485D000656BA2 /* LicenceDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceDownloader.swift; path = Source/Model/LicenceDownloader.swift; sourceTree = SOURCE_ROOT; }; + 7608FF7D1E6485D000656BA2 /* LicenceFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LicenceFile.swift; path = Source/Model/LicenceFile.swift; sourceTree = SOURCE_ROOT; }; + 7608FF801E6485D600656BA2 /* OpenSourceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceTableViewCell.swift; path = Source/View/OpenSourceTableViewCell.swift; sourceTree = SOURCE_ROOT; }; + 7608FF821E6485DE00656BA2 /* OpenSourceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceController.swift; path = Source/Controller/OpenSourceController.swift; sourceTree = SOURCE_ROOT; }; + 7608FF831E6485DE00656BA2 /* OpenSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OpenSourceViewController.swift; path = Source/Controller/OpenSourceViewController.swift; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7608FF6A1E6485A700656BA2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7608FF641E6485A700656BA2 = { + isa = PBXGroup; + children = ( + 7608FF701E6485A700656BA2 /* OpenSourceController */, + 7608FF6F1E6485A700656BA2 /* Products */, + ); + sourceTree = ""; + }; + 7608FF6F1E6485A700656BA2 /* Products */ = { + isa = PBXGroup; + children = ( + 7608FF6E1E6485A700656BA2 /* OpenSourceController.framework */, + ); + name = Products; + sourceTree = ""; + }; + 7608FF701E6485A700656BA2 /* OpenSourceController */ = { + isa = PBXGroup; + children = ( + 7608FF7B1E6485C400656BA2 /* Controller */, + 7608FF7A1E6485BE00656BA2 /* View */, + 7608FF791E6485BA00656BA2 /* Model */, + 7608FF711E6485A700656BA2 /* OpenSourceController.h */, + 7608FF721E6485A700656BA2 /* Info.plist */, + ); + path = OpenSourceController; + sourceTree = ""; + }; + 7608FF791E6485BA00656BA2 /* Model */ = { + isa = PBXGroup; + children = ( + 7608FF7C1E6485D000656BA2 /* LicenceDownloader.swift */, + 7608FF7D1E6485D000656BA2 /* LicenceFile.swift */, + ); + name = Model; + sourceTree = ""; + }; + 7608FF7A1E6485BE00656BA2 /* View */ = { + isa = PBXGroup; + children = ( + 7608FF801E6485D600656BA2 /* OpenSourceTableViewCell.swift */, + ); + name = View; + sourceTree = ""; + }; + 7608FF7B1E6485C400656BA2 /* Controller */ = { + isa = PBXGroup; + children = ( + 7608FF821E6485DE00656BA2 /* OpenSourceController.swift */, + 7608FF831E6485DE00656BA2 /* OpenSourceViewController.swift */, + ); + name = Controller; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 7608FF6B1E6485A700656BA2 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7608FF731E6485A700656BA2 /* OpenSourceController.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 7608FF6D1E6485A700656BA2 /* OpenSourceController */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7608FF761E6485A700656BA2 /* Build configuration list for PBXNativeTarget "OpenSourceController" */; + buildPhases = ( + 7608FF691E6485A700656BA2 /* Sources */, + 7608FF6A1E6485A700656BA2 /* Frameworks */, + 7608FF6B1E6485A700656BA2 /* Headers */, + 7608FF6C1E6485A700656BA2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OpenSourceController; + productName = OpenSourceController; + productReference = 7608FF6E1E6485A700656BA2 /* OpenSourceController.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7608FF651E6485A700656BA2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Florian Gabach"; + TargetAttributes = { + 7608FF6D1E6485A700656BA2 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 62PP362QNQ; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 7608FF681E6485A700656BA2 /* Build configuration list for PBXProject "OpenSourceController" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7608FF641E6485A700656BA2; + productRefGroup = 7608FF6F1E6485A700656BA2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7608FF6D1E6485A700656BA2 /* OpenSourceController */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7608FF6C1E6485A700656BA2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7608FF691E6485A700656BA2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7608FF851E6485DE00656BA2 /* OpenSourceViewController.swift in Sources */, + 7608FF841E6485DE00656BA2 /* OpenSourceController.swift in Sources */, + 7608FF811E6485D600656BA2 /* OpenSourceTableViewCell.swift in Sources */, + 7608FF7E1E6485D000656BA2 /* LicenceDownloader.swift in Sources */, + 7608FF7F1E6485D000656BA2 /* LicenceFile.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 7608FF741E6485A700656BA2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 7608FF751E6485A700656BA2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7608FF771E6485A700656BA2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 62PP362QNQ; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = OpenSourceController/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceController; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 7608FF781E6485A700656BA2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 62PP362QNQ; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = OpenSourceController/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.fg.OpenSourceController; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7608FF681E6485A700656BA2 /* Build configuration list for PBXProject "OpenSourceController" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7608FF741E6485A700656BA2 /* Debug */, + 7608FF751E6485A700656BA2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7608FF761E6485A700656BA2 /* Build configuration list for PBXNativeTarget "OpenSourceController" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7608FF771E6485A700656BA2 /* Debug */, + 7608FF781E6485A700656BA2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7608FF651E6485A700656BA2 /* Project object */; +} diff --git a/OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f0ab45b --- /dev/null +++ b/OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/xcuserdata/floriangabach.xcuserdatad/UserInterfaceState.xcuserstate b/OpenSourceController/OpenSourceController.xcodeproj/project.xcworkspace/xcuserdata/floriangabach.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a45211a745b19dfca7b7d11532d2b18dea965b9c GIT binary patch literal 12507 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 PN5pSQVi?~;se%6ivdoII literal 0 HcmV?d00001 diff --git a/OpenSourceController/OpenSourceController.xcodeproj/xcshareddata/xcschemes/OpenSourceController.xcscheme b/OpenSourceController/OpenSourceController.xcodeproj/xcshareddata/xcschemes/OpenSourceController.xcscheme new file mode 100644 index 0000000..fc48e27 --- /dev/null +++ b/OpenSourceController/OpenSourceController.xcodeproj/xcshareddata/xcschemes/OpenSourceController.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenSourceController/OpenSourceController.xcodeproj/xcuserdata/floriangabach.xcuserdatad/xcschemes/xcschememanagement.plist b/OpenSourceController/OpenSourceController.xcodeproj/xcuserdata/floriangabach.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..3ff9f57 --- /dev/null +++ b/OpenSourceController/OpenSourceController.xcodeproj/xcuserdata/floriangabach.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + OpenSourceController.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 7608FF6D1E6485A700656BA2 + + primary + + + + + diff --git a/OpenSourceController/OpenSourceController/OpenSourceController.h b/OpenSourceController/OpenSourceController/OpenSourceController.h new file mode 100644 index 0000000..83e04dd --- /dev/null +++ b/OpenSourceController/OpenSourceController/OpenSourceController.h @@ -0,0 +1,19 @@ +// +// OpenSourceController.h +// OpenSourceController +// +// Created by Florian Gabach on 27/02/2017. +// Copyright © 2017 Florian Gabach. All rights reserved. +// + +#import + +//! Project version number for OpenSourceController. +FOUNDATION_EXPORT double OpenSourceControllerVersionNumber; + +//! Project version string for OpenSourceController. +FOUNDATION_EXPORT const unsigned char OpenSourceControllerVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/OpenSourceController/Source/Controller/OpenSourceController.swift b/OpenSourceController/Source/Controller/OpenSourceController.swift new file mode 100644 index 0000000..efcb9cf --- /dev/null +++ b/OpenSourceController/Source/Controller/OpenSourceController.swift @@ -0,0 +1,32 @@ +// +// OpenSourceController.swift +// Pods +// +// Created by Florian Gabach on 05/02/2017. +// +// + +import UIKit + +public class OpenSourceController: NSObject { + + // Contains list of licence object + public var licences: [LicenceFile]? + + /// Present OpenSourceViewController embbeded in navigation controller + /// + /// - Parameter from: the source controller + public final func presentOpenSourceController(from: UIViewController) { + // Create open source controller + let licenceController = OpenSourceViewController() + + // Init licence + licenceController.licences = self.licences + + // Embed in navigation controller + let navController = UINavigationController(rootViewController: licenceController) + + // Present controller + from.present(navController, animated: true) + } +} diff --git a/OpenSourceController/Source/Controller/OpenSourceViewController.swift b/OpenSourceController/Source/Controller/OpenSourceViewController.swift new file mode 100644 index 0000000..3c36f86 --- /dev/null +++ b/OpenSourceController/Source/Controller/OpenSourceViewController.swift @@ -0,0 +1,158 @@ +// +// OpenSourceViewController.swift +// Pods +// +// Created by Florian Gabach on 05/02/2017. +// +// + +import UIKit + +class OpenSourceViewController: UITableViewController { + + // MARK: - Var + + /// Loading indicator + fileprivate var indicator = UIActivityIndicatorView() + + /// TableViewCell identifier + private let reuseIdentifier = "openSourceCell" + + /// Contains all licence object before downloaded + var licences: [LicenceFile]? + + /// Contains all licences object after downloaded + fileprivate var downloadedLicence: [LicenceFile]? { + didSet { + // Update UI + DispatchQueue.main.async { + self.stopLoading() + self.tableView.reloadData() + } + } + } + + // MARK: - Lifecyle + + override func viewDidLoad() { + super.viewDidLoad() + + // Prepare tableview + self.prepareTableView() + + // Download licences + self.prepareLicences() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + // MARK: - Prepare + + /// Download licences + fileprivate func prepareLicences() { + if let licences = self.licences { + self.startLoading() + LicenceDownloader.downloadLicences(licences: licences) { () in + // Update licences + self.downloadedLicence = self.licences + } + } + } + + /// Init tableView dataSource, delegate, bar button & title + fileprivate func prepareTableView() { + // Common init + self.tableView.tableFooterView = UIView() + self.title = NSLocalizedString("Tiers library", comment: "") + self.tableView.register(OpenSourceTableViewCell.self, forCellReuseIdentifier: self.reuseIdentifier) + self.tableView.dataSource = self + self.tableView.delegate = self + self.tableView.separatorStyle = .singleLine + + // Close button (on the right corner of navigation bar) + let closeButton = UIBarButtonItem(barButtonSystemItem: .stop, + target: self, + action: #selector(self.closePicker)) + self.navigationItem.rightBarButtonItem = closeButton + + // Loading indicator + self.prepareActivityIndicator() + } + + // MARK: - Loading indicator + + /// Prepare UIActivityIndicatorView and display it at the center of the view + fileprivate func prepareActivityIndicator() { + self.indicator = UIActivityIndicatorView(frame:CGRect(x: 0, y: 0, width: 40, height: 40) ) + self.indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray + self.indicator.center = self.view.center + self.view.addSubview(indicator) + } + + /// Start loading : start the loader animation + fileprivate func startLoading() { + self.indicator.startAnimating() + self.indicator.backgroundColor = UIColor.clear + self.indicator.color = UIColor.black + self.indicator.isHidden = false + } + + /// Stop loading : stop and hide the loader + fileprivate func stopLoading() { + self.indicator.hidesWhenStopped = true + self.indicator.stopAnimating() + self.indicator.isHidden = true + } + + // MARK: - Table View Data Source + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.downloadedLicence?.count ?? 0 + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + var cell = tableView.dequeueReusableCell(withIdentifier: self.reuseIdentifier, + for: indexPath) as? OpenSourceTableViewCell + if cell == nil { + cell = OpenSourceTableViewCell(style: UITableViewCellStyle.default, + reuseIdentifier: self.reuseIdentifier) + } + + let libraryTitleAttribut = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: UIFont.systemFontSize + 2)] + let libraryLicenceAttribut = [NSFontAttributeName: UIFont.systemFont(ofSize: UIFont.systemFontSize)] + let libraryTitle = NSMutableAttributedString(string: self.downloadedLicence?[indexPath.row].title ?? "", + attributes: libraryTitleAttribut) + libraryTitle.append(NSAttributedString(string: "\n\n")) + libraryTitle.append(NSAttributedString(string: self.downloadedLicence?[indexPath.row].detail ?? "", + attributes: libraryLicenceAttribut)) + cell?.textLabel?.attributedText = libraryTitle + + return cell! + } + + override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableViewAutomaticDimension + } + + // MARK: - Action + + /// Handler for click on close button + @objc fileprivate func closePicker() { + self.dismissController() + } + + // MARK: - Navigation + + /// Dismiss the OpenSourceController + func dismissController() { + DispatchQueue.main.async { + self.dismiss(animated: true, completion: nil) + } + } +} diff --git a/OpenSourceController/Source/Model/LicenceDownloader.swift b/OpenSourceController/Source/Model/LicenceDownloader.swift new file mode 100644 index 0000000..faf8264 --- /dev/null +++ b/OpenSourceController/Source/Model/LicenceDownloader.swift @@ -0,0 +1,38 @@ +// +// LicenceDownloader.swift +// Pods +// +// Created by Florian Gabach on 21/02/2017. +// +// + +import UIKit + +class LicenceDownloader: NSObject { + + /// Download every licence + /// + /// - Parameters: + /// - licences: array which contains licence model model + /// - completion: end downloading completion + class func downloadLicences(licences: [LicenceFile], + completion: @escaping () -> Void) { + // Number of licences + let licenceCount = licences.count + + // Already licence downloaded + var alreadyDownloaded = 0 + + // Download licence's detail for every lience + for licence in licences { + licence.downloadLicenceDetail(completion: { () in + alreadyDownloaded += 1 + + // If this is the last licence, perfom completion + if licenceCount == alreadyDownloaded { + completion() + } + }) + } + } +} diff --git a/OpenSourceController/Source/Model/LicenceFile.swift b/OpenSourceController/Source/Model/LicenceFile.swift new file mode 100644 index 0000000..d77567f --- /dev/null +++ b/OpenSourceController/Source/Model/LicenceFile.swift @@ -0,0 +1,56 @@ +// +// LicenceFile.swift +// Pods +// +// Created by Florian Gabach on 05/02/2017. +// +// + +import UIKit + +public class LicenceFile: NSObject { + + // MARK- Var + + /// Name of the library + var title: String? + + /// Url of the library's licence + var url: String + + /// Library's licence + var detail: String? + + // MARK- Init + + /// Licence initializer + /// + /// - Parameters: + /// - title: name of the library + /// - url: url of the licence content + public init(title: String, url: String) { + self.title = title + self.url = url + } + + /// Download licence detail + /// + /// - Parameter completion: end of download handler + func downloadLicenceDetail(completion: @escaping (Void) -> Void) { + if let url = URL(string: self.url) { + let task = URLSession.shared.dataTask(with: url) { (data, _, _) in + if let data = data, + let html = String(data: data, encoding: String.Encoding.utf8) { + + // Update licence model + self.detail = html + + // Log + print("Licence for \(self.title ?? "") downloaded with success.") + } + completion() + } + task.resume() + } + } +} diff --git a/OpenSourceController/Source/View/OpenSourceTableViewCell.swift b/OpenSourceController/Source/View/OpenSourceTableViewCell.swift new file mode 100644 index 0000000..cd6cc7a --- /dev/null +++ b/OpenSourceController/Source/View/OpenSourceTableViewCell.swift @@ -0,0 +1,63 @@ +// +// OpenSourceTableViewCell.swift +// Pods +// +// Created by Florian Gabach on 05/02/2017. +// +// + +import UIKit + +class OpenSourceTableViewCell: UITableViewCell { + + // MARK: IBOutlet + + @IBOutlet var licenceTitle: UILabel! + @IBOutlet var licenceDesc: UILabel! + + // MARK: - Lifecycle + + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + super.init(style: .default, + reuseIdentifier: reuseIdentifier) + + self.prepareCellComponent() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + + override func layoutSubviews() { + super.layoutSubviews() + } + + // MARK: - Prepare + + func prepareCellComponent() { + // Text + self.textLabel?.numberOfLines = 0 + + // Common init + self.accessoryType = .none + self.selectionStyle = .none + } + + // MARK: - Configure + + /// Initialize the cell content with Licence model + /// + /// - Parameter licence: the licence model + func configure(licence: LicenceFile) { + + // Library's name + self.licenceTitle.text = licence.title + + // Library licence's detail + self.licenceDesc.text = licence.detail + } +}