diff --git a/.gitignore b/.gitignore index 312d1f6..7e31423 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,5 @@ fastlane/report.xml fastlane/Preview.html fastlane/screenshots/**/*.png fastlane/test_output + +\.DS_Store diff --git a/Brooklyn.xcodeproj/project.pbxproj b/Brooklyn.xcodeproj/project.pbxproj new file mode 100755 index 0000000..bd1517b --- /dev/null +++ b/Brooklyn.xcodeproj/project.pbxproj @@ -0,0 +1,376 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 203E6506218C65CD0021F2F2 /* thumbnail.png in Resources */ = {isa = PBXBuildFile; fileRef = 203E6504218C65CD0021F2F2 /* thumbnail.png */; }; + 203E6507218C65CD0021F2F2 /* thumbnail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 203E6505218C65CD0021F2F2 /* thumbnail@2x.png */; }; + 20CAF50621891FCE0086AED8 /* BrooklynView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CAF50521891FCE0086AED8 /* BrooklynView.swift */; }; + 20CAF51221892E3A0086AED8 /* Bundle+PathAware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CAF51121892E3A0086AED8 /* Bundle+PathAware.swift */; }; + 20CAF51521892E800086AED8 /* Video.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CAF51421892E800086AED8 /* Video.swift */; }; + 20CAF51721892E950086AED8 /* Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CAF51621892E950086AED8 /* Extension.swift */; }; + 20F89CBE218B92910032BDA5 /* all.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 20F89CBD218B92910032BDA5 /* all.mp4 */; }; + 53794F372189BADC0033A11A /* AVPlayerItem+Init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53794F362189BADC0033A11A /* AVPlayerItem+Init.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 203E6504218C65CD0021F2F2 /* thumbnail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumbnail.png; sourceTree = ""; }; + 203E6505218C65CD0021F2F2 /* thumbnail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumbnail@2x.png"; sourceTree = ""; }; + 20CAF50521891FCE0086AED8 /* BrooklynView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrooklynView.swift; sourceTree = ""; }; + 20CAF51121892E3A0086AED8 /* Bundle+PathAware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+PathAware.swift"; sourceTree = ""; }; + 20CAF51421892E800086AED8 /* Video.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Video.swift; sourceTree = ""; }; + 20CAF51621892E950086AED8 /* Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extension.swift; sourceTree = ""; }; + 20F89CBD218B92910032BDA5 /* all.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = all.mp4; sourceTree = ""; }; + 218D6EDE20FC3CEB0029D4A9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 21F222261B73B5AC00B9A11A /* Brooklyn.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Brooklyn.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + 53794F362189BADC0033A11A /* AVPlayerItem+Init.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AVPlayerItem+Init.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 21F222221B73B5AC00B9A11A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 20CAF50321891F990086AED8 /* Views */ = { + isa = PBXGroup; + children = ( + 20CAF50521891FCE0086AED8 /* BrooklynView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 20CAF50421891F9E0086AED8 /* Resources */ = { + isa = PBXGroup; + children = ( + 203E6504218C65CD0021F2F2 /* thumbnail.png */, + 203E6505218C65CD0021F2F2 /* thumbnail@2x.png */, + 20F89CBD218B92910032BDA5 /* all.mp4 */, + ); + path = Resources; + sourceTree = ""; + }; + 20CAF507218924E50086AED8 /* Extensions */ = { + isa = PBXGroup; + children = ( + 53794F362189BADC0033A11A /* AVPlayerItem+Init.swift */, + 20CAF51121892E3A0086AED8 /* Bundle+PathAware.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 20CAF51321892E740086AED8 /* Enumerations */ = { + isa = PBXGroup; + children = ( + 20CAF51421892E800086AED8 /* Video.swift */, + 20CAF51621892E950086AED8 /* Extension.swift */, + ); + path = Enumerations; + sourceTree = ""; + }; + 218D6EDA20FC3CEB0029D4A9 /* Brooklyn */ = { + isa = PBXGroup; + children = ( + 20CAF51321892E740086AED8 /* Enumerations */, + 20CAF507218924E50086AED8 /* Extensions */, + 20CAF50421891F9E0086AED8 /* Resources */, + 20CAF50321891F990086AED8 /* Views */, + 218D6EDE20FC3CEB0029D4A9 /* Info.plist */, + ); + path = Brooklyn; + sourceTree = ""; + }; + 21F2221C1B73B5AC00B9A11A = { + isa = PBXGroup; + children = ( + 218D6EDA20FC3CEB0029D4A9 /* Brooklyn */, + 21F222271B73B5AC00B9A11A /* Products */, + ); + sourceTree = ""; + }; + 21F222271B73B5AC00B9A11A /* Products */ = { + isa = PBXGroup; + children = ( + 21F222261B73B5AC00B9A11A /* Brooklyn.saver */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 21F222231B73B5AC00B9A11A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 21F222251B73B5AC00B9A11A /* Brooklyn */ = { + isa = PBXNativeTarget; + buildConfigurationList = 21F222311B73B5AC00B9A11A /* Build configuration list for PBXNativeTarget "Brooklyn" */; + buildPhases = ( + 21F222211B73B5AC00B9A11A /* Sources */, + 21F222221B73B5AC00B9A11A /* Frameworks */, + 21F222231B73B5AC00B9A11A /* Headers */, + 21F222241B73B5AC00B9A11A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Brooklyn; + productName = MinimalClock; + productReference = 21F222261B73B5AC00B9A11A /* Brooklyn.saver */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 21F2221D1B73B5AC00B9A11A /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Pedro Carrasco"; + TargetAttributes = { + 21F222251B73B5AC00B9A11A = { + CreatedOnToolsVersion = 6.4; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 21F222201B73B5AC00B9A11A /* Build configuration list for PBXProject "Brooklyn" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 21F2221C1B73B5AC00B9A11A; + productRefGroup = 21F222271B73B5AC00B9A11A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 21F222251B73B5AC00B9A11A /* Brooklyn */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 21F222241B73B5AC00B9A11A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 203E6506218C65CD0021F2F2 /* thumbnail.png in Resources */, + 20F89CBE218B92910032BDA5 /* all.mp4 in Resources */, + 203E6507218C65CD0021F2F2 /* thumbnail@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 21F222211B73B5AC00B9A11A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 20CAF51721892E950086AED8 /* Extension.swift in Sources */, + 20CAF50621891FCE0086AED8 /* BrooklynView.swift in Sources */, + 20CAF51521892E800086AED8 /* Video.swift in Sources */, + 20CAF51221892E3A0086AED8 /* Bundle+PathAware.swift in Sources */, + 53794F372189BADC0033A11A /* AVPlayerItem+Init.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 21F2222F1B73B5AC00B9A11A /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + 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_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; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 4.2; + }; + name = Debug; + }; + 21F222301B73B5AC00B9A11A /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + 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; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 4.2; + }; + name = Release; + }; + 21F222321B73B5AC00B9A11A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/Brooklyn/Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Screen Savers"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = oedrommcarrasco.brooklyn; + PRODUCT_NAME = Brooklyn; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + WRAPPER_EXTENSION = saver; + }; + name = Debug; + }; + 21F222331B73B5AC00B9A11A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/Brooklyn/Info.plist"; + INSTALL_PATH = "$(HOME)/Library/Screen Savers"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = oedrommcarrasco.brooklyn; + PRODUCT_NAME = Brooklyn; + PROVISIONING_PROFILE_SPECIFIER = ""; + WRAPPER_EXTENSION = saver; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 21F222201B73B5AC00B9A11A /* Build configuration list for PBXProject "Brooklyn" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 21F2222F1B73B5AC00B9A11A /* Debug */, + 21F222301B73B5AC00B9A11A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 21F222311B73B5AC00B9A11A /* Build configuration list for PBXNativeTarget "Brooklyn" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 21F222321B73B5AC00B9A11A /* Debug */, + 21F222331B73B5AC00B9A11A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 21F2221D1B73B5AC00B9A11A /* Project object */; +} diff --git a/Brooklyn/Brooklyn.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Brooklyn.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Brooklyn/Brooklyn.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Brooklyn.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Brooklyn/Brooklyn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Brooklyn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Brooklyn/Brooklyn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Brooklyn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Brooklyn/Brooklyn.xcodeproj/project.pbxproj b/Brooklyn/Brooklyn.xcodeproj/project.pbxproj deleted file mode 100644 index 626d998..0000000 --- a/Brooklyn/Brooklyn.xcodeproj/project.pbxproj +++ /dev/null @@ -1,304 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 5334903A21889FB3001ED443 /* BrooklynView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5334903921889FB3001ED443 /* BrooklynView.h */; }; - 5334903C21889FB3001ED443 /* BrooklynView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5334903B21889FB3001ED443 /* BrooklynView.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 5334903621889FB3001ED443 /* Brooklyn.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Brooklyn.saver; sourceTree = BUILT_PRODUCTS_DIR; }; - 5334903921889FB3001ED443 /* BrooklynView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BrooklynView.h; sourceTree = ""; }; - 5334903B21889FB3001ED443 /* BrooklynView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BrooklynView.m; sourceTree = ""; }; - 5334903D21889FB3001ED443 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5334903321889FB3001ED443 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5334902C21889FB3001ED443 = { - isa = PBXGroup; - children = ( - 5334903821889FB3001ED443 /* Brooklyn */, - 5334903721889FB3001ED443 /* Products */, - ); - sourceTree = ""; - }; - 5334903721889FB3001ED443 /* Products */ = { - isa = PBXGroup; - children = ( - 5334903621889FB3001ED443 /* Brooklyn.saver */, - ); - name = Products; - sourceTree = ""; - }; - 5334903821889FB3001ED443 /* Brooklyn */ = { - isa = PBXGroup; - children = ( - 5334903921889FB3001ED443 /* BrooklynView.h */, - 5334903B21889FB3001ED443 /* BrooklynView.m */, - 5334903D21889FB3001ED443 /* Info.plist */, - ); - path = Brooklyn; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 5334903121889FB3001ED443 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 5334903A21889FB3001ED443 /* BrooklynView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 5334903521889FB3001ED443 /* Brooklyn */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5334904021889FB3001ED443 /* Build configuration list for PBXNativeTarget "Brooklyn" */; - buildPhases = ( - 5334903121889FB3001ED443 /* Headers */, - 5334903221889FB3001ED443 /* Sources */, - 5334903321889FB3001ED443 /* Frameworks */, - 5334903421889FB3001ED443 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Brooklyn; - productName = Brooklyn; - productReference = 5334903621889FB3001ED443 /* Brooklyn.saver */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 5334902D21889FB3001ED443 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1000; - ORGANIZATIONNAME = "Pedro Carrasco"; - TargetAttributes = { - 5334903521889FB3001ED443 = { - CreatedOnToolsVersion = 10.0; - }; - }; - }; - buildConfigurationList = 5334903021889FB3001ED443 /* Build configuration list for PBXProject "Brooklyn" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 5334902C21889FB3001ED443; - productRefGroup = 5334903721889FB3001ED443 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 5334903521889FB3001ED443 /* Brooklyn */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5334903421889FB3001ED443 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5334903221889FB3001ED443 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5334903C21889FB3001ED443 /* BrooklynView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 5334903E21889FB3001ED443 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - 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; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 5334903F21889FB3001ED443 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - 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; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - }; - name = Release; - }; - 5334904121889FB3001ED443 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Brooklyn/Info.plist; - INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - PRODUCT_BUNDLE_IDENTIFIER = pedrommcarrasco.Brooklyn; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = saver; - }; - name = Debug; - }; - 5334904221889FB3001ED443 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Brooklyn/Info.plist; - INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - PRODUCT_BUNDLE_IDENTIFIER = pedrommcarrasco.Brooklyn; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = saver; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5334903021889FB3001ED443 /* Build configuration list for PBXProject "Brooklyn" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5334903E21889FB3001ED443 /* Debug */, - 5334903F21889FB3001ED443 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5334904021889FB3001ED443 /* Build configuration list for PBXNativeTarget "Brooklyn" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5334904121889FB3001ED443 /* Debug */, - 5334904221889FB3001ED443 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 5334902D21889FB3001ED443 /* Project object */; -} diff --git a/Brooklyn/Brooklyn/BrooklynView.h b/Brooklyn/Brooklyn/BrooklynView.h deleted file mode 100644 index 0fcf656..0000000 --- a/Brooklyn/Brooklyn/BrooklynView.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// BrooklynView.h -// Brooklyn -// -// Created by Pedro Carrasco on 30/10/2018. -// Copyright © 2018 Pedro Carrasco. All rights reserved. -// - -#import - -@interface BrooklynView : ScreenSaverView - -@end diff --git a/Brooklyn/Brooklyn/BrooklynView.m b/Brooklyn/Brooklyn/BrooklynView.m deleted file mode 100644 index 2b47bd4..0000000 --- a/Brooklyn/Brooklyn/BrooklynView.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// BrooklynView.m -// Brooklyn -// -// Created by Pedro Carrasco on 30/10/2018. -// Copyright © 2018 Pedro Carrasco. All rights reserved. -// - -#import "BrooklynView.h" - -@implementation BrooklynView - -- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview -{ - self = [super initWithFrame:frame isPreview:isPreview]; - if (self) { - [self setAnimationTimeInterval:1/30.0]; - } - return self; -} - -- (void)startAnimation -{ - [super startAnimation]; -} - -- (void)stopAnimation -{ - [super stopAnimation]; -} - -- (void)drawRect:(NSRect)rect -{ - [super drawRect:rect]; -} - -- (void)animateOneFrame -{ - return; -} - -- (BOOL)hasConfigureSheet -{ - return NO; -} - -- (NSWindow*)configureSheet -{ - return nil; -} - -@end diff --git a/Brooklyn/Enumerations/Extension.swift b/Brooklyn/Enumerations/Extension.swift new file mode 100644 index 0000000..bd1bfae --- /dev/null +++ b/Brooklyn/Enumerations/Extension.swift @@ -0,0 +1,15 @@ +// +// Extension.swift +// Brooklyn +// +// Created by Pedro Carrasco on 31/10/2018. +// Copyright © 2018 Pedro Carrasco. All rights reserved. +// + +import Foundation + +// MARK: - Extension +enum Extension: String { + + case mp4 +} diff --git a/Brooklyn/Enumerations/Video.swift b/Brooklyn/Enumerations/Video.swift new file mode 100644 index 0000000..705892e --- /dev/null +++ b/Brooklyn/Enumerations/Video.swift @@ -0,0 +1,15 @@ +// +// Video.swift +// Brooklyn +// +// Created by Pedro Carrasco on 31/10/2018. +// Copyright © 2018 Pedro Carrasco. All rights reserved. +// + +import Foundation + +// MARK: - Video +enum Video: String { + + case all +} diff --git a/Brooklyn/Extensions/AVPlayerItem+Init.swift b/Brooklyn/Extensions/AVPlayerItem+Init.swift new file mode 100644 index 0000000..99468f2 --- /dev/null +++ b/Brooklyn/Extensions/AVPlayerItem+Init.swift @@ -0,0 +1,20 @@ +// +// AVPlayerItem+Init.swift +// Brooklyn +// +// Created by Pedro Carrasco on 31/10/2018. +// Copyright © 2018 Pedro Carrasco. All rights reserved. +// + +import AVKit + +// MARK: Init +extension AVPlayerItem { + + convenience init?(name: Video, extension ext: Extension) { + + guard let url = Bundle.pathAware.url(forResource: name.rawValue, withExtension: ext.rawValue) else { return nil } + + self.init(url: url) + } +} diff --git a/Brooklyn/Extensions/Bundle+PathAware.swift b/Brooklyn/Extensions/Bundle+PathAware.swift new file mode 100644 index 0000000..abd8a40 --- /dev/null +++ b/Brooklyn/Extensions/Bundle+PathAware.swift @@ -0,0 +1,18 @@ +// +// Bundle+PathAware.swift +// Brooklyn +// +// Created by Pedro Carrasco on 31/10/2018. +// Copyright © 2018 Pedro Carrasco. All rights reserved. +// + +import Foundation + +// MARK: Path Aware +extension Bundle { + + static var pathAware: Bundle { + + return Bundle(for: BrooklynView.self) + } +} diff --git a/Brooklyn/Brooklyn/Info.plist b/Brooklyn/Info.plist old mode 100644 new mode 100755 similarity index 78% rename from Brooklyn/Brooklyn/Info.plist rename to Brooklyn/Info.plist index cf569c1..fb298ce --- a/Brooklyn/Brooklyn/Info.plist +++ b/Brooklyn/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) + en CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -18,9 +18,7 @@ 1.0 CFBundleVersion 1 - NSHumanReadableCopyright - Copyright © 2018 Pedro Carrasco. All rights reserved. NSPrincipalClass - BrooklynView + Brooklyn.BrooklynView diff --git a/Brooklyn/Resources/all.mp4 b/Brooklyn/Resources/all.mp4 new file mode 100644 index 0000000..3403403 Binary files /dev/null and b/Brooklyn/Resources/all.mp4 differ diff --git a/Brooklyn/Resources/thumbnail.png b/Brooklyn/Resources/thumbnail.png new file mode 100644 index 0000000..5bd9712 Binary files /dev/null and b/Brooklyn/Resources/thumbnail.png differ diff --git a/Brooklyn/Resources/thumbnail@2x.png b/Brooklyn/Resources/thumbnail@2x.png new file mode 100644 index 0000000..1778714 Binary files /dev/null and b/Brooklyn/Resources/thumbnail@2x.png differ diff --git a/Brooklyn/Views/BrooklynView.swift b/Brooklyn/Views/BrooklynView.swift new file mode 100644 index 0000000..be25e0f --- /dev/null +++ b/Brooklyn/Views/BrooklynView.swift @@ -0,0 +1,111 @@ +// +// BrooklynView.swift +// Brooklyn +// +// Created by Pedro Carrasco on 30/10/2018. +// Copyright © 2018 Pedro Carrasco. All rights reserved. +// + +import Foundation +import ScreenSaver +import AVKit + +// MARK: - BrooklynView +final class BrooklynView: ScreenSaverView { + + // MARK: Local Typealias + typealias Static = BrooklynView + + // MARK: Constant + private enum Constant { + + static let secondPerFrame = 1.0 / 30.0 + } + + // MARK: Outlets + private let videoLayer = AVPlayerLayer() + + // MARK: Properties + private let looper: AVPlayerLooper? + private let player = AVQueuePlayer() + + // MARK: Initialization + required init?(coder decoder: NSCoder) { + + self.looper = Static.looper(with: player) + super.init(coder: decoder) + + configure() + } + + override init?(frame: NSRect, isPreview: Bool) { + + self.looper = Static.looper(with: player) + super.init(frame: frame, isPreview: isPreview) + + self.animationTimeInterval = Constant.secondPerFrame + configure() + } +} + +// MARK: - Lifecycle +extension BrooklynView { + + override func startAnimation() { + super.startAnimation() + + player.play() + } + + override func stopAnimation() { + super.stopAnimation() + + player.pause() + } +} + +// MARK: - Configuration +private extension BrooklynView { + + func configure() { + + defineLayer() + setupLayer() + } + + func defineLayer() { + + wantsLayer = true + defineVideoLayer() + layer = videoLayer + } + + func setupLayer() { + + videoLayer.player = player + } +} + +// MARK: - Define Layers +private extension BrooklynView { + + func defineVideoLayer() { + + videoLayer.frame = bounds + videoLayer.autoresizingMask = [.layerWidthSizable, .layerHeightSizable] + videoLayer.needsDisplayOnBoundsChange = true + videoLayer.contentsGravity = .resizeAspectFill + videoLayer.backgroundColor = NSColor.black.cgColor + } +} + +// MARK: - Private Static +private extension BrooklynView { + + static func looper(with player: AVQueuePlayer) -> AVPlayerLooper? { + + guard let item = AVPlayerItem(name: .all, extension: .mp4) else { return nil } + + return AVPlayerLooper(player: player, templateItem: item) + } +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ce35713 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Brooklyn Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at pedrommcarrasco@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..67af3d9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing + +Thank you for your interest in Brooklyn. + +## Contributions + +To request a feature, report a bug, or any other kind of improvements for this repository: + +* Create an issue. +* if you would also like to contribute, then create a pull request referencing that issue. +Anyone with a github account may create an issue or contribute with pull requests. + +## Rules + +There's only one simple rule, follow the issue and pull request's template. + +## Merging Pull Request + +In this project, the following policies apply: + +* Only maintainers of this module may merge pull requests. +* A person may not merge their own pull requests, nor a pull request that they have contributed code to. +* A pull request may be merged at any time after it is created. diff --git a/Design/logo.jpg b/Design/logo.jpg new file mode 100644 index 0000000..493ff37 Binary files /dev/null and b/Design/logo.jpg differ diff --git a/Design/logo.psd b/Design/logo.psd new file mode 100644 index 0000000..02f4ecd Binary files /dev/null and b/Design/logo.psd differ diff --git a/Design/showcase.gif b/Design/showcase.gif new file mode 100644 index 0000000..80576ba Binary files /dev/null and b/Design/showcase.gif differ diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a11ad13 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +## What was done? +* Added ... +* Fixed ... +* Updated ... +* ... + +## Why? +This was mainly done because ... + +## Screenshots +If there's any relevant screenshot please attach it here. diff --git a/README.md b/README.md new file mode 100644 index 0000000..93ec687 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +![](https://github.com/pedrommcarrasco/Brooklyn/blob/master/Design/logo.jpg?raw=true) + +Screen Saver based on the animations presented during **Apple Special Event** (October 30, 2018) from the Brooklyn Academy of Music, Howard Gilman Opera House. + +![](https://github.com/pedrommcarrasco/Brooklyn/blob/master/Design/showcase.gif?raw=true) + +![](https://img.shields.io/github/downloads/pedrommcarrasco/brooklyn/total.svg?maxAge=86400) ![GitHub contributors](https://img.shields.io/github/contributors/pedrommcarrasco/brooklyn.svg?maxAge=2592000) [![apm](https://img.shields.io/apm/l/vim-mode.svg)](https://github.com/pedrommcarrasco/Brooklyn/blob/master/LICENSE) + +## Features ✅ + +* Doesn't require internet +* Provides an *all animations* screen saver + +### Upcoming ⌛ + +* Add CI (TravisCI or CircleCI) +* Isolate & edit every animation +* Provide a preferences menu to choose which animations the user wants to display +* Homebrew cask support (download via terminal, auto-updates, etc) +* Custom clock + +## Instalation 📦 + +1. Close System Preferences +2. [Click here to Download]() +3. Open **Brooklyn.saver** (double click) + +## Uninstallation 🗑️ + +There are two options to uninstall Brooklyn from your MacBook. + +- Right-click on the Brooklyn screensaver in System Preferences and select `Delete "Brooklyn"`. +- Delete the "Brooklyn.saver" directly either in `/Library/Screen Savers` or `/Users/USERNAME/Library/Screen Savers`. + +## Compatibility 🔧 + +Brooklyn is written in Swift, which requires OS X Mavericks (10.9) or above. + +## Contributing 🙌 + +Feel free to contribute to this project by providng [ideas](https://github.com/pedrommcarrasco/Fluky/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) or opening [pull requests](https://github.com/pedrommcarrasco/Fluky/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc) with new features, or simply solving an existing issue. + +## License ⛔ + +Brooklyn's available under the MIT license. See the [LICENSE](https://github.com/pedrommcarrasco/Fluky/blob/master/LICENSE) file for more information.