From d8cb3dd3c761ceabb9edbd99a2e51f443b9b7838 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Sat, 5 Nov 2016 23:04:53 -0700 Subject: [PATCH] =?UTF-8?q?Initial=20add=20=E2=9A=A1=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + GRGE/GRGE.xcodeproj/project.pbxproj | 566 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + GRGE/GRGE/AppDelegate.swift | 12 + .../AppIcon.appiconset/Contents.json | 98 +++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 7941 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 16761 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 3745 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 12555 bytes .../AppIcon.appiconset/Icon-83.5@2x.png | Bin 0 -> 14667 bytes GRGE/GRGE/Base.lproj/LaunchScreen.storyboard | 31 + GRGE/GRGE/Base.lproj/Main.storyboard | 176 ++++++ GRGE/GRGE/GRGE-Bridging-Header.h | 6 + GRGE/GRGE/Info.plist | 45 ++ GRGE/GRGE/MainViewController.swift | 153 +++++ GRGE/GRGE/SettingsViewController.swift | 37 ++ GRGE/GRGE/gears.png | Bin 0 -> 1092 bytes GRGE/GRGE/gears@2x.png | Bin 0 -> 2784 bytes GRGE/GRGETests/GRGETests.swift | 28 + GRGE/GRGETests/Info.plist | 22 + GRGE/GRGEUITests/GRGEUITests.swift | 28 + GRGE/GRGEUITests/Info.plist | 22 + 22 files changed, 1233 insertions(+) create mode 100644 GRGE/GRGE.xcodeproj/project.pbxproj create mode 100644 GRGE/GRGE.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 GRGE/GRGE/AppDelegate.swift create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png create mode 100644 GRGE/GRGE/Base.lproj/LaunchScreen.storyboard create mode 100644 GRGE/GRGE/Base.lproj/Main.storyboard create mode 100644 GRGE/GRGE/GRGE-Bridging-Header.h create mode 100644 GRGE/GRGE/Info.plist create mode 100644 GRGE/GRGE/MainViewController.swift create mode 100644 GRGE/GRGE/SettingsViewController.swift create mode 100644 GRGE/GRGE/gears.png create mode 100644 GRGE/GRGE/gears@2x.png create mode 100644 GRGE/GRGETests/GRGETests.swift create mode 100644 GRGE/GRGETests/Info.plist create mode 100644 GRGE/GRGEUITests/GRGEUITests.swift create mode 100644 GRGE/GRGEUITests/Info.plist diff --git a/.gitignore b/.gitignore index 2c22487..5964b45 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,5 @@ fastlane/report.xml fastlane/Preview.html fastlane/screenshots fastlane/test_output + +.DS_Store diff --git a/GRGE/GRGE.xcodeproj/project.pbxproj b/GRGE/GRGE.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c2d033a --- /dev/null +++ b/GRGE/GRGE.xcodeproj/project.pbxproj @@ -0,0 +1,566 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 7E92134A1DBBC25D0022AAA4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9213491DBBC25D0022AAA4 /* AppDelegate.swift */; }; + 7E92134C1DBBC25D0022AAA4 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E92134B1DBBC25D0022AAA4 /* MainViewController.swift */; }; + 7E92134F1DBBC25D0022AAA4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7E92134D1DBBC25D0022AAA4 /* Main.storyboard */; }; + 7E9213511DBBC25D0022AAA4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7E9213501DBBC25D0022AAA4 /* Assets.xcassets */; }; + 7E9213541DBBC25D0022AAA4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7E9213521DBBC25D0022AAA4 /* LaunchScreen.storyboard */; }; + 7E92135F1DBBC25D0022AAA4 /* GRGETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E92135E1DBBC25D0022AAA4 /* GRGETests.swift */; }; + 7E92136A1DBBC25D0022AAA4 /* GRGEUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9213691DBBC25D0022AAA4 /* GRGEUITests.swift */; }; + 7EC40A3F1DBBCE1D00CAA547 /* gears.png in Resources */ = {isa = PBXBuildFile; fileRef = 7EC40A3D1DBBCE1D00CAA547 /* gears.png */; }; + 7EC40A401DBBCE1D00CAA547 /* gears@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7EC40A3E1DBBCE1D00CAA547 /* gears@2x.png */; }; + 7EC40A4B1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC40A4A1DBBD18C00CAA547 /* SettingsViewController.swift */; }; + 7EC40A4C1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC40A4A1DBBD18C00CAA547 /* SettingsViewController.swift */; }; + 7EC40A4D1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC40A4A1DBBD18C00CAA547 /* SettingsViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7E92135B1DBBC25D0022AAA4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7E92133E1DBBC25C0022AAA4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7E9213451DBBC25C0022AAA4; + remoteInfo = GRGE; + }; + 7E9213661DBBC25D0022AAA4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7E92133E1DBBC25C0022AAA4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7E9213451DBBC25C0022AAA4; + remoteInfo = GRGE; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 7E8E0C481DBBEDBC004EE04E /* GRGE-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GRGE-Bridging-Header.h"; sourceTree = ""; }; + 7E9213461DBBC25D0022AAA4 /* GRGE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GRGE.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E9213491DBBC25D0022AAA4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7E92134B1DBBC25D0022AAA4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 7E92134E1DBBC25D0022AAA4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 7E9213501DBBC25D0022AAA4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7E9213531DBBC25D0022AAA4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7E9213551DBBC25D0022AAA4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7E92135A1DBBC25D0022AAA4 /* GRGETests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GRGETests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E92135E1DBBC25D0022AAA4 /* GRGETests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GRGETests.swift; sourceTree = ""; }; + 7E9213601DBBC25D0022AAA4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7E9213651DBBC25D0022AAA4 /* GRGEUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GRGEUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E9213691DBBC25D0022AAA4 /* GRGEUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GRGEUITests.swift; sourceTree = ""; }; + 7E92136B1DBBC25D0022AAA4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7EC40A3D1DBBCE1D00CAA547 /* gears.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gears.png; sourceTree = ""; }; + 7EC40A3E1DBBCE1D00CAA547 /* gears@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "gears@2x.png"; sourceTree = ""; }; + 7EC40A4A1DBBD18C00CAA547 /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7E9213431DBBC25C0022AAA4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213571DBBC25D0022AAA4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213621DBBC25D0022AAA4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7E92133D1DBBC25C0022AAA4 = { + isa = PBXGroup; + children = ( + 7E9213481DBBC25D0022AAA4 /* GRGE */, + 7E92135D1DBBC25D0022AAA4 /* GRGETests */, + 7E9213681DBBC25D0022AAA4 /* GRGEUITests */, + 7E9213471DBBC25D0022AAA4 /* Products */, + ); + sourceTree = ""; + }; + 7E9213471DBBC25D0022AAA4 /* Products */ = { + isa = PBXGroup; + children = ( + 7E9213461DBBC25D0022AAA4 /* GRGE.app */, + 7E92135A1DBBC25D0022AAA4 /* GRGETests.xctest */, + 7E9213651DBBC25D0022AAA4 /* GRGEUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 7E9213481DBBC25D0022AAA4 /* GRGE */ = { + isa = PBXGroup; + children = ( + 7E9213491DBBC25D0022AAA4 /* AppDelegate.swift */, + 7E92134B1DBBC25D0022AAA4 /* MainViewController.swift */, + 7EC40A4A1DBBD18C00CAA547 /* SettingsViewController.swift */, + 7E92134D1DBBC25D0022AAA4 /* Main.storyboard */, + 7E9213501DBBC25D0022AAA4 /* Assets.xcassets */, + 7E9213521DBBC25D0022AAA4 /* LaunchScreen.storyboard */, + 7E9213551DBBC25D0022AAA4 /* Info.plist */, + 7EC40A451DBBCEA400CAA547 /* Images */, + 7E8E0C481DBBEDBC004EE04E /* GRGE-Bridging-Header.h */, + ); + path = GRGE; + sourceTree = ""; + }; + 7E92135D1DBBC25D0022AAA4 /* GRGETests */ = { + isa = PBXGroup; + children = ( + 7E92135E1DBBC25D0022AAA4 /* GRGETests.swift */, + 7E9213601DBBC25D0022AAA4 /* Info.plist */, + ); + path = GRGETests; + sourceTree = ""; + }; + 7E9213681DBBC25D0022AAA4 /* GRGEUITests */ = { + isa = PBXGroup; + children = ( + 7E9213691DBBC25D0022AAA4 /* GRGEUITests.swift */, + 7E92136B1DBBC25D0022AAA4 /* Info.plist */, + ); + path = GRGEUITests; + sourceTree = ""; + }; + 7EC40A451DBBCEA400CAA547 /* Images */ = { + isa = PBXGroup; + children = ( + 7EC40A3D1DBBCE1D00CAA547 /* gears.png */, + 7EC40A3E1DBBCE1D00CAA547 /* gears@2x.png */, + ); + name = Images; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7E9213451DBBC25C0022AAA4 /* GRGE */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E92136E1DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGE" */; + buildPhases = ( + 7E9213421DBBC25C0022AAA4 /* Sources */, + 7E9213431DBBC25C0022AAA4 /* Frameworks */, + 7E9213441DBBC25C0022AAA4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GRGE; + productName = GRGE; + productReference = 7E9213461DBBC25D0022AAA4 /* GRGE.app */; + productType = "com.apple.product-type.application"; + }; + 7E9213591DBBC25D0022AAA4 /* GRGETests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E9213711DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGETests" */; + buildPhases = ( + 7E9213561DBBC25D0022AAA4 /* Sources */, + 7E9213571DBBC25D0022AAA4 /* Frameworks */, + 7E9213581DBBC25D0022AAA4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7E92135C1DBBC25D0022AAA4 /* PBXTargetDependency */, + ); + name = GRGETests; + productName = GRGETests; + productReference = 7E92135A1DBBC25D0022AAA4 /* GRGETests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 7E9213641DBBC25D0022AAA4 /* GRGEUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7E9213741DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGEUITests" */; + buildPhases = ( + 7E9213611DBBC25D0022AAA4 /* Sources */, + 7E9213621DBBC25D0022AAA4 /* Frameworks */, + 7E9213631DBBC25D0022AAA4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7E9213671DBBC25D0022AAA4 /* PBXTargetDependency */, + ); + name = GRGEUITests; + productName = GRGEUITests; + productReference = 7E9213651DBBC25D0022AAA4 /* GRGEUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7E92133E1DBBC25C0022AAA4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 0810; + ORGANIZATIONNAME = "Andrew Bonventre"; + TargetAttributes = { + 7E9213451DBBC25C0022AAA4 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = USS93J4HN5; + ProvisioningStyle = Automatic; + }; + 7E9213591DBBC25D0022AAA4 = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + TestTargetID = 7E9213451DBBC25C0022AAA4; + }; + 7E9213641DBBC25D0022AAA4 = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + TestTargetID = 7E9213451DBBC25C0022AAA4; + }; + }; + }; + buildConfigurationList = 7E9213411DBBC25C0022AAA4 /* Build configuration list for PBXProject "GRGE" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7E92133D1DBBC25C0022AAA4; + productRefGroup = 7E9213471DBBC25D0022AAA4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7E9213451DBBC25C0022AAA4 /* GRGE */, + 7E9213591DBBC25D0022AAA4 /* GRGETests */, + 7E9213641DBBC25D0022AAA4 /* GRGEUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7E9213441DBBC25C0022AAA4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E9213541DBBC25D0022AAA4 /* LaunchScreen.storyboard in Resources */, + 7E9213511DBBC25D0022AAA4 /* Assets.xcassets in Resources */, + 7E92134F1DBBC25D0022AAA4 /* Main.storyboard in Resources */, + 7EC40A3F1DBBCE1D00CAA547 /* gears.png in Resources */, + 7EC40A401DBBCE1D00CAA547 /* gears@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213581DBBC25D0022AAA4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213631DBBC25D0022AAA4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7E9213421DBBC25C0022AAA4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E92134C1DBBC25D0022AAA4 /* MainViewController.swift in Sources */, + 7E92134A1DBBC25D0022AAA4 /* AppDelegate.swift in Sources */, + 7EC40A4B1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213561DBBC25D0022AAA4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E92135F1DBBC25D0022AAA4 /* GRGETests.swift in Sources */, + 7EC40A4C1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E9213611DBBC25D0022AAA4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7E92136A1DBBC25D0022AAA4 /* GRGEUITests.swift in Sources */, + 7EC40A4D1DBBD18C00CAA547 /* SettingsViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7E92135C1DBBC25D0022AAA4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7E9213451DBBC25C0022AAA4 /* GRGE */; + targetProxy = 7E92135B1DBBC25D0022AAA4 /* PBXContainerItemProxy */; + }; + 7E9213671DBBC25D0022AAA4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7E9213451DBBC25C0022AAA4 /* GRGE */; + targetProxy = 7E9213661DBBC25D0022AAA4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 7E92134D1DBBC25D0022AAA4 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7E92134E1DBBC25D0022AAA4 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 7E9213521DBBC25D0022AAA4 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7E9213531DBBC25D0022AAA4 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7E92136C1DBBC25D0022AAA4 /* 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_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + 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_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.0; + 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"; + }; + name = Debug; + }; + 7E92136D1DBBC25D0022AAA4 /* 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_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + 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; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7E92136F1DBBC25D0022AAA4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = USS93J4HN5; + INFOPLIST_FILE = GRGE/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGE; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "GRGE/GRGE-Bridging-Header.h"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 7E9213701DBBC25D0022AAA4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = USS93J4HN5; + INFOPLIST_FILE = GRGE/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGE; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "GRGE/GRGE-Bridging-Header.h"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 7E9213721DBBC25D0022AAA4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = GRGETests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGETests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GRGE.app/GRGE"; + }; + name = Debug; + }; + 7E9213731DBBC25D0022AAA4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = GRGETests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGETests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GRGE.app/GRGE"; + }; + name = Release; + }; + 7E9213751DBBC25D0022AAA4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = GRGEUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGEUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_TARGET_NAME = GRGE; + }; + name = Debug; + }; + 7E9213761DBBC25D0022AAA4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = GRGEUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andybons.GRGEUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_TARGET_NAME = GRGE; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7E9213411DBBC25C0022AAA4 /* Build configuration list for PBXProject "GRGE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E92136C1DBBC25D0022AAA4 /* Debug */, + 7E92136D1DBBC25D0022AAA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E92136E1DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E92136F1DBBC25D0022AAA4 /* Debug */, + 7E9213701DBBC25D0022AAA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E9213711DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGETests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E9213721DBBC25D0022AAA4 /* Debug */, + 7E9213731DBBC25D0022AAA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7E9213741DBBC25D0022AAA4 /* Build configuration list for PBXNativeTarget "GRGEUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7E9213751DBBC25D0022AAA4 /* Debug */, + 7E9213761DBBC25D0022AAA4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7E92133E1DBBC25C0022AAA4 /* Project object */; +} diff --git a/GRGE/GRGE.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GRGE/GRGE.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f3fa2bc --- /dev/null +++ b/GRGE/GRGE.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/GRGE/GRGE/AppDelegate.swift b/GRGE/GRGE/AppDelegate.swift new file mode 100644 index 0000000..fa4f3b1 --- /dev/null +++ b/GRGE/GRGE/AppDelegate.swift @@ -0,0 +1,12 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + return true + } +} + diff --git a/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Contents.json b/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..eaf417c --- /dev/null +++ b/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-83.5@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..03c5111a2fd51f733cb2a37be70ac6af3c5d4b2c GIT binary patch literal 7941 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 literal 0 HcmV?d00001 diff --git a/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..7429f9611716ac55672e09c72589d2d29ba77756 GIT binary patch literal 3745 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 PhSR5DKi2*bd*lBAuYVMP literal 0 HcmV?d00001 diff --git a/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/GRGE/GRGE/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46edb0ca16ae5459f2abda26577521e5c96e906c GIT binary patch literal 14667 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 KZTRZ!)&Bz^|AD3e literal 0 HcmV?d00001 diff --git a/GRGE/GRGE/Base.lproj/LaunchScreen.storyboard b/GRGE/GRGE/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..93b8f80 --- /dev/null +++ b/GRGE/GRGE/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GRGE/GRGE/Base.lproj/Main.storyboard b/GRGE/GRGE/Base.lproj/Main.storyboard new file mode 100644 index 0000000..e8d94e3 --- /dev/null +++ b/GRGE/GRGE/Base.lproj/Main.storyboard @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GRGE/GRGE/GRGE-Bridging-Header.h b/GRGE/GRGE/GRGE-Bridging-Header.h new file mode 100644 index 0000000..4a4c07c --- /dev/null +++ b/GRGE/GRGE/GRGE-Bridging-Header.h @@ -0,0 +1,6 @@ +#ifndef GRGE_Bridging_Header_h +#define GRGE_Bridging_Header_h + +#import + +#endif /* GRGE_Bridging_Header_h */ diff --git a/GRGE/GRGE/Info.plist b/GRGE/GRGE/Info.plist new file mode 100644 index 0000000..d2aacb4 --- /dev/null +++ b/GRGE/GRGE/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarStyle + UIStatusBarStyleLightContent + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/GRGE/GRGE/MainViewController.swift b/GRGE/GRGE/MainViewController.swift new file mode 100644 index 0000000..14f7849 --- /dev/null +++ b/GRGE/GRGE/MainViewController.swift @@ -0,0 +1,153 @@ +import UIKit + +class MainViewController: UIViewController { + static private let instructionsText = "Press and hold in the area above" + static private let keepHoldingText = "Keep holding…" + static private let requestMadeText = "Sending request…" + static private let successText = "Hooray! Door triggered." + static private let errorText = "Uh oh. Something went wrong." + + @IBOutlet var settingsButton: UIButton? + @IBOutlet var mainButton: UIButton? + @IBOutlet var mainLabel: UILabel? + + private var touchTimer: Timer? + private var textTimer: Timer? + private var requestPending = false + private let isolationQueue = DispatchQueue(label: "com.andybons.GRGE.requestPendingQueue", + attributes: .concurrent) + + override func viewDidLoad() { + super.viewDidLoad() + + mainLabel!.text = MainViewController.instructionsText + + let settingsIconImage = UIImage(named: "gears")!.withRenderingMode(UIImageRenderingMode.alwaysTemplate) + settingsButton!.setImage(settingsIconImage, for: UIControlState.normal) + settingsButton!.tintColor = UIColor.white + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return .lightContent + } + + @IBAction func onTouchDown(button: UIButton) { + var reqPending: Bool! + isolationQueue.sync { + reqPending = requestPending + } + if textTimer != nil || reqPending { return } + + touchTimer = Timer(timeInterval: 3.0, + repeats: false, + block: {_ in + self.clearTouchTimer() + self.triggerDoor() + }) + RunLoop.current.add(touchTimer!, forMode: RunLoopMode.commonModes) + setMainLabelText(MainViewController.keepHoldingText) + } + + @IBAction func onTouchUp(button: UIButton) { + var reqPending: Bool! + isolationQueue.sync { + reqPending = requestPending + } + if textTimer != nil || reqPending { return } + + clearTouchTimer() + setMainLabelText(MainViewController.instructionsText) + } + + func setMainLabelText(_ text: String) { + UIView.transition(with: mainLabel!, + duration: 0.25, + options: UIViewAnimationOptions.transitionCrossDissolve, + animations: { self.mainLabel!.text = text }, + completion: nil) + } + + func setMainLabelText(_ text: String, forDuration: TimeInterval) { + clearTextTimer() + setMainLabelText(text) + textTimer = Timer(timeInterval: 3.0, + repeats: false, + block: {_ in + self.clearTextTimer() + self.setMainLabelText(MainViewController.instructionsText) + } + ) + RunLoop.main.add(textTimer!, forMode: RunLoopMode.commonModes) + } + + func clearTextTimer() { + if textTimer != nil { + textTimer!.invalidate() + textTimer = nil + } + } + + func clearTouchTimer() { + if touchTimer != nil { + touchTimer!.invalidate() + touchTimer = nil + } + } + + func triggerDoor() { + let defaults = UserDefaults.standard + let baseURL = defaults.string(forKey: UserSettingsKey.baseURL) + let sharedSecret = defaults.string(forKey: UserSettingsKey.sharedSecret) + if baseURL == nil || sharedSecret == nil { + print("Must set base URL and shared secret") + return + } + let timeSinceEpoch = String(Int(NSDate().timeIntervalSince1970)) + let key = hmacsha1(str: timeSinceEpoch, key: sharedSecret!) + let url = URL(string: "\(baseURL!)?t=\(timeSinceEpoch)&key=\(key)") + isolationQueue.async(flags: .barrier) { + self.requestPending = true + } + setMainLabelText(MainViewController.requestMadeText) + print("Making request to \(url!)") + let task = URLSession.shared.dataTask(with: url!, completionHandler: { + data, response, error in + + self.isolationQueue.async(flags: .barrier) { + self.requestPending = false + } + + if let errorStr = error?.localizedDescription { + print("error:", errorStr) + DispatchQueue.main.async { + self.setMainLabelText(MainViewController.errorText, forDuration: 5.0) + } + } else if let httpResponse = response as? HTTPURLResponse { + print("Status: \(httpResponse.statusCode)") + if httpResponse.statusCode == 200 { + DispatchQueue.main.async { + self.setMainLabelText(MainViewController.successText, forDuration: 5.0) + } + } else { + DispatchQueue.main.async { + self.setMainLabelText(MainViewController.errorText, forDuration: 5.0) + } + } + if data != nil { + let body = String(data:data!, encoding:String.Encoding.utf8) + print("Response body: \(body!)") + } + } + }) + task.resume() + } + + func hmacsha1(str: String, key: String) -> String { + let cData = str.cString(using: String.Encoding.utf8)! + let cKey = key.cString(using: String.Encoding.utf8)! + var result = [CUnsignedChar](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH)) + CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey, Int(strlen(cKey)), cData, Int(strlen(cData)), &result) + let hexBytes = result.map { String(format: "%02hhx", $0) } + return hexBytes.joined() + } +} diff --git a/GRGE/GRGE/SettingsViewController.swift b/GRGE/GRGE/SettingsViewController.swift new file mode 100644 index 0000000..78943f8 --- /dev/null +++ b/GRGE/GRGE/SettingsViewController.swift @@ -0,0 +1,37 @@ +import UIKit + +struct UserSettingsKey { + static let baseURL = "baseURL" + static let sharedSecret = "sharedSecret" +} + +class SettingsViewController: UIViewController { + @IBOutlet var baseURLTextField: UITextField? + @IBOutlet var sharedSecretTextField: UITextField? + + override func viewDidLoad() { + super.viewDidLoad() + + let fields: Array = [self.baseURLTextField!, self.sharedSecretTextField!]; + for textField in fields { + textField.layer.shadowOffset = CGSize(width: 0, height: 1.0) + textField.layer.shadowOpacity = 0.15; + textField.layer.shadowColor = UIColor.white.cgColor + textField.layer.shadowRadius = 1.0; + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + let defaults = UserDefaults.standard + self.baseURLTextField!.text = defaults.string(forKey: UserSettingsKey.baseURL) + self.sharedSecretTextField!.text = defaults.string(forKey: UserSettingsKey.sharedSecret) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + let defaults = UserDefaults.standard + defaults.set(self.baseURLTextField!.text, forKey: UserSettingsKey.baseURL) + defaults.set(self.sharedSecretTextField!.text, forKey: UserSettingsKey.sharedSecret) + } +} diff --git a/GRGE/GRGE/gears.png b/GRGE/GRGE/gears.png new file mode 100644 index 0000000000000000000000000000000000000000..e42b6cdca04395213f3cf4f3fc63aaff20e690ab GIT binary patch literal 1092 zcmV-K1iSl*P)Mdp}~O=Vf2nGi*RVs28$*CHKslZYlQ+_erus1~}YmC(u-3PDPu8zbBJ z7$0qvl%52c5kAt0&@o>v9PRfXzVGv^hH(<@!r^@9oc}$qd+wcaY;A2tgj#O5+Z7cR zH47#V@@;HvBo7P>tc2PV%H|AZlr1tcvJ^Jh+uQ4a4>_GqkMz4;zXdERDyk?fEPM!^ zk;96Lib#jUQB4;*C5t21NH1A9;k8e4ILiuXY-*%}X`FhIpDZpeP7x$&Wo6~5oEiME z^s);lJf_BQgIWRERD$!Co}QjNoYN`3z34oBeSH}tBO^cfju4kDz3jpXkK7EEKszo6 z8v`JzYK*jRFnA0Cz%m_&70b)Z`Pwf(BtK*7gK?c<9GR8}F&1T8eYNIMMf~9aZ+`1aY#l;s$xSPp6+0oJA4;sa$w628#9%plo>~cl|`2?9ne8!or zL0yu~V8YRfT-bOx!GyOe{O>OfncpOV2f9OguBfJ#_6_k?zEWoPr8cTE+T0>ML)T>N zzh=h;`?gnD&8EAwv>ARK@F=8*`m64lrdQKw49F4m;4t0w5(Tzpu z4Z&Wco4~Fg>q}=a&~M%K|!jV(q_F>@$g|<{gb0P zfL=rBgL~1Rx2DwY!2YebkqUB+7bMU8F}7pWM&vJ0Jgw{D{LhhSow#J_p*i8KGeoiL zMKV4%Pw-osqabudNj`$tz)MN`EpPTPnA1B}7-klFkF(T9@P!IS+i$>IB}*?m-*Nj{ zVJj70-IoeA`eYxk0im)N3WEGyT(U7Z@xtv%g_=^Tc}IX;cpPW;+?-O*^b-0d^h5Bo z)_)o@+V#?ynvCpfkkHB{FaW6V1fLeZg3Q z+d`BnA^Hc9A)_iEg+{0pj5vq!W9q_$>C_saV=Ld_@Avk7@7{awd&_O_JJu(8dcL0X ze4OVw&pGG4Ex&Z>Qdt@>dGh2|_>7J7DlaeJvt!4O@$tSZT`y0=!20_7kryvs{B4r* z6%`e?Z{NQCVA9x?=&MLW2*%Bo4~w;O=gytwqILVCG3)OKq+%e7-=*?|3xcL$^sNwXV6j`9Dd@#lrIlG&kV6U{h<K| z^dV=@o}JIM=3TpX{Vs{7l)i!C%sO)zGfbB-XC_#iJD2tra5*v#A!8kN z7p#NDtxGFhD`A)g=u}UK#{Eg-Hf-2%f%?nfY&>!srH0PLmh~*e_c-VNMmrHggP&sX zsVP&Yd;-P43IBU(Zv~gLFXbCRLqo&76DLmG%A8O2>(_5GovG}{JP*1zE?l_q8UhTx zk#QvgP53io#*9HtO-;w6c2CMebJ-T3W&vJ-*BJ~PzHQsKH+#aj5N%$P2^p_pf}yCl z@}RfI$*9m=jQcLb>a!*-gqL$Xgk9vIvb?gDEr;JxF*C zg!jL}DhwTwdlZD8^Dw@e@lBnboeNr9TTdqGQ(Id*pt`zxEo0tS-@=Gdxt{b0!N^w` zKLcJv=I)?O1@b(I@+0BA3cL#C_vRW$UwIgofpI9)P{=qnbd0dO+l8QcwR7d+SOlSr zJ+wWVR)so5!zGnLl93^Tee$@uEy&ZWiFU4h1K18 zu8ZW|ztX~YwLLiSo_9yOYRC#?hO&>)t1e5`4INu@>5Faa!Lbs{*f2uS0qWg(#iKy_ zmn?e-TcBSKj>(-D$~0;1M~`n1DWm9{OMNkYU&y5|ww*Z#F>FbZlRhrp;K76QQvT)U zJBLfPWC4#t^l@YHo(A?BDtbM$7Zcmt+dmLaJKKxty_%BoAR)1$$Phh>q??Z&J9ZQ0 zp`J+X-@pHjc*iMkbTQrN)Gco6? zc9Mhpjw^XpOEl0`Aw9d|-c)|fYRZ)qCKSE$ zAgJfOht9^h-PE%HS-wb=@dD0m%o;4QQP4m_D$VE8evF%+>p69QKc7o}+7q@WJ(nC% zVZ1vQ&rPH0-gyo5jC&jOBJcxnDl}t~jAJbNgt65+TQ!ntGZjemU@;$_Qjs1qAw+MZ zdJsIF<_9O)C*EXutUk<`A7!_&CtjBDy@XJP_tff8c534C3=BWdFGPY@j^#;`+&4-6 z#q@PES6Rwj80t_AyUWt#8AxXQGPCsFAK5#0M|DV4lE$Yb;lGF}TzKL|dL;0Nftg#_>&+Oxpmu0<)h;(Hj|N|-&J zd*IVwjv)_0b0=e;r_7yeST5H%vi7sozY2C@-~=udzoDK17U%hm^mtG_?KyDcB;(-68a}_i%Qm+Hw0LK}wl^N>ND*lqY z6aj{*FO48%5n`G3%dcaFz&*#Dz;l#yLa#qsh(0vVh0ark&c8ciyu zBus<%9ZD@m$R*Lbb18$dV)&R)pfgE)2wYUmoE#eG_(nY(@+wQkgM`9CjQSOf$HxU? z+&;W;Al}zqorN06oXvRPA@I65ZCzd62*w{{e3Jc)H{+#cyLa#Qi+BXrT9JpmsJ@-b z9*nq`Qs$m>D1T$L=QNH)=R&D;96IpSsK`k7B!-y}B4|q`L?dpclz1dM#7+OpBID$# z=P2~*@4HMRxD-l7xsPzcG{?8~)yu2JK_HI6$L z(OEKoDMfA6*JnJ40nxY5FQVLICX7f)vnBNojG1Ow()N?$H2cD_fYgfu75A$=guatx zd=;RqH<*=bM)G*XQZP%JEvfztJSjrAIi5l3^FJH)o?cxkFQQ;fp9)cw>fqw+ZA37E zWFR~WW@kE*D{tCOG|a*HN3Hjn5LFqnsxN?g&>((-zI?t}>wZs7at5@`QNe{|XQn%6EbY5UAMs4@aZ z-9oVo90L0J@xx#M81e}3$tP{_1>j)}f1+z7_^amv<0vPx|NdZap9)bG3Kg43RZnW% zVGMbi(!Dj#Qi$r|Sad;mPR6)^j#aVjbKs-({Q2|sgly5DEDTF-I`O+`-wV+~D^2Kn mPS)g%`{^XQ!{!WiHUAGM9JJBTASk;40000 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/GRGE/GRGEUITests/GRGEUITests.swift b/GRGE/GRGEUITests/GRGEUITests.swift new file mode 100644 index 0000000..24d883c --- /dev/null +++ b/GRGE/GRGEUITests/GRGEUITests.swift @@ -0,0 +1,28 @@ +import XCTest + +class GRGEUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/GRGE/GRGEUITests/Info.plist b/GRGE/GRGEUITests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/GRGE/GRGEUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + +