diff --git a/.swift-version b/.swift-version new file mode 100644 index 00000000..bf77d549 --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +4.2 diff --git a/PasscodeLock.podspec b/PasscodeLock.podspec deleted file mode 100755 index f27b3db6..00000000 --- a/PasscodeLock.podspec +++ /dev/null @@ -1,21 +0,0 @@ -Pod::Spec.new do |s| -s.name = 'PasscodeLock' -s.version = '1.0.1' -s.license = { :type => "MIT", :file => 'LICENSE.txt' } -s.summary = 'An iOS passcode lock with Touch ID authentication written in Swift.' -s.homepage = 'https://github.com/yankodimitrov/SwiftPasscodeLock' -s.authors = { 'Yanko Dimitrov' => '' } -s.source = { :git => 'https://github.com/yankodimitrov/SwiftPasscodeLock.git' } - -s.ios.deployment_target = '8.0' - -s.source_files = 'PasscodeLock/*.{h,swift}', - 'PasscodeLock/*/*.{swift}' - -s.resources = [ - 'PasscodeLock/Views/PasscodeLockView.xib', - 'PasscodeLock/en.lproj/*' - ] - -s.requires_arc = true -end \ No newline at end of file diff --git a/PasscodeLock.xcodeproj/project.pbxproj b/PasscodeLock.xcodeproj/project.pbxproj index 9fda09be..cbbe2a09 100644 --- a/PasscodeLock.xcodeproj/project.pbxproj +++ b/PasscodeLock.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 281AA9201DB626E000908E23 /* Localize.strings in Resources */ = {isa = PBXBuildFile; fileRef = 281AA9221DB626E000908E23 /* Localize.strings */; }; + 4A57CCF92010A437006A7B80 /* Localize.strings in Resources */ = {isa = PBXBuildFile; fileRef = 281AA9221DB626E000908E23 /* Localize.strings */; }; + 8F3B9D031E028815008CF18F /* PasscodeLockImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8F3B9D021E028815008CF18F /* PasscodeLockImages.xcassets */; }; C99EAF431B90B05700D61E1B /* PasscodeLock.h in Headers */ = {isa = PBXBuildFile; fileRef = C99EAF421B90B05700D61E1B /* PasscodeLock.h */; settings = {ATTRIBUTES = (Public, ); }; }; C99EAF4A1B90B05800D61E1B /* PasscodeLock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C99EAF3F1B90B05700D61E1B /* PasscodeLock.framework */; }; C9D3DF0B1B919CE4008561EB /* PasscodeLockView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9D3DF0A1B919CE4008561EB /* PasscodeLockView.xib */; }; @@ -22,15 +24,10 @@ C9D3DF461B91BD0E008561EB /* PasscodeLockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D3DF451B91BD0E008561EB /* PasscodeLockConfiguration.swift */; }; C9D3DF481B91F099008561EB /* PasscodeLockPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D3DF471B91F099008561EB /* PasscodeLockPresenter.swift */; }; C9DC07D51B90B1F6007A4DD0 /* PasscodeRepositoryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07D41B90B1F6007A4DD0 /* PasscodeRepositoryType.swift */; }; - C9DC07D61B90B1F6007A4DD0 /* PasscodeRepositoryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07D41B90B1F6007A4DD0 /* PasscodeRepositoryType.swift */; }; C9DC07D81B90B261007A4DD0 /* PasscodeLockStateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07D71B90B261007A4DD0 /* PasscodeLockStateType.swift */; }; - C9DC07D91B90B261007A4DD0 /* PasscodeLockStateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07D71B90B261007A4DD0 /* PasscodeLockStateType.swift */; }; C9DC07DB1B90B730007A4DD0 /* PasscodeLockConfigurationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07DA1B90B730007A4DD0 /* PasscodeLockConfigurationType.swift */; }; - C9DC07DC1B90B730007A4DD0 /* PasscodeLockConfigurationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07DA1B90B730007A4DD0 /* PasscodeLockConfigurationType.swift */; }; C9DC07DE1B90BA06007A4DD0 /* PasscodeLockType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07DD1B90BA06007A4DD0 /* PasscodeLockType.swift */; }; - C9DC07DF1B90BA06007A4DD0 /* PasscodeLockType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07DD1B90BA06007A4DD0 /* PasscodeLockType.swift */; }; C9DC07E11B90BBFD007A4DD0 /* PasscodeLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07E01B90BBFD007A4DD0 /* PasscodeLock.swift */; }; - C9DC07E21B90BBFD007A4DD0 /* PasscodeLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07E01B90BBFD007A4DD0 /* PasscodeLock.swift */; }; C9DC07E51B90BCF9007A4DD0 /* PasscodeLockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07E41B90BCF9007A4DD0 /* PasscodeLockTests.swift */; }; C9DC07E71B90C382007A4DD0 /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9DC07E61B90C382007A4DD0 /* LocalAuthentication.framework */; }; C9DC07EA1B90C690007A4DD0 /* FakePasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07E91B90C690007A4DD0 /* FakePasscodeState.swift */; }; @@ -38,15 +35,10 @@ C9DC07EE1B90C7CD007A4DD0 /* FakePasscodeLockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07ED1B90C7CD007A4DD0 /* FakePasscodeLockConfiguration.swift */; }; C9DC07F01B90C8E1007A4DD0 /* FakePasscodeLockDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07EF1B90C8E1007A4DD0 /* FakePasscodeLockDelegate.swift */; }; C9DC07F21B90C9DE007A4DD0 /* EnterPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07F11B90C9DE007A4DD0 /* EnterPasscodeState.swift */; }; - C9DC07F31B90C9DE007A4DD0 /* EnterPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07F11B90C9DE007A4DD0 /* EnterPasscodeState.swift */; }; C9DC07F81B90CF29007A4DD0 /* Functions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07F71B90CF29007A4DD0 /* Functions.swift */; }; - C9DC07F91B90CF29007A4DD0 /* Functions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07F71B90CF29007A4DD0 /* Functions.swift */; }; C9DC07FF1B90D24A007A4DD0 /* SetPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07FE1B90D24A007A4DD0 /* SetPasscodeState.swift */; }; - C9DC08001B90D24A007A4DD0 /* SetPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC07FE1B90D24A007A4DD0 /* SetPasscodeState.swift */; }; C9DC08021B90D2BA007A4DD0 /* ConfirmPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08011B90D2BA007A4DD0 /* ConfirmPasscodeState.swift */; }; - C9DC08031B90D2BA007A4DD0 /* ConfirmPasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08011B90D2BA007A4DD0 /* ConfirmPasscodeState.swift */; }; C9DC08051B90D394007A4DD0 /* ChangePasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08041B90D394007A4DD0 /* ChangePasscodeState.swift */; }; - C9DC08061B90D394007A4DD0 /* ChangePasscodeState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08041B90D394007A4DD0 /* ChangePasscodeState.swift */; }; C9DC08081B90DAE6007A4DD0 /* EnterPasscodeStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08071B90DAE6007A4DD0 /* EnterPasscodeStateTests.swift */; }; C9DC080A1B90DB09007A4DD0 /* FakePasscodeLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC08091B90DB09007A4DD0 /* FakePasscodeLock.swift */; }; C9DC080C1B90DC38007A4DD0 /* SetPasscodeStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC080B1B90DC38007A4DD0 /* SetPasscodeStateTests.swift */; }; @@ -107,6 +99,7 @@ 285BBDA71DB62D9100F33CBA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; }; 285BBDA81DB62D9100F33CBA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; 285BBDA91DB62D9100F33CBA /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localize.strings; sourceTree = ""; }; + 8F3B9D021E028815008CF18F /* PasscodeLockImages.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = PasscodeLockImages.xcassets; sourceTree = ""; }; C99EAF3F1B90B05700D61E1B /* PasscodeLock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PasscodeLock.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C99EAF421B90B05700D61E1B /* PasscodeLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PasscodeLock.h; sourceTree = ""; }; C99EAF441B90B05700D61E1B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -233,6 +226,7 @@ 281AA9221DB626E000908E23 /* Localize.strings */, C9DC08151B90DF4E007A4DD0 /* PasscodeLockViewController.swift */, C9D3DF471B91F099008561EB /* PasscodeLockPresenter.swift */, + 8F3B9D021E028815008CF18F /* PasscodeLockImages.xcassets */, ); path = PasscodeLock; sourceTree = ""; @@ -448,19 +442,22 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = "Yanko Dimitrov"; TargetAttributes = { C99EAF3E1B90B05700D61E1B = { CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1010; }; C99EAF481B90B05700D61E1B = { CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 1010; }; C9D3DF0F1B91AD11008561EB = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = JZ2H644EU7; LastSwiftMigration = 0800; + ProvisioningStyle = Manual; }; C9D3DF221B91AD11008561EB = { CreatedOnToolsVersion = 7.0; @@ -501,6 +498,7 @@ buildActionMask = 2147483647; files = ( C9D3DF0B1B919CE4008561EB /* PasscodeLockView.xib in Resources */, + 8F3B9D031E028815008CF18F /* PasscodeLockImages.xcassets in Resources */, 281AA9201DB626E000908E23 /* Localize.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -519,6 +517,7 @@ C9D3DF1D1B91AD11008561EB /* LaunchScreen.storyboard in Resources */, C9D3DF1A1B91AD11008561EB /* Assets.xcassets in Resources */, C9D3DF181B91AD11008561EB /* Main.storyboard in Resources */, + 4A57CCF92010A437006A7B80 /* Localize.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -565,24 +564,14 @@ buildActionMask = 2147483647; files = ( C9DC07EC1B90C72A007A4DD0 /* FakePasscodeRepository.swift in Sources */, - C9DC08061B90D394007A4DD0 /* ChangePasscodeState.swift in Sources */, C9DC080E1B90DC8F007A4DD0 /* ConfirmPasscodeStateTests.swift in Sources */, C9DC07E51B90BCF9007A4DD0 /* PasscodeLockTests.swift in Sources */, - C9DC08031B90D2BA007A4DD0 /* ConfirmPasscodeState.swift in Sources */, C9DC07F01B90C8E1007A4DD0 /* FakePasscodeLockDelegate.swift in Sources */, - C9DC07D91B90B261007A4DD0 /* PasscodeLockStateType.swift in Sources */, - C9DC07E21B90BBFD007A4DD0 /* PasscodeLock.swift in Sources */, C9DC07EA1B90C690007A4DD0 /* FakePasscodeState.swift in Sources */, C9DC08101B90DD91007A4DD0 /* ChangePasscodeStateTests.swift in Sources */, - C9DC07DC1B90B730007A4DD0 /* PasscodeLockConfigurationType.swift in Sources */, - C9DC07F31B90C9DE007A4DD0 /* EnterPasscodeState.swift in Sources */, - C9DC08001B90D24A007A4DD0 /* SetPasscodeState.swift in Sources */, C9DC07EE1B90C7CD007A4DD0 /* FakePasscodeLockConfiguration.swift in Sources */, C9DC080C1B90DC38007A4DD0 /* SetPasscodeStateTests.swift in Sources */, C9DC08081B90DAE6007A4DD0 /* EnterPasscodeStateTests.swift in Sources */, - C9DC07DF1B90BA06007A4DD0 /* PasscodeLockType.swift in Sources */, - C9DC07D61B90B1F6007A4DD0 /* PasscodeRepositoryType.swift in Sources */, - C9DC07F91B90CF29007A4DD0 /* Functions.swift in Sources */, C9DC080A1B90DB09007A4DD0 /* FakePasscodeLock.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -677,14 +666,22 @@ 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; @@ -713,6 +710,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -728,14 +726,22 @@ 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; @@ -757,6 +763,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -780,7 +787,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; }; name = Debug; }; @@ -799,7 +806,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLock; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; }; name = Release; }; @@ -813,6 +820,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "PasscodeLockTests/PasscodeLockTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; }; name = Debug; }; @@ -825,6 +833,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "PasscodeLockTests/PasscodeLockTests-Bridging-Header.h"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; }; name = Release; }; @@ -833,12 +842,15 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEVELOPMENT_TEAM = JZ2H644EU7; INFOPLIST_FILE = PasscodeLockDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 2.3; + PROVISIONING_PROFILE = "c4ef3957-2c3b-4abf-b8dd-d5d2c5712664"; + PROVISIONING_PROFILE_SPECIFIER = "XC Ad Hoc: *"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -848,12 +860,12 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = PasscodeLockDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 2.3; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/PasscodeLock.xcodeproj/xcshareddata/xcschemes/PasscodeLock.xcscheme b/PasscodeLock.xcodeproj/xcshareddata/xcschemes/PasscodeLock.xcscheme index 7c2a5166..df2732e9 100644 --- a/PasscodeLock.xcodeproj/xcshareddata/xcschemes/PasscodeLock.xcscheme +++ b/PasscodeLock.xcodeproj/xcshareddata/xcschemes/PasscodeLock.xcscheme @@ -1,6 +1,6 @@ String { +func localizedStringFor(_ key: String, comment: String) -> String { let name = "Localize" let bundle = bundleForResource(name, ofType: "strings") - - return NSLocalizedString(key, tableName: name, bundle: bundle, comment: comment) + + return NSLocalizedString(key, tableName: name, bundle: bundle, value: "", comment: comment) } -func bundleForResource(name: String, ofType type: String) -> NSBundle { +func bundleForResource(_ name: String, ofType type: String) -> Bundle { - if(NSBundle.mainBundle().pathForResource(name, ofType: type) != nil) { - return NSBundle.mainBundle() + if(Bundle.main.path(forResource: name, ofType: type) != nil) { + return Bundle.main } - return NSBundle(forClass: PasscodeLock.self) + return Bundle(for: PasscodeLock.self) +} + +func defaultCustomColor() -> UIColor { + return UIColor(red: 0, green: 100/255, blue: 165/255, alpha: 1) } diff --git a/PasscodeLock/PasscodeLock/ChangePasscodeState.swift b/PasscodeLock/PasscodeLock/ChangePasscodeState.swift index da097c7b..a0f35349 100644 --- a/PasscodeLock/PasscodeLock/ChangePasscodeState.swift +++ b/PasscodeLock/PasscodeLock/ChangePasscodeState.swift @@ -7,34 +7,38 @@ // import Foundation +import UIKit struct ChangePasscodeState: PasscodeLockStateType { - let title: String - let description: String + let title : String + let description : String let isCancellableAction = true - var isTouchIDAllowed = false - - init(stringsToShow: StringsToBeDisplayed?) { - - title = (stringsToShow?.passcodeLockChangeTitle ?? localizedStringFor("PasscodeLockChangeTitle", comment: "Change passcode title")) - description = (stringsToShow?.passcodeLockChangeDescription ?? localizedStringFor("PasscodeLockChangeDescription", comment: "Change passcode description")) + var isTouchIDAllowed = false + var tintColor : UIColor? + var font : UIFont? + + init(stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { + + + let defaultColor = defaultCustomColor() + self.title = (stringsToShow?.passcodeLockChangeTitle ?? localizedStringFor("PasscodeLockChangeTitle", comment: "Change passcode title")) + self.description = (stringsToShow?.passcodeLockChangeDescription ?? localizedStringFor("PasscodeLockChangeDescription", comment: "Change passcode description")) + self.tintColor = (tintColor ?? defaultColor) + self.font = (font ?? UIFont.systemFont(ofSize: 16)) } - func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?) { + func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { guard let currentPasscode = lock.repository.passcode else { return } - if passcode == currentPasscode { - - let nextState = SetPasscodeState(stringsToShow: stringsToShow) - + if (passcode == currentPasscode) { + let nextState = SetPasscodeState(stringsToShow: stringsToShow, tintColor: tintColor, font: font) lock.changeStateTo(nextState) } else { - lock.delegate?.passcodeLockDidFail(lock) } } diff --git a/PasscodeLock/PasscodeLock/ConfirmPasscodeState.swift b/PasscodeLock/PasscodeLock/ConfirmPasscodeState.swift index 22f94ad2..2c2c0a62 100644 --- a/PasscodeLock/PasscodeLock/ConfirmPasscodeState.swift +++ b/PasscodeLock/PasscodeLock/ConfirmPasscodeState.swift @@ -7,27 +7,32 @@ // import Foundation +import UIKit struct ConfirmPasscodeState: PasscodeLockStateType { - let title: String - let description: String + let title : String + let description : String let isCancellableAction = true - var isTouchIDAllowed = false + var isTouchIDAllowed = false + var tintColor : UIColor? + var font : UIFont? - private var passcodeToConfirm: [String] + fileprivate var passcodeToConfirm: [String] - init(passcode: [String], stringsToShow: StringsToBeDisplayed?) { - - passcodeToConfirm = passcode - title = (stringsToShow?.passcodeLockConfirmTitle ?? localizedStringFor("PasscodeLockConfirmTitle", comment: "Confirm passcode title")) - description = (stringsToShow?.passcodeLockConfirmDescription ?? localizedStringFor("PasscodeLockConfirmDescription", comment: "Confirm passcode description")) + init(passcode: [String], stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { + + let defaultColor = defaultCustomColor() + self.passcodeToConfirm = passcode + self.title = (stringsToShow?.passcodeLockConfirmTitle ?? localizedStringFor("PasscodeLockConfirmTitle", comment: "Confirm passcode title")) + self.description = (stringsToShow?.passcodeLockConfirmDescription ?? localizedStringFor("PasscodeLockConfirmDescription", comment: "Confirm passcode description")) + self.tintColor = (tintColor ?? defaultColor) + self.font = (font ?? UIFont.systemFont(ofSize: 16)) } - func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?) { + func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { - if passcode == passcodeToConfirm { - + if (passcode == passcodeToConfirm) { lock.repository.savePasscode(passcode) lock.delegate?.passcodeLockDidSucceed(lock) @@ -35,9 +40,7 @@ struct ConfirmPasscodeState: PasscodeLockStateType { let mismatchTitle = (stringsToShow?.passcodeLockMismatchTitle ?? localizedStringFor("PasscodeLockMismatchTitle", comment: "Passcode mismatch title")) let mismatchDescription = (stringsToShow?.passcodeLockMismatchDescription ?? localizedStringFor("PasscodeLockMismatchDescription", comment: "Passcode mismatch description")) - - let nextState = SetPasscodeState(title: mismatchTitle, description: mismatchDescription) - + let nextState = SetPasscodeState(title: mismatchTitle, description: mismatchDescription, tintColor: tintColor, font: font) lock.changeStateTo(nextState) lock.delegate?.passcodeLockDidFail(lock) } diff --git a/PasscodeLock/PasscodeLock/EnterPasscodeState.swift b/PasscodeLock/PasscodeLock/EnterPasscodeState.swift index fc006f05..fcb3dde8 100644 --- a/PasscodeLock/PasscodeLock/EnterPasscodeState.swift +++ b/PasscodeLock/PasscodeLock/EnterPasscodeState.swift @@ -12,37 +12,38 @@ public let PasscodeLockIncorrectPasscodeNotification = "passcode.lock.incorrect. struct EnterPasscodeState: PasscodeLockStateType { - let title: String - let description: String - let isCancellableAction: Bool - var isTouchIDAllowed = true + let title : String + let description : String + let isCancellableAction : Bool + var isTouchIDAllowed = true + var tintColor : UIColor? + var font : UIFont? - private var inccorectPasscodeAttempts = 0 - private var isNotificationSent = false + fileprivate var inccorectPasscodeAttempts = 0 - init(allowCancellation: Bool = false, stringsToShow: StringsToBeDisplayed?) { + init(allowCancellation: Bool = false, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { - isCancellableAction = allowCancellation - title = (stringsToShow?.passcodeLockEnterTitle ?? localizedStringFor("PasscodeLockEnterTitle", comment: "Enter passcode title")) - description = (stringsToShow?.passcodeLockEnterDescription ?? localizedStringFor("PasscodeLockEnterDescription", comment: "Enter passcode description")) + let defaultColor = defaultCustomColor() + self.isCancellableAction = allowCancellation + self.title = (stringsToShow?.passcodeLockEnterTitle ?? localizedStringFor("PasscodeLockEnterTitle", comment: "Enter passcode title")) + self.description = (stringsToShow?.passcodeLockEnterDescription ?? localizedStringFor("PasscodeLockEnterDescription", comment: "Enter passcode description")) + self.tintColor = (tintColor ?? defaultColor) + self.font = (font ?? UIFont.systemFont(ofSize: 16)) } - mutating func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?) { + mutating func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { guard let currentPasscode = lock.repository.passcode else { return } - if passcode == currentPasscode { - + if (passcode == currentPasscode) { lock.delegate?.passcodeLockDidSucceed(lock) } else { inccorectPasscodeAttempts += 1 - - if inccorectPasscodeAttempts >= lock.configuration.maximumInccorectPasscodeAttempts { - + if (inccorectPasscodeAttempts >= lock.configuration.maximumInccorectPasscodeAttempts) { postNotification() } @@ -50,14 +51,9 @@ struct EnterPasscodeState: PasscodeLockStateType { } } - private mutating func postNotification() { - - guard !isNotificationSent else { return } - - let center = NSNotificationCenter.defaultCenter() - - center.postNotificationName(PasscodeLockIncorrectPasscodeNotification, object: nil) - - isNotificationSent = true + fileprivate mutating func postNotification() { + + let center = NotificationCenter.default + center.post(name: Notification.Name(rawValue: PasscodeLockIncorrectPasscodeNotification), object: nil) } } diff --git a/PasscodeLock/PasscodeLock/PasscodeLock.swift b/PasscodeLock/PasscodeLock/PasscodeLock.swift index f147932f..4fd99bea 100644 --- a/PasscodeLock/PasscodeLock/PasscodeLock.swift +++ b/PasscodeLock/PasscodeLock/PasscodeLock.swift @@ -9,29 +9,29 @@ import Foundation import LocalAuthentication -public class PasscodeLock: PasscodeLockType { +open class PasscodeLock: PasscodeLockType { - public weak var delegate: PasscodeLockTypeDelegate? + open weak var delegate: PasscodeLockTypeDelegate? public let configuration: PasscodeLockConfigurationType - public var repository: PasscodeRepositoryType { + open var repository: PasscodeRepositoryType { return configuration.repository } - public var state: PasscodeLockStateType { + open var state: PasscodeLockStateType { return lockState } - public var isTouchIDAllowed: Bool { + open var isTouchIDAllowed: Bool { return isTouchIDEnabled() && configuration.isTouchIDAllowed && lockState.isTouchIDAllowed } - public var isPincodeEmpty: Bool { + open var isPincodeEmpty: Bool { return passcode.isEmpty } - private var lockState: PasscodeLockStateType - private lazy var passcode = [String]() + fileprivate var lockState: PasscodeLockStateType + fileprivate lazy var passcode = [String]() public init(state: PasscodeLockStateType, configuration: PasscodeLockConfigurationType) { @@ -41,19 +41,19 @@ public class PasscodeLock: PasscodeLockType { self.configuration = configuration } - public func addSign(sign: String) { + open func addSign(_ sign: String, stringsToBeDisplayed: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { passcode.append(sign) delegate?.passcodeLock(self, addedSignAtIndex: passcode.count - 1) - if passcode.count >= configuration.passcodeLength { - - lockState.acceptPasscode(passcode, fromLock: self, stringsToShow: nil) - passcode.removeAll(keepCapacity: true) + if (passcode.count >= configuration.passcodeLength) { + + self.lockState.acceptPasscode(self.passcode, fromLock: self, stringsToShow: stringsToBeDisplayed, tintColor: tintColor, font: font) + self.passcode.removeAll(keepingCapacity: true) } } - public func removeSign() { + open func removeSign() { guard passcode.count > 0 else { return } @@ -61,13 +61,13 @@ public class PasscodeLock: PasscodeLockType { delegate?.passcodeLock(self, removedSignAtIndex: passcode.count) } - public func changeStateTo(state: PasscodeLockStateType) { + open func changeStateTo(_ state: PasscodeLockStateType) { lockState = state delegate?.passcodeLockDidChangeState(self) } - public func authenticateWithBiometrics(stringsToShow: StringsToBeDisplayed?) { + open func authenticateWithBiometrics(_ stringsToShow: StringsToBeDisplayed?) { guard isTouchIDAllowed else { return } @@ -76,16 +76,16 @@ public class PasscodeLock: PasscodeLockType { context.localizedFallbackTitle = (stringsToShow?.passcodeLockTouchIDButton ?? localizedStringFor("PasscodeLockTouchIDButton", comment: "TouchID authentication fallback button")) - context.evaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { + context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { success, error in self.handleTouchIDResult(success) } } - private func handleTouchIDResult(success: Bool) { + fileprivate func handleTouchIDResult(_ success: Bool) { - dispatch_async(dispatch_get_main_queue()) { + DispatchQueue.main.async { if success { @@ -94,10 +94,10 @@ public class PasscodeLock: PasscodeLockType { } } - private func isTouchIDEnabled() -> Bool { + fileprivate func isTouchIDEnabled() -> Bool { let context = LAContext() - return context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil) + return context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) } } diff --git a/PasscodeLock/PasscodeLock/SetPasscodeState.swift b/PasscodeLock/PasscodeLock/SetPasscodeState.swift index 3c1be804..6024e947 100644 --- a/PasscodeLock/PasscodeLock/SetPasscodeState.swift +++ b/PasscodeLock/PasscodeLock/SetPasscodeState.swift @@ -7,30 +7,38 @@ // import Foundation +import UIKit struct SetPasscodeState: PasscodeLockStateType { - let title: String - let description: String + let title : String + let description : String let isCancellableAction = true - var isTouchIDAllowed = false + var isTouchIDAllowed = false + var tintColor : UIColor? + var font : UIFont? - init(title: String, description: String) { - + init(title: String, description: String, tintColor: UIColor?, font: UIFont?) { + + let defaultColor = defaultCustomColor() self.title = title self.description = description + self.tintColor = (tintColor ?? defaultColor) + self.font = (font ?? UIFont.systemFont(ofSize: 16)) } - init(stringsToShow: StringsToBeDisplayed?) { - - title = (stringsToShow?.passcodeLockSetTitle ?? localizedStringFor("PasscodeLockSetTitle", comment: "Set passcode title")) - description = (stringsToShow?.passcodeLockSetDescription ?? localizedStringFor("PasscodeLockSetDescription", comment: "Set passcode description")) + init(stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { + + let defaultColor = defaultCustomColor() + self.title = (stringsToShow?.passcodeLockSetTitle ?? localizedStringFor("PasscodeLockSetTitle", comment: "Set passcode title")) + self.description = (stringsToShow?.passcodeLockSetDescription ?? localizedStringFor("PasscodeLockSetDescription", comment: "Set passcode description")) + self.tintColor = (tintColor ?? defaultColor) + self.font = (font ?? UIFont.systemFont(ofSize: 16)) } - func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?) { + func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { - let nextState = ConfirmPasscodeState(passcode: passcode, stringsToShow: stringsToShow) - + let nextState = ConfirmPasscodeState(passcode: passcode, stringsToShow: stringsToShow, tintColor: tintColor, font: font) lock.changeStateTo(nextState) } } diff --git a/PasscodeLock/PasscodeLockImages.xcassets/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/Contents.json new file mode 100644 index 00000000..64fa2203 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_0.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_0@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_0@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0.png new file mode 100644 index 00000000..b1708199 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@2x.png new file mode 100644 index 00000000..250077f9 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@3x.png new file mode 100644 index 00000000..ba917dcc Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0.imageset/icon_num_0@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/Contents.json new file mode 100644 index 00000000..acacc4e8 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_0_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_0_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_0_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active.png new file mode 100644 index 00000000..f210cbcc Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@2x.png new file mode 100644 index 00000000..ef195b2d Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@3x.png new file mode 100644 index 00000000..6a37b1dd Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_0_active.imageset/icon_num_0_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/Contents.json new file mode 100644 index 00000000..6cbeb70b --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_1@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_1@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1.png new file mode 100644 index 00000000..1b78c999 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@2x.png new file mode 100644 index 00000000..c7e78beb Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@3x.png new file mode 100644 index 00000000..f6a7f285 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1.imageset/icon_num_1@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/Contents.json new file mode 100644 index 00000000..36f0d0d0 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_1_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_1_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_1_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active.png new file mode 100644 index 00000000..f6a2f713 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@2x.png new file mode 100644 index 00000000..f0942f48 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@3x.png new file mode 100644 index 00000000..2af23dbb Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_1_active.imageset/icon_num_1_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/Contents.json new file mode 100644 index 00000000..941ab6c1 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_2@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_2@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2.png new file mode 100644 index 00000000..3c66da6d Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@2x.png new file mode 100644 index 00000000..814ba15f Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@3x.png new file mode 100644 index 00000000..c6d7a62c Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2.imageset/icon_num_2@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/Contents.json new file mode 100644 index 00000000..2a9459b8 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_2_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_2_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_2_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active.png new file mode 100644 index 00000000..360257d4 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@2x.png new file mode 100644 index 00000000..ed08038a Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@3x.png new file mode 100644 index 00000000..dc7fe9b0 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_2_active.imageset/icon_num_2_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/Contents.json new file mode 100644 index 00000000..3411db58 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_3.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_3@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_3@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3.png new file mode 100644 index 00000000..b2edf786 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@2x.png new file mode 100644 index 00000000..5b537676 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@3x.png new file mode 100644 index 00000000..4cf86e10 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3.imageset/icon_num_3@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/Contents.json new file mode 100644 index 00000000..1447335b --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_3_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_3_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_3_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active.png new file mode 100644 index 00000000..d32d049f Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@2x.png new file mode 100644 index 00000000..52dc06c0 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@3x.png new file mode 100644 index 00000000..a28bf63d Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_3_active.imageset/icon_num_3_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/Contents.json new file mode 100644 index 00000000..57ba3ece --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_4.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_4@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_4@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4.png new file mode 100644 index 00000000..63234c15 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@2x.png new file mode 100644 index 00000000..e0a4d00c Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@3x.png new file mode 100644 index 00000000..404a5171 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4.imageset/icon_num_4@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/Contents.json new file mode 100644 index 00000000..275e3440 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_4_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_4_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_4_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active.png new file mode 100644 index 00000000..f12cab7f Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@2x.png new file mode 100644 index 00000000..9c671fe2 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@3x.png new file mode 100644 index 00000000..760594eb Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_4_active.imageset/icon_num_4_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/Contents.json new file mode 100644 index 00000000..9b98f13f --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_5.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_5@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_5@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5.png new file mode 100644 index 00000000..037f7250 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@2x.png new file mode 100644 index 00000000..60978467 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@3x.png new file mode 100644 index 00000000..872807b0 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5.imageset/icon_num_5@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/Contents.json new file mode 100644 index 00000000..87847f99 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_5_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_5_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_5_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active.png new file mode 100644 index 00000000..bfbcfa8d Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@2x.png new file mode 100644 index 00000000..3e8fa10f Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@3x.png new file mode 100644 index 00000000..e433034e Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_5_active.imageset/icon_num_5_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/Contents.json new file mode 100644 index 00000000..1bac4edd --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_6.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_6@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_6@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6.png new file mode 100644 index 00000000..b8012f2a Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@2x.png new file mode 100644 index 00000000..c889c972 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@3x.png new file mode 100644 index 00000000..5dac0b34 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6.imageset/icon_num_6@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/Contents.json new file mode 100644 index 00000000..307dbb50 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_6_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_6_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_6_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active.png new file mode 100644 index 00000000..dc79302f Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@2x.png new file mode 100644 index 00000000..f188b190 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@3x.png new file mode 100644 index 00000000..0cee9c27 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_6_active.imageset/icon_num_6_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/Contents.json new file mode 100644 index 00000000..05de8f1f --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_7.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_7@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_7@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7.png new file mode 100644 index 00000000..e561a3ac Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@2x.png new file mode 100644 index 00000000..a9b0391e Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@3x.png new file mode 100644 index 00000000..469f5673 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7.imageset/icon_num_7@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/Contents.json new file mode 100644 index 00000000..b4b77d33 --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_7_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_7_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_7_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active.png new file mode 100644 index 00000000..1f772020 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@2x.png new file mode 100644 index 00000000..76d30e8e Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@3x.png new file mode 100644 index 00000000..f97159d4 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_7_active.imageset/icon_num_7_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/Contents.json new file mode 100644 index 00000000..335d674f --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_8.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_8@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_8@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8.png new file mode 100644 index 00000000..508a4ca0 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@2x.png new file mode 100644 index 00000000..893df3ce Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@3x.png new file mode 100644 index 00000000..0b071c24 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8.imageset/icon_num_8@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/Contents.json new file mode 100644 index 00000000..b3346b2c --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_8_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_8_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_8_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active.png new file mode 100644 index 00000000..05814009 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@2x.png new file mode 100644 index 00000000..a76dd875 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@3x.png new file mode 100644 index 00000000..dbaabd8a Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_8_active.imageset/icon_num_8_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/Contents.json new file mode 100644 index 00000000..bcd28e1d --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_9.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_9@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_9@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9.png new file mode 100644 index 00000000..dd0c0ac0 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@2x.png new file mode 100644 index 00000000..0f1fbba7 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@3x.png new file mode 100644 index 00000000..e7dae29a Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9.imageset/icon_num_9@3x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/Contents.json b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/Contents.json new file mode 100644 index 00000000..4106fccf --- /dev/null +++ b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_num_9_active.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_9_active@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon_num_9_active@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active.png new file mode 100644 index 00000000..1c616208 Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@2x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@2x.png new file mode 100644 index 00000000..1a658a9e Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@2x.png differ diff --git a/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@3x.png b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@3x.png new file mode 100644 index 00000000..cab6eefd Binary files /dev/null and b/PasscodeLock/PasscodeLockImages.xcassets/icon_num_9_active.imageset/icon_num_9_active@3x.png differ diff --git a/PasscodeLock/PasscodeLockPresenter.swift b/PasscodeLock/PasscodeLockPresenter.swift index a4a65c33..bc18f6f0 100644 --- a/PasscodeLock/PasscodeLockPresenter.swift +++ b/PasscodeLock/PasscodeLockPresenter.swift @@ -27,8 +27,9 @@ public struct StringsToBeDisplayed { public var cancel: String? public var delete: String? public var useTouchID: String? + public var useFaceID: String? - public init(passcodeLockEnterTitle: String?, passcodeLockEnterDescription: String?, passcodeLockSetTitle: String?, passcodeLockSetDescription: String?, passcodeLockConfirmTitle: String?, passcodeLockConfirmDescription: String?, passcodeLockChangeTitle: String?, passcodeLockChangeDescription: String?, passcodeLockMismatchTitle: String?, passcodeLockMismatchDescription: String?, passcodeLockTouchIDReason: String?, passcodeLockTouchIDButton: String?, cancel: String?, delete: String?, useTouchID: String?) { + public init(passcodeLockEnterTitle: String?, passcodeLockEnterDescription: String?, passcodeLockSetTitle: String?, passcodeLockSetDescription: String?, passcodeLockConfirmTitle: String?, passcodeLockConfirmDescription: String?, passcodeLockChangeTitle: String?, passcodeLockChangeDescription: String?, passcodeLockMismatchTitle: String?, passcodeLockMismatchDescription: String?, passcodeLockTouchIDReason: String?, passcodeLockTouchIDButton: String?, cancel: String?, delete: String?, useTouchID: String?, useFaceID: String?) { self.passcodeLockEnterTitle = passcodeLockEnterTitle self.passcodeLockEnterDescription = passcodeLockEnterDescription @@ -45,57 +46,56 @@ public struct StringsToBeDisplayed { self.cancel = cancel self.delete = delete self.useTouchID = useTouchID + self.useFaceID = useFaceID } } -public class PasscodeLockPresenter { +open class PasscodeLockPresenter { - private var mainWindow: UIWindow? + fileprivate var mainWindow: UIWindow? - private lazy var passcodeLockWindow: UIWindow = { + open lazy var passcodeLockWindow: UIWindow = { - let window = UIWindow(frame: UIScreen.mainScreen().bounds) + let window = UIWindow(frame: UIScreen.main.bounds) - window.windowLevel = 0 + window.windowLevel = UIWindow.Level.normal window.makeKeyAndVisible() return window }() - private let passcodeConfiguration: PasscodeLockConfigurationType - public var isPasscodePresented = false + fileprivate let passcodeConfiguration: PasscodeLockConfigurationType + open var isPasscodePresented = false public let passcodeLockVC: PasscodeLockViewController - public var stringsToBeDisplayed: StringsToBeDisplayed? + open var stringsToBeDisplayed: StringsToBeDisplayed? public init(mainWindow window: UIWindow?, configuration: PasscodeLockConfigurationType, viewController: PasscodeLockViewController) { mainWindow = window - mainWindow?.windowLevel = 1 passcodeConfiguration = configuration passcodeLockVC = viewController } - public convenience init(mainWindow window: UIWindow?, configuration: PasscodeLockConfigurationType, stringsToShow: StringsToBeDisplayed?) { + public convenience init(mainWindow window: UIWindow?, configuration: PasscodeLockConfigurationType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { - let passcodeLockVC = PasscodeLockViewController(state: .EnterPasscode, configuration: configuration, stringsToShow: stringsToShow) + let passcodeLockVC = PasscodeLockViewController(state: .enterPasscode, configuration: configuration, stringsToShow: stringsToShow, tintColor: tintColor, font: font) self.init(mainWindow: window, configuration: configuration, viewController: passcodeLockVC) } - public func presentPasscodeLock(withImage image: UIImage? = nil, andStrings stringsToShow: StringsToBeDisplayed? = nil, dismissCompletionBlock: (() -> Void)? = nil) { + open func presentPasscodeLock(withImage image: UIImage? = nil, configuration config: PasscodeLockConfigurationType? = nil, andStrings stringsToShow: StringsToBeDisplayed? = nil, tintColor: UIColor?, font: UIFont?, dismissCompletionBlock: (() -> Void)? = nil) { guard passcodeConfiguration.repository.hasPasscode else { return } guard !isPasscodePresented else { return } isPasscodePresented = true - passcodeLockWindow.windowLevel = 2 - passcodeLockWindow.hidden = false + passcodeLockWindow.windowLevel = UIWindow.Level.statusBar + passcodeLockWindow.isHidden = false - mainWindow?.windowLevel = 1 mainWindow?.endEditing(true) - let passcodeLockVC = PasscodeLockViewController(state: .EnterPasscode, configuration: passcodeConfiguration, stringsToShow: stringsToShow) + let passcodeLockVC = PasscodeLockViewController(state: .enterPasscode, configuration: (config ?? passcodeConfiguration), stringsToShow: stringsToShow, tintColor: tintColor, font: font) if (image != nil) { passcodeLockVC.customImage = image } @@ -111,10 +111,9 @@ public class PasscodeLockPresenter { passcodeLockWindow.rootViewController = passcodeLockVC } - public func dismissPasscodeLock(animated animated: Bool = true) { + open func dismissPasscodeLock(animated: Bool = true) { isPasscodePresented = false - mainWindow?.windowLevel = 1 mainWindow?.makeKeyAndVisible() if animated { @@ -123,27 +122,29 @@ public class PasscodeLockPresenter { } else { - passcodeLockWindow.windowLevel = 0 + passcodeLockWindow.windowLevel = UIWindow.Level.normal passcodeLockWindow.rootViewController = nil + passcodeLockWindow.isHidden = true } } internal func animatePasscodeLockDismissal() { - UIView.animateWithDuration( - 0.5, + UIView.animate( + withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, - options: [.CurveEaseInOut], + options: UIView.AnimationOptions(), animations: { [weak self] in self?.passcodeLockWindow.alpha = 0 }, completion: { [weak self] _ in - self?.passcodeLockWindow.windowLevel = 0 + self?.passcodeLockWindow.windowLevel = UIWindow.Level.normal self?.passcodeLockWindow.rootViewController = nil + self?.passcodeLockWindow.isHidden = true self?.passcodeLockWindow.alpha = 1 } ) diff --git a/PasscodeLock/PasscodeLockViewController.swift b/PasscodeLock/PasscodeLockViewController.swift index f050af97..4befbb11 100644 --- a/PasscodeLock/PasscodeLockViewController.swift +++ b/PasscodeLock/PasscodeLockViewController.swift @@ -7,67 +7,73 @@ // import UIKit +import LocalAuthentication -public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDelegate { +open class PasscodeLockViewController: UIViewController, PasscodeLockTypeDelegate { public enum LockState { - case EnterPasscode - case SetPasscode - case ChangePasscode - case RemovePasscode + case enterPasscode + case setPasscode + case changePasscode + case removePasscode - func getState(stringsToShow: StringsToBeDisplayed?) -> PasscodeLockStateType { + func getState(_ stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) -> PasscodeLockStateType { switch self { - case .EnterPasscode: return EnterPasscodeState(stringsToShow: stringsToShow) - case .SetPasscode: return SetPasscodeState(stringsToShow: stringsToShow) - case .ChangePasscode: return ChangePasscodeState(stringsToShow: stringsToShow) - case .RemovePasscode: return EnterPasscodeState(allowCancellation: true, stringsToShow: stringsToShow) + case .enterPasscode: return EnterPasscodeState(stringsToShow: stringsToShow, tintColor: tintColor, font: font) + case .setPasscode: return SetPasscodeState(stringsToShow: stringsToShow, tintColor: tintColor, font: font) + case .changePasscode: return ChangePasscodeState(stringsToShow: stringsToShow, tintColor: tintColor, font: font) + case .removePasscode: return EnterPasscodeState(allowCancellation: true, stringsToShow: stringsToShow, tintColor: tintColor, font: font) } } } - @IBOutlet public weak var titleLabel : UILabel? - @IBOutlet public weak var customImageView : UIImageView? - @IBOutlet public weak var descriptionLabel : UILabel? - @IBOutlet public var placeholders : [PasscodeSignPlaceholderView] = [PasscodeSignPlaceholderView]() - @IBOutlet public weak var cancelDeleteButton : UIButton? - @IBOutlet public weak var touchIDButton : UIButton? - @IBOutlet public weak var placeholdersX : NSLayoutConstraint? - - public var successCallback : ((lock: PasscodeLockType) -> Void)? - public var customImage : UIImage? - public var dismissCompletionCallback : (()->Void)? - public var animateOnDismiss : Bool - public var notificationCenter : NSNotificationCenter? - public var stringsToShow : StringsToBeDisplayed? - public var closingView : Bool = false + @IBOutlet open var passcodeButtons : [PasscodeSignButton]? + @IBOutlet open weak var titleLabel : UILabel? + @IBOutlet open weak var customImageView : UIImageView? + @IBOutlet open weak var descriptionLabel : UILabel? + @IBOutlet open var placeholders : [PasscodeSignPlaceholderView] = [PasscodeSignPlaceholderView]() + @IBOutlet open weak var cancelDeleteButton : UIButton? + @IBOutlet open weak var touchIDButton : UIButton? + @IBOutlet open weak var placeholdersX : NSLayoutConstraint? + + open var successCallback : ((_ lock: PasscodeLockType) -> Void)? + open var customImage : UIImage? + open var dismissCompletionCallback : (()->Void)? + open var animateOnDismiss : Bool + open var notificationCenter : NotificationCenter? + open var stringsToShow : StringsToBeDisplayed? + open var closingView : Bool = false internal let passcodeConfiguration : PasscodeLockConfigurationType - internal let passcodeLock : PasscodeLockType + internal var passcodeLock : PasscodeLockType internal var isPlaceholdersAnimationCompleted = true - private var shouldTryToAuthenticateWithBiometrics = true + fileprivate var shouldTryToAuthenticateWithBiometrics = true + fileprivate var customTintColor : UIColor? + fileprivate var font : UIFont? // MARK: - Initializers - public init(state: PasscodeLockStateType, configuration: PasscodeLockConfigurationType, animateOnDismiss: Bool = true, stringToShow: StringsToBeDisplayed?) { + public init(state: PasscodeLockStateType, configuration: PasscodeLockConfigurationType, animateOnDismiss: Bool = true, stringToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { self.stringsToShow = stringToShow self.animateOnDismiss = animateOnDismiss + self.font = (font ?? UIFont.systemFont(ofSize: 16)) + self.customTintColor = (tintColor ?? UIColor(red: 0, green: 100/255, blue: 165/255, alpha: 1)) passcodeConfiguration = configuration passcodeLock = PasscodeLock(state: state, configuration: configuration) let nibName = "PasscodeLockView" - let bundle: NSBundle = bundleForResource(nibName, ofType: "nib") + let bundle: Bundle = bundleForResource(nibName, ofType: "nib") super.init(nibName: nibName, bundle: bundle) passcodeLock.delegate = self - notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter = NotificationCenter.default } - public convenience init(state: LockState, configuration: PasscodeLockConfigurationType, animateOnDismiss: Bool = true, stringsToShow: StringsToBeDisplayed?) { + public convenience init(state: LockState, configuration: PasscodeLockConfigurationType, animateOnDismiss: Bool = true, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { - self.init(state: state.getState(stringsToShow), configuration: configuration, animateOnDismiss: animateOnDismiss, stringToShow: stringsToShow) + self.init(state: state.getState(stringsToShow, tintColor: tintColor, font: font), configuration: configuration, animateOnDismiss: animateOnDismiss, stringToShow: stringsToShow, tintColor: tintColor, font: font) } public required init(coder aDecoder: NSCoder) { @@ -80,14 +86,25 @@ public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDeleg // MARK: - View - public override func viewDidLoad() { + open override func viewDidLoad() { super.viewDidLoad() - - updatePasscodeView() - setupEvents() + + self.configurePasscodeButtons() + self.updatePasscodeView() + self.setupEvents() } + + fileprivate func configurePasscodeButtons() { + + self.placeholders.forEach { (passcodePlaceHolder: PasscodeSignPlaceholderView) in + if let _customTintColor = self.customTintColor { + passcodePlaceHolder.activeColor = _customTintColor + } + passcodePlaceHolder.setupView() + } + } - public override func viewDidAppear(animated: Bool) { + open override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if shouldTryToAuthenticateWithBiometrics { @@ -95,57 +112,76 @@ public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDeleg } } - internal func updatePasscodeView() { + internal func updatePasscodeView() { + + self.customImageView?.image = self.customImage + self.titleLabel?.text = passcodeLock.state.title + self.titleLabel?.font = self.font + self.titleLabel?.textColor = self.customTintColor + self.descriptionLabel?.text = passcodeLock.state.description + self.touchIDButton?.isHidden = !passcodeLock.isTouchIDAllowed + + var useBiometrics: String = localizedStringFor("UseTouchId", comment: "") + var useBiomatricsToShow: String? = self.stringsToShow?.useTouchID + if #available(iOS 11.0, *) { + let context = LAContext() + context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) + let bioType = context.biometryType + if (bioType == .faceID) { + useBiometrics = localizedStringFor("UseFaceId", comment: "") + useBiomatricsToShow = self.stringsToShow?.useFaceID + } + } + + self.touchIDButton?.setTitle((useBiomatricsToShow ?? useBiometrics), for: UIControl.State()) + self.passcodeButtons?.forEach({ (passcodeButton: PasscodeSignButton) in + passcodeButton.tintColor = self.customTintColor + }) - customImageView?.image = self.customImage - titleLabel?.text = passcodeLock.state.title - descriptionLabel?.text = passcodeLock.state.description - touchIDButton?.hidden = !passcodeLock.isTouchIDAllowed - touchIDButton?.setTitle((self.stringsToShow?.useTouchID ?? localizedStringFor("UseTouchId", comment: "")), forState: .Normal) self.cancelDeleteButtonSetup() - } + } // MARK: - Events - private func setupEvents() { + fileprivate func setupEvents() { - notificationCenter?.addObserver(self, selector: #selector(self.appWillEnterForegroundHandler(_:)), name: UIApplicationWillEnterForegroundNotification, object: nil) - notificationCenter?.addObserver(self, selector: #selector(PasscodeLockViewController.appDidEnterBackgroundHandler(_:)), name: UIApplicationDidEnterBackgroundNotification, object: nil) + notificationCenter?.addObserver(self, selector: #selector(self.appWillEnterForegroundHandler), name: UIApplication.willEnterForegroundNotification, object: nil) + notificationCenter?.addObserver(self, selector: #selector(self.appDidEnterBackgroundHandler), name: UIApplication.didEnterBackgroundNotification, object: nil) } - private func clearEvents() { + fileprivate func clearEvents() { - notificationCenter?.removeObserver(self, name: UIApplicationWillEnterForegroundNotification, object: nil) - notificationCenter?.removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil) + notificationCenter?.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil) + notificationCenter?.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil) } - public func appWillEnterForegroundHandler(notification: NSNotification) { + @objc open func appWillEnterForegroundHandler(_ notification: Notification) { authenticateWithBiometrics() } - public func appDidEnterBackgroundHandler(notification: NSNotification) { + @objc open func appDidEnterBackgroundHandler(_ notification: Notification) { shouldTryToAuthenticateWithBiometrics = false } // MARK: - Actions - @IBAction func passcodeSignButtonTap(sender: PasscodeSignButton) { + @IBAction func passcodeSignButtonTap(_ sender: PasscodeSignButton) { guard isPlaceholdersAnimationCompleted else { return } - passcodeLock.addSign(sender.passcodeSign) + passcodeLock.addSign(sender.passcodeSign, stringsToBeDisplayed: self.stringsToShow, tintColor: customTintColor, font: font) } - @IBAction func cancelButtonTap(sender: UIButton) { + @IBAction func cancelButtonTap(_ sender: UIButton) { dismissPasscodeLock(passcodeLock) } - @IBAction func deleteSignButtonTap(sender: UIButton) { + @IBAction func deleteSignButtonTap(_ sender: UIButton) { if (passcodeLock.isPincodeEmpty == true && passcodeLock.state.isCancellableAction == true) { dismissPasscodeLock(passcodeLock) @@ -155,24 +191,24 @@ public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDeleg } } - @IBAction func touchIDButtonTap(sender: UIButton) { + @IBAction func touchIDButtonTap(_ sender: UIButton) { passcodeLock.authenticateWithBiometrics(self.stringsToShow) } - private func authenticateWithBiometrics() { + fileprivate func authenticateWithBiometrics() { if (passcodeConfiguration.shouldRequestTouchIDImmediately == true && passcodeLock.isTouchIDAllowed == true) { passcodeLock.authenticateWithBiometrics(self.stringsToShow) } } - internal func dismissPasscodeLock(lock: PasscodeLockType, completionHandler: (() -> Void)? = nil) { + internal func dismissPasscodeLock(_ lock: PasscodeLockType, completionHandler: (() -> Void)? = nil) { // if presented as modal if (presentingViewController?.presentedViewController == self) { - dismissViewControllerAnimated(animateOnDismiss, completion: { [weak self] _ in + dismiss(animated: animateOnDismiss, completion: { [weak self] in self?.dismissCompletionCallback?() completionHandler?() }) @@ -181,7 +217,7 @@ public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDeleg // if pushed in a navigation controller } else if navigationController != nil { - navigationController?.popViewControllerAnimated(animateOnDismiss) + navigationController?.popViewController(animated: animateOnDismiss) } dismissCompletionCallback?() @@ -195,85 +231,88 @@ public class PasscodeLockViewController: UIViewController, PasscodeLockTypeDeleg self.cancelDeleteButtonSetup() isPlaceholdersAnimationCompleted = false - animatePlaceholders(placeholders, toState: .Error) + animatePlaceholders(placeholders, toState: .error) placeholdersX?.constant = -40 view.layoutIfNeeded() - UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 0, options: [], animations: { + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 0, options: [], animations: { self.placeholdersX?.constant = 0 self.view.layoutIfNeeded() }, completion: { completed in self.isPlaceholdersAnimationCompleted = true - self.animatePlaceholders(self.placeholders, toState: .Inactive) + self.animatePlaceholders(self.placeholders, toState: .inactive) }) } - internal func animatePlaceholders(placeholders: [PasscodeSignPlaceholderView], toState state: PasscodeSignPlaceholderView.State) { + internal func animatePlaceholders(_ placeholders: [PasscodeSignPlaceholderView], toState state: PasscodeSignPlaceholderView.State) { for placeholder in placeholders { placeholder.animateState(state) } } - private func animatePlacehodlerAtIndex(index: Int, toState state: PasscodeSignPlaceholderView.State) { + fileprivate func animatePlacehodlerAtIndex(_ index: Int, toState state: PasscodeSignPlaceholderView.State) { guard (index < placeholders.count && index >= 0) else { return } - + placeholders[index].animateState(state) } // MARK: - PasscodeLockDelegate - public func passcodeLockDidSucceed(lock: PasscodeLockType) { + open func passcodeLockDidSucceed(_ lock: PasscodeLockType) { self.cancelDeleteButtonSetup() - animatePlaceholders(placeholders, toState: .Inactive) - dismissPasscodeLock(lock, completionHandler: { [weak self] _ in - self?.successCallback?(lock: lock) + animatePlaceholders(placeholders, toState: .inactive) + dismissPasscodeLock(lock, completionHandler: { [weak self] in + self?.successCallback?(lock) }) } - public func passcodeLockDidFail(lock: PasscodeLockType) { + open func passcodeLockDidFail(_ lock: PasscodeLockType) { animateWrongPassword() } - public func passcodeLockDidChangeState(lock: PasscodeLockType) { + open func passcodeLockDidChangeState(_ lock: PasscodeLockType) { updatePasscodeView() - animatePlaceholders(placeholders, toState: .Inactive) + animatePlaceholders(placeholders, toState: .inactive) self.cancelDeleteButtonSetup() } - public func passcodeLock(lock: PasscodeLockType, addedSignAtIndex index: Int) { + open func passcodeLock(_ lock: PasscodeLockType, addedSignAtIndex index: Int) { - animatePlacehodlerAtIndex(index, toState: .Active) + animatePlacehodlerAtIndex(index, toState: .active) self.cancelDeleteButtonSetup() } - public func passcodeLock(lock: PasscodeLockType, removedSignAtIndex index: Int) { + open func passcodeLock(_ lock: PasscodeLockType, removedSignAtIndex index: Int) { - animatePlacehodlerAtIndex(index, toState: .Inactive) + animatePlacehodlerAtIndex(index, toState: .inactive) if (index == 0) { self.cancelDeleteButtonSetup() } } - public func cancelDeleteButtonSetup() { + open func cancelDeleteButtonSetup() { let cancelButton = ((self.passcodeLock.isPincodeEmpty == true) ? (self.stringsToShow?.cancel ?? localizedStringFor("Cancel", comment: "")) : (self.stringsToShow?.delete ?? localizedStringFor("Delete", comment: ""))) let titleForButton = ((self.passcodeLock.state.isCancellableAction == true) ? cancelButton : (self.stringsToShow?.delete ?? localizedStringFor("Delete", comment: ""))) - self.cancelDeleteButton?.setTitle(titleForButton, forState: .Normal) + self.cancelDeleteButton?.setTitle(titleForButton, for: UIControl.State()) + self.cancelDeleteButton?.setTitleColor(self.customTintColor, for: UIControl.State()) + self.cancelDeleteButton?.setTitleColor(self.customTintColor?.withAlphaComponent(0.5), for: .disabled) + self.cancelDeleteButton?.titleLabel?.font = self.font if (self.passcodeLock.isPincodeEmpty == true && self.passcodeLock.state.isCancellableAction == false) { - self.cancelDeleteButton?.enabled = false + self.cancelDeleteButton?.isEnabled = false } else { - self.cancelDeleteButton?.enabled = true + self.cancelDeleteButton?.isEnabled = true } } } diff --git a/PasscodeLock/Protocols/PasscodeLockStateType.swift b/PasscodeLock/Protocols/PasscodeLockStateType.swift index 8598c1f2..c933bc82 100644 --- a/PasscodeLock/Protocols/PasscodeLockStateType.swift +++ b/PasscodeLock/Protocols/PasscodeLockStateType.swift @@ -10,10 +10,11 @@ import Foundation public protocol PasscodeLockStateType { - var title: String {get} - var description: String {get} - var isCancellableAction: Bool {get} - var isTouchIDAllowed: Bool {get} + var title : String {get} + var description : String {get} + var isCancellableAction : Bool {get} + var isTouchIDAllowed : Bool {get} + var tintColor : UIColor? {get} - mutating func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?) + mutating func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) } diff --git a/PasscodeLock/Protocols/PasscodeLockType.swift b/PasscodeLock/Protocols/PasscodeLockType.swift index cd00a4c6..8232b879 100644 --- a/PasscodeLock/Protocols/PasscodeLockType.swift +++ b/PasscodeLock/Protocols/PasscodeLockType.swift @@ -7,27 +7,28 @@ // import Foundation +import UIKit public protocol PasscodeLockType { - weak var delegate: PasscodeLockTypeDelegate? {get set} + var delegate: PasscodeLockTypeDelegate? {get set} var configuration: PasscodeLockConfigurationType {get} var repository: PasscodeRepositoryType {get} var state: PasscodeLockStateType {get} var isTouchIDAllowed: Bool {get} var isPincodeEmpty: Bool {get} - func addSign(sign: String) + func addSign(_ sign: String, stringsToBeDisplayed: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) func removeSign() - func changeStateTo(state: PasscodeLockStateType) - func authenticateWithBiometrics(stringsToShow: StringsToBeDisplayed?) + func changeStateTo(_ state: PasscodeLockStateType) + func authenticateWithBiometrics(_ stringsToShow: StringsToBeDisplayed?) } public protocol PasscodeLockTypeDelegate: class { - func passcodeLockDidSucceed(lock: PasscodeLockType) - func passcodeLockDidFail(lock: PasscodeLockType) - func passcodeLockDidChangeState(lock: PasscodeLockType) - func passcodeLock(lock: PasscodeLockType, addedSignAtIndex index: Int) - func passcodeLock(lock: PasscodeLockType, removedSignAtIndex index: Int) + func passcodeLockDidSucceed(_ lock: PasscodeLockType) + func passcodeLockDidFail(_ lock: PasscodeLockType) + func passcodeLockDidChangeState(_ lock: PasscodeLockType) + func passcodeLock(_ lock: PasscodeLockType, addedSignAtIndex index: Int) + func passcodeLock(_ lock: PasscodeLockType, removedSignAtIndex index: Int) } diff --git a/PasscodeLock/Protocols/PasscodeRepositoryType.swift b/PasscodeLock/Protocols/PasscodeRepositoryType.swift index 19272379..79475434 100644 --- a/PasscodeLock/Protocols/PasscodeRepositoryType.swift +++ b/PasscodeLock/Protocols/PasscodeRepositoryType.swift @@ -13,6 +13,6 @@ public protocol PasscodeRepositoryType { var hasPasscode: Bool {get} var passcode: [String]? {get} - func savePasscode(passcode: [String]) + func savePasscode(_ passcode: [String]) func deletePasscode() } diff --git a/PasscodeLock/Views/PasscodeLockView.xib b/PasscodeLock/Views/PasscodeLockView.xib index 72c81104..76f8c2d3 100644 --- a/PasscodeLock/Views/PasscodeLockView.xib +++ b/PasscodeLock/Views/PasscodeLockView.xib @@ -1,12 +1,11 @@ - - + + - - + @@ -23,28 +22,38 @@ + + + + + + + + + + - + - + - + @@ -146,654 +155,163 @@ - - - - - - - - - - - - + + + + + + + + + + + + @@ -836,7 +364,7 @@ - + @@ -868,10 +396,10 @@ + - @@ -883,10 +411,33 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PasscodeLock/Views/PasscodeSignButton.swift b/PasscodeLock/Views/PasscodeSignButton.swift index 109607a9..7dfd2e10 100644 --- a/PasscodeLock/Views/PasscodeSignButton.swift +++ b/PasscodeLock/Views/PasscodeSignButton.swift @@ -8,96 +8,14 @@ import UIKit -@IBDesignable -public class PasscodeSignButton: UIButton { +open class PasscodeSignButton: UIButton { - @IBInspectable - public var passcodeSign: String = "1" - - @IBInspectable - public var borderColor: UIColor = UIColor.whiteColor() { - didSet { - setupView() - } - } - - @IBInspectable - public var borderRadius: CGFloat = 30 { - didSet { - setupView() - } - } - - @IBInspectable - public var highlightBackgroundColor: UIColor = UIColor.clearColor() { - didSet { - setupView() - } - } - - public override init(frame: CGRect) { - - super.init(frame: frame) - - setupView() - setupActions() - } - - public required init?(coder aDecoder: NSCoder) { - - super.init(coder: aDecoder) - - setupActions() - } - - public override func intrinsicContentSize() -> CGSize { - - return CGSizeMake(60, 60) - } - - private var defaultBackgroundColor = UIColor.clearColor() - - private func setupView() { - - layer.borderWidth = 1 - layer.cornerRadius = layer.frame.height/2 - layer.borderColor = borderColor.CGColor - - if let backgroundColor = backgroundColor { - - defaultBackgroundColor = backgroundColor - } - } - - private func setupActions() { - - addTarget(self, action: #selector(self.handleTouchDown), forControlEvents: .TouchDown) - addTarget(self, action: #selector(self.handleTouchUp), forControlEvents: [.TouchUpInside, .TouchDragOutside, .TouchCancel]) - } - - func handleTouchDown() { - - animateBackgroundColor(highlightBackgroundColor) - } - - func handleTouchUp() { - - animateBackgroundColor(defaultBackgroundColor) - } - - private func animateBackgroundColor(color: UIColor) { - - UIView.animateWithDuration( - 0.3, - delay: 0.0, - usingSpringWithDamping: 1, - initialSpringVelocity: 0.0, - options: [.AllowUserInteraction, .BeginFromCurrentState], - animations: { - - self.backgroundColor = color - }, - completion: nil - ) - } + open var passcodeSign: String = "1" + open var customTintColor: UIColor? = UIColor(red: 0, green: 100/255, blue: 165/255, alpha: 1) + + open override func awakeFromNib() { + super.awakeFromNib() + + self.tintColor = customTintColor + } } diff --git a/PasscodeLock/Views/PasscodeSignPlaceholderView.swift b/PasscodeLock/Views/PasscodeSignPlaceholderView.swift index 42a28770..c6c30d56 100644 --- a/PasscodeLock/Views/PasscodeSignPlaceholderView.swift +++ b/PasscodeLock/Views/PasscodeSignPlaceholderView.swift @@ -9,35 +9,35 @@ import UIKit @IBDesignable -public class PasscodeSignPlaceholderView: UIView { +open class PasscodeSignPlaceholderView: UIView { public enum State { - case Inactive - case Active - case Error + case inactive + case active + case error } - - @IBInspectable - public var inactiveColor: UIColor = UIColor.whiteColor() { - didSet { - setupView() - } - } - - @IBInspectable - public var activeColor: UIColor = UIColor.grayColor() { - didSet { - setupView() - } - } - - @IBInspectable - public var errorColor: UIColor = UIColor.redColor() { - didSet { - setupView() - } - } - + + @IBInspectable + open var inactiveColor: UIColor = UIColor.white { + didSet { + self.setupView() + } + } + + @IBInspectable + open var activeColor: UIColor = UIColor.gray { + didSet { + self.setupView() + } + } + + @IBInspectable + open var errorColor: UIColor = UIColor.red { + didSet { + self.setupView() + } + } + public override init(frame: CGRect) { super.init(frame: frame) @@ -50,45 +50,38 @@ public class PasscodeSignPlaceholderView: UIView { super.init(coder: aDecoder) } - public override func intrinsicContentSize() -> CGSize { + open override var intrinsicContentSize : CGSize { - return CGSizeMake(16, 16) + return CGSize(width: 16, height: 16) } - private func setupView() { + func setupView() { layer.cornerRadius = 7 layer.borderWidth = 1 - layer.borderColor = activeColor.CGColor + layer.borderColor = activeColor.cgColor backgroundColor = inactiveColor } - private func colorsForState(state: State) -> (backgroundColor: UIColor, borderColor: UIColor) { + fileprivate func colorsForState(_ state: State) -> (backgroundColor: UIColor, borderColor: UIColor) { switch state { - case .Inactive: return (inactiveColor, activeColor) - case .Active: return (activeColor, activeColor) - case .Error: return (errorColor, errorColor) + case .inactive: return (inactiveColor, activeColor) + case .active: return (activeColor, activeColor) + case .error: return (errorColor, errorColor) } } - public func animateState(state: State) { + open func animateState(_ state: State, completion: (() -> Void)? = nil) { let colors = colorsForState(state) - - UIView.animateWithDuration( - 0.5, - delay: 0, - usingSpringWithDamping: 1, - initialSpringVelocity: 0, - options: [], - animations: { - - self.backgroundColor = colors.backgroundColor - self.layer.borderColor = colors.borderColor.CGColor - - }, - completion: nil - ) - } + + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: [], animations: { [weak self] in + self?.backgroundColor = colors.backgroundColor + self?.layer.borderColor = colors.borderColor.cgColor + + }, completion: nil) + } + } + diff --git a/PasscodeLock/de.lproj/Localize.strings b/PasscodeLock/de.lproj/Localize.strings index d0d12f90..a5f13fae 100644 --- a/PasscodeLock/de.lproj/Localize.strings +++ b/PasscodeLock/de.lproj/Localize.strings @@ -35,3 +35,4 @@ "Cancel" = "Abbrechen"; "Delete" = "Löschen"; "UseTouchId" = "TouchID verwenden"; +"UseFaceId" = "FaceID verwenden"; diff --git a/PasscodeLock/en.lproj/Localize.strings b/PasscodeLock/en.lproj/Localize.strings new file mode 100644 index 00000000..1c83f62c --- /dev/null +++ b/PasscodeLock/en.lproj/Localize.strings @@ -0,0 +1,38 @@ +/* + Localize.strings + PasscodeLock + + Created by Ramiro Ramirez on 18/10/16. + Copyright © 2016 Yanko Dimitrov. All rights reserved. +*/ + +/* Enter Passcode State */ +"PasscodeLockEnterTitle" = "Enter Passcode"; +"PasscodeLockEnterDescription" = "Enter your passcode to proceed."; + +/* Set Passcode State */ +"PasscodeLockSetTitle" = "Enter a Passcode"; +"PasscodeLockSetDescription" = "Choose your passcode."; + +/* Confirm Passcode State */ +"PasscodeLockConfirmTitle" = "Confirm Passcode"; +"PasscodeLockConfirmDescription" = "Enter the passcode again."; + +/* Change Passcode State */ +"PasscodeLockChangeTitle" = "Enter Old Passcode"; +"PasscodeLockChangeDescription" = "Enter your old passcode."; + +/* Passcode Mismatch State */ +"PasscodeLockMismatchTitle" = "Try again"; +"PasscodeLockMismatchDescription" = "Passcodes didn\'t match."; + +/* Touch ID Reason */ +"PasscodeLockTouchIDReason" = "Authentication required to proceed"; + +/* Touch ID Fallback Button */ +"PasscodeLockTouchIDButton" = "Enter Passcode"; + +"Cancel" = "Cancel"; +"Delete" = "Delete"; +"UseTouchId" = "Use TouchID"; +"UseFaceId" = "Use FaceID"; diff --git a/PasscodeLockDemo/AppDelegate.swift b/PasscodeLockDemo/AppDelegate.swift index 06a5d90f..ff3f5d88 100644 --- a/PasscodeLockDemo/AppDelegate.swift +++ b/PasscodeLockDemo/AppDelegate.swift @@ -17,39 +17,39 @@ class AppDelegate: UIResponder, UIApplicationDelegate { lazy var passcodeLockPresenter: PasscodeLockPresenter = { let configuration = PasscodeLockConfiguration() - let presenter = PasscodeLockPresenter(mainWindow: self.window, configuration: configuration, stringsToShow: nil) + let presenter = PasscodeLockPresenter(mainWindow: self.window, configuration: configuration, stringsToShow: nil, tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) return presenter }() - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - - passcodeLockPresenter.presentPasscodeLock() + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + + passcodeLockPresenter.presentPasscodeLock(tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - passcodeLockPresenter.presentPasscodeLock() + passcodeLockPresenter.presentPasscodeLock(tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) } - func applicationWillEnterForeground(application: UIApplication) { + func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } } diff --git a/PasscodeLockDemo/Base.lproj/Main.storyboard b/PasscodeLockDemo/Base.lproj/Main.storyboard index bea52e36..c746e901 100644 --- a/PasscodeLockDemo/Base.lproj/Main.storyboard +++ b/PasscodeLockDemo/Base.lproj/Main.storyboard @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -14,40 +18,40 @@ - + - + @@ -60,7 +64,7 @@ - + diff --git a/PasscodeLockDemo/PasscodeSettingsViewController.swift b/PasscodeLockDemo/PasscodeSettingsViewController.swift index 073b9546..a19f9a8c 100644 --- a/PasscodeLockDemo/PasscodeSettingsViewController.swift +++ b/PasscodeLockDemo/PasscodeSettingsViewController.swift @@ -35,7 +35,7 @@ class PasscodeSettingsViewController: UIViewController { // MARK: - View - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) updatePasscodeView() @@ -45,8 +45,8 @@ class PasscodeSettingsViewController: UIViewController { let hasPasscode = configuration.repository.hasPasscode - changePasscodeButton.hidden = !hasPasscode - passcodeSwitch.on = hasPasscode + changePasscodeButton.isHidden = !hasPasscode + passcodeSwitch.isOn = hasPasscode } // MARK: - Actions @@ -55,13 +55,13 @@ class PasscodeSettingsViewController: UIViewController { let passcodeVC: PasscodeLockViewController - if passcodeSwitch.on { + if passcodeSwitch.isOn { - passcodeVC = PasscodeLockViewController(state: .SetPasscode, configuration: configuration, stringsToShow: nil) + passcodeVC = PasscodeLockViewController(state: .setPasscode, configuration: configuration, stringsToShow: nil, tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) } else { - passcodeVC = PasscodeLockViewController(state: .RemovePasscode, configuration: configuration, stringsToShow: nil) + passcodeVC = PasscodeLockViewController(state: .removePasscode, configuration: configuration, stringsToShow: nil, tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) passcodeVC.successCallback = { lock in @@ -69,7 +69,7 @@ class PasscodeSettingsViewController: UIViewController { } } - presentViewController(passcodeVC, animated: true, completion: nil) + present(passcodeVC, animated: true, completion: nil) } @IBAction func changePasscodeButtonTap(sender: UIButton) { @@ -77,18 +77,18 @@ class PasscodeSettingsViewController: UIViewController { let repo = UserDefaultsPasscodeRepository() let config = PasscodeLockConfiguration(repository: repo) - let passcodeLock = PasscodeLockViewController(state: .ChangePasscode, configuration: config, stringsToShow: nil) + let passcodeLock = PasscodeLockViewController(state: .changePasscode, configuration: config, stringsToShow: nil, tintColor: UIColor.blue, font: UIFont.italicSystemFont(ofSize: 16)) - presentViewController(passcodeLock, animated: true, completion: nil) + present(passcodeLock, animated: true, completion: nil) } @IBAction func testAlertButtonTap(sender: UIButton) { - let alertVC = UIAlertController(title: "Test", message: "", preferredStyle: .Alert) + let alertVC = UIAlertController(title: "Test", message: "", preferredStyle: .alert) - alertVC.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) + alertVC.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil)) - presentViewController(alertVC, animated: true, completion: nil) + present(alertVC, animated: true, completion: nil) } @@ -97,9 +97,9 @@ class PasscodeSettingsViewController: UIViewController { let activityVC = UIActivityViewController(activityItems: ["Test"], applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = testActivityButton - activityVC.popoverPresentationController?.sourceRect = CGRectMake(10, 20, 0, 0) + activityVC.popoverPresentationController?.sourceRect = CGRect(x: 10, y: 20, width: 0, height: 0) - presentViewController(activityVC, animated: true, completion: nil) + present(activityVC, animated: true, completion: nil) } @IBAction func dismissKeyboard() { diff --git a/PasscodeLockDemo/UserDefaultsPasscodeRepository.swift b/PasscodeLockDemo/UserDefaultsPasscodeRepository.swift index 696171a3..ca803e45 100644 --- a/PasscodeLockDemo/UserDefaultsPasscodeRepository.swift +++ b/PasscodeLockDemo/UserDefaultsPasscodeRepository.swift @@ -13,9 +13,9 @@ class UserDefaultsPasscodeRepository: PasscodeRepositoryType { private let passcodeKey = "passcode.lock.passcode" - private lazy var defaults: NSUserDefaults = { + private lazy var defaults: UserDefaults = { - return NSUserDefaults.standardUserDefaults() + return UserDefaults.standard }() var hasPasscode: Bool { @@ -29,18 +29,18 @@ class UserDefaultsPasscodeRepository: PasscodeRepositoryType { var passcode: [String]? { - return defaults.valueForKey(passcodeKey) as? [String] ?? nil + return defaults.value(forKey: passcodeKey) as? [String] ?? nil } - func savePasscode(passcode: [String]) { + func savePasscode(_ passcode: [String]) { - defaults.setObject(passcode, forKey: passcodeKey) + defaults.set(passcode, forKey: passcodeKey) defaults.synchronize() } func deletePasscode() { - defaults.removeObjectForKey(passcodeKey) + defaults.removeObject(forKey: passcodeKey) defaults.synchronize() } } diff --git a/PasscodeLockTests/Fakes/FakePasscodeLock.swift b/PasscodeLockTests/Fakes/FakePasscodeLock.swift index 518710e3..0f5ba9fa 100644 --- a/PasscodeLockTests/Fakes/FakePasscodeLock.swift +++ b/PasscodeLockTests/Fakes/FakePasscodeLock.swift @@ -7,15 +7,17 @@ // import Foundation +import PasscodeLock class FakePasscodeLock: PasscodeLockType { - + weak var delegate: PasscodeLockTypeDelegate? let configuration: PasscodeLockConfigurationType var repository: PasscodeRepositoryType { return configuration.repository } var state: PasscodeLockStateType { return lockState } let isTouchIDAllowed = false var lockState: PasscodeLockStateType + var isPincodeEmpty: Bool = false var changeStateCalled = false @@ -25,7 +27,7 @@ class FakePasscodeLock: PasscodeLockType { self.configuration = configuration } - func addSign(sign: String) { + func addSign(_ sign: String, stringsToBeDisplayed: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { } @@ -33,14 +35,14 @@ class FakePasscodeLock: PasscodeLockType { } - func changeStateTo(state: PasscodeLockStateType) { + func changeStateTo(_ state: PasscodeLockStateType) { lockState = state changeStateCalled = true delegate?.passcodeLockDidChangeState(self) } - - func authenticateWithBiometrics() { + + func authenticateWithBiometrics(_ stringsToShow: StringsToBeDisplayed?) { } } diff --git a/PasscodeLockTests/Fakes/FakePasscodeLockConfiguration.swift b/PasscodeLockTests/Fakes/FakePasscodeLockConfiguration.swift index 1cae5788..25fd6534 100644 --- a/PasscodeLockTests/Fakes/FakePasscodeLockConfiguration.swift +++ b/PasscodeLockTests/Fakes/FakePasscodeLockConfiguration.swift @@ -7,6 +7,7 @@ // import Foundation +import PasscodeLock class FakePasscodeLockConfiguration: PasscodeLockConfigurationType { diff --git a/PasscodeLockTests/Fakes/FakePasscodeLockDelegate.swift b/PasscodeLockTests/Fakes/FakePasscodeLockDelegate.swift index 3d82b9bf..c2de9915 100644 --- a/PasscodeLockTests/Fakes/FakePasscodeLockDelegate.swift +++ b/PasscodeLockTests/Fakes/FakePasscodeLockDelegate.swift @@ -7,12 +7,13 @@ // import Foundation +import PasscodeLock class FakePasscodeLockDelegate: PasscodeLockTypeDelegate { - func passcodeLockDidSucceed(lock: PasscodeLockType) {} - func passcodeLockDidFail(lock: PasscodeLockType) {} - func passcodeLockDidChangeState(lock: PasscodeLockType) {} - func passcodeLock(lock: PasscodeLockType, addedSignAtIndex index: Int) {} - func passcodeLock(lock: PasscodeLockType, removedSignAtIndex index: Int) {} + func passcodeLockDidSucceed(_ lock: PasscodeLockType) {} + func passcodeLockDidFail(_ lock: PasscodeLockType) {} + func passcodeLockDidChangeState(_ lock: PasscodeLockType) {} + func passcodeLock(_ lock: PasscodeLockType, addedSignAtIndex index: Int) {} + func passcodeLock(_ lock: PasscodeLockType, removedSignAtIndex index: Int) {} } diff --git a/PasscodeLockTests/Fakes/FakePasscodeRepository.swift b/PasscodeLockTests/Fakes/FakePasscodeRepository.swift index 657b67fc..788a2856 100644 --- a/PasscodeLockTests/Fakes/FakePasscodeRepository.swift +++ b/PasscodeLockTests/Fakes/FakePasscodeRepository.swift @@ -7,6 +7,7 @@ // import Foundation +import PasscodeLock class FakePasscodeRepository: PasscodeRepositoryType { @@ -18,7 +19,7 @@ class FakePasscodeRepository: PasscodeRepositoryType { var savePasscodeCalled = false var savedPasscode = [String]() - func savePasscode(passcode: [String]) { + func savePasscode(_ passcode: [String]) { savePasscodeCalled = true savedPasscode = passcode diff --git a/PasscodeLockTests/Fakes/FakePasscodeState.swift b/PasscodeLockTests/Fakes/FakePasscodeState.swift index 61bc3e3c..e6c9d42c 100644 --- a/PasscodeLockTests/Fakes/FakePasscodeState.swift +++ b/PasscodeLockTests/Fakes/FakePasscodeState.swift @@ -7,24 +7,25 @@ // import Foundation +import PasscodeLock class FakePasscodeState: PasscodeLockStateType { - + var title = "A" var description = "B" var isCancellableAction = true var isTouchIDAllowed = true - + var tintColor: UIColor? + var acceptPaccodeCalled = false var acceptedPasscode = [String]() var numberOfAcceptedPasscodes = 0 - + init() {} - - func acceptPasscode(passcode: [String], fromLock lock: PasscodeLockType) { - - acceptedPasscode = passcode - acceptPaccodeCalled = true - numberOfAcceptedPasscodes += 1 - } + + func acceptPasscode(_ passcode: [String], fromLock lock: PasscodeLockType, stringsToShow: StringsToBeDisplayed?, tintColor: UIColor?, font: UIFont?) { + acceptedPasscode = passcode + acceptPaccodeCalled = true + numberOfAcceptedPasscodes += 1 + } } diff --git a/PasscodeLockTests/PasscodeLock/ChangePasscodeStateTests.swift b/PasscodeLockTests/PasscodeLock/ChangePasscodeStateTests.swift index eade20ca..80a8cf9b 100644 --- a/PasscodeLockTests/PasscodeLock/ChangePasscodeStateTests.swift +++ b/PasscodeLockTests/PasscodeLock/ChangePasscodeStateTests.swift @@ -7,6 +7,7 @@ // import XCTest +@testable import PasscodeLock class ChangePasscodeStateTests: XCTestCase { @@ -21,7 +22,7 @@ class ChangePasscodeStateTests: XCTestCase { let config = FakePasscodeLockConfiguration(repository: repository) - passcodeState = ChangePasscodeState() + passcodeState = ChangePasscodeState(stringsToShow: nil, tintColor: nil, font: nil) passcodeLock = FakePasscodeLock(state: passcodeState, configuration: config) } @@ -31,7 +32,7 @@ class ChangePasscodeStateTests: XCTestCase { var didChangedState = false - override func passcodeLockDidChangeState(lock: PasscodeLockType) { + override func passcodeLockDidChangeState(_ lock: PasscodeLockType) { didChangedState = true } @@ -40,7 +41,7 @@ class ChangePasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock) + passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssert(passcodeLock.state is SetPasscodeState, "Should change the state to SetPasscodeState") XCTAssertEqual(delegate.didChangedState, true, "Should call the delegate when the passcode is correct") @@ -52,7 +53,7 @@ class ChangePasscodeStateTests: XCTestCase { var called = false - override func passcodeLockDidFail(lock: PasscodeLockType) { + override func passcodeLockDidFail(_ lock: PasscodeLockType) { called = true } @@ -61,7 +62,7 @@ class ChangePasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(["0", "0", "0", "0"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["0", "0", "0", "0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.called, true, "Should call the delegate when the passcode is incorrect") } diff --git a/PasscodeLockTests/PasscodeLock/ConfirmPasscodeStateTests.swift b/PasscodeLockTests/PasscodeLock/ConfirmPasscodeStateTests.swift index f122f702..ee1eb383 100644 --- a/PasscodeLockTests/PasscodeLock/ConfirmPasscodeStateTests.swift +++ b/PasscodeLockTests/PasscodeLock/ConfirmPasscodeStateTests.swift @@ -7,6 +7,7 @@ // import XCTest +@testable import PasscodeLock class ConfirmPasscodeStateTests: XCTestCase { @@ -22,7 +23,7 @@ class ConfirmPasscodeStateTests: XCTestCase { let config = FakePasscodeLockConfiguration(repository: repository) - passcodeState = ConfirmPasscodeState(passcode: passcodeToConfirm) + passcodeState = ConfirmPasscodeState(passcode: passcodeToConfirm, stringsToShow: nil, tintColor: nil, font: nil) passcodeLock = FakePasscodeLock(state: passcodeState, configuration: config) } @@ -32,7 +33,7 @@ class ConfirmPasscodeStateTests: XCTestCase { var called = false - override func passcodeLockDidSucceed(lock: PasscodeLockType) { + override func passcodeLockDidSucceed(_ lock: PasscodeLockType) { called = true } @@ -41,14 +42,14 @@ class ConfirmPasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(passcodeToConfirm, fromLock: passcodeLock) + passcodeState.acceptPasscode(passcodeToConfirm, fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.called, true, "Should call the delegate when the passcode is correct") } func testAcceptCorrectPasscodeWillSaveThePasscode() { - passcodeState.acceptPasscode(passcodeToConfirm, fromLock: passcodeLock) + passcodeState.acceptPasscode(passcodeToConfirm, fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(repository.savePasscodeCalled, true, "Should call the repository to save the new passcode") XCTAssertEqual(repository.savedPasscode, passcodeToConfirm, "Should save the confirmed passcode") @@ -61,12 +62,12 @@ class ConfirmPasscodeStateTests: XCTestCase { var didFailed = false var didChangedState = false - override func passcodeLockDidFail(lock: PasscodeLockType) { + override func passcodeLockDidFail(_ lock: PasscodeLockType) { didFailed = true } - override func passcodeLockDidChangeState(lock: PasscodeLockType) { + override func passcodeLockDidChangeState(_ lock: PasscodeLockType) { didChangedState = true } @@ -75,7 +76,7 @@ class ConfirmPasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(["1", "2"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["1", "2"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(passcodeLock.changeStateCalled, true, "Should change the state") XCTAssert(passcodeLock.state is SetPasscodeState, "Should change the state to SetPasscodeState") diff --git a/PasscodeLockTests/PasscodeLock/EnterPasscodeStateTests.swift b/PasscodeLockTests/PasscodeLock/EnterPasscodeStateTests.swift index 2e4dcf94..e761c3f9 100644 --- a/PasscodeLockTests/PasscodeLock/EnterPasscodeStateTests.swift +++ b/PasscodeLockTests/PasscodeLock/EnterPasscodeStateTests.swift @@ -7,20 +7,21 @@ // import XCTest +@testable import PasscodeLock class NotificaionObserver: NSObject { var called = false var callCounter = 0 - func observe(notification: String) { + func observe(_ notification: String) { - let center = NSNotificationCenter.defaultCenter() + let center = NotificationCenter.default - center.addObserver(self, selector: "handle:", name: notification, object: nil) + center.addObserver(self, selector: #selector(NotificaionObserver.handle), name: NSNotification.Name(rawValue: notification), object: nil) } - func handle(notification: NSNotification) { + @objc func handle(_ notification: Notification) { called = true callCounter += 1 @@ -40,7 +41,7 @@ class EnterPasscodeStateTests: XCTestCase { let config = FakePasscodeLockConfiguration(repository: repository) - passcodeState = EnterPasscodeState() + passcodeState = EnterPasscodeState(stringsToShow: nil, tintColor: nil, font: nil) passcodeLock = FakePasscodeLock(state: passcodeState, configuration: config) } @@ -50,7 +51,7 @@ class EnterPasscodeStateTests: XCTestCase { var called = false - override func passcodeLockDidSucceed(lock: PasscodeLockType) { + override func passcodeLockDidSucceed(_ lock: PasscodeLockType) { called = true } @@ -59,7 +60,7 @@ class EnterPasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock) + passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.called, true, "Should call the delegate when the passcode is correct") } @@ -70,7 +71,7 @@ class EnterPasscodeStateTests: XCTestCase { var called = false - override func passcodeLockDidFail(lock: PasscodeLockType) { + override func passcodeLockDidFail(_ lock: PasscodeLockType) { called = true } @@ -79,7 +80,7 @@ class EnterPasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(["0", "0", "0", "0"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["0", "0", "0", "0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.called, true, "Should call the delegate when the passcode is incorrect") } @@ -90,9 +91,9 @@ class EnterPasscodeStateTests: XCTestCase { observer.observe(PasscodeLockIncorrectPasscodeNotification) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(observer.called, true, "Should send a notificaiton when the maximum number of incorrect attempts is reached") } @@ -103,13 +104,13 @@ class EnterPasscodeStateTests: XCTestCase { observer.observe(PasscodeLockIncorrectPasscodeNotification) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) - passcodeState.acceptPasscode(["0"], fromLock: passcodeLock) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) + passcodeState.acceptPasscode(["0"], fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssertEqual(observer.callCounter, 1, "Should send the notification only once") } diff --git a/PasscodeLockTests/PasscodeLock/PasscodeLockTests.swift b/PasscodeLockTests/PasscodeLock/PasscodeLockTests.swift index efb192a3..a3044d30 100644 --- a/PasscodeLockTests/PasscodeLock/PasscodeLockTests.swift +++ b/PasscodeLockTests/PasscodeLock/PasscodeLockTests.swift @@ -7,6 +7,7 @@ // import XCTest +@testable import PasscodeLock class PasscodeLockTests: XCTestCase { @@ -29,7 +30,7 @@ class PasscodeLockTests: XCTestCase { var called = false - override func passcodeLockDidChangeState(lock: PasscodeLockType) { + override func passcodeLockDidChangeState(_ lock: PasscodeLockType) { called = true } @@ -51,7 +52,7 @@ class PasscodeLockTests: XCTestCase { var called = false var signIndex = 0 - override func passcodeLock(lock: PasscodeLockType, addedSignAtIndex index: Int) { + override func passcodeLock(_ lock: PasscodeLockType, addedSignAtIndex index: Int) { called = true signIndex = index @@ -61,12 +62,12 @@ class PasscodeLockTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeLock.addSign("1") + passcodeLock.addSign("1", stringsToBeDisplayed: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.called, true, "Should inform the delegate for added sign at index") XCTAssertEqual(delegate.signIndex, 0, "Should return the added sign index") - passcodeLock.addSign("2") + passcodeLock.addSign("2", stringsToBeDisplayed: nil, tintColor: nil, font: nil) XCTAssertEqual(delegate.signIndex, 1, "Should return the added sign index") } @@ -78,7 +79,7 @@ class PasscodeLockTests: XCTestCase { var called = false var signIndex = 0 - override func passcodeLock(lock: PasscodeLockType, removedSignAtIndex index: Int) { + override func passcodeLock(_ lock: PasscodeLockType, removedSignAtIndex index: Int) { called = true signIndex = index @@ -88,8 +89,8 @@ class PasscodeLockTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeLock.addSign("1") - passcodeLock.addSign("2") + passcodeLock.addSign("1", stringsToBeDisplayed: nil, tintColor: nil, font: nil) + passcodeLock.addSign("2", stringsToBeDisplayed: nil, tintColor: nil, font: nil) passcodeLock.removeSign() @@ -106,7 +107,7 @@ class PasscodeLockTests: XCTestCase { for sign in passcode { - passcodeLock.addSign(sign) + passcodeLock.addSign(sign, stringsToBeDisplayed: nil, tintColor: nil, font: nil) } XCTAssertEqual(initialState.acceptPaccodeCalled, true, "When the passcode length is reached should call the current state to accept the entered passcode") @@ -121,12 +122,12 @@ class PasscodeLockTests: XCTestCase { for sign in passcodeOne { - passcodeLock.addSign(sign) + passcodeLock.addSign(sign, stringsToBeDisplayed: nil, tintColor: nil, font: nil) } for sign in passcodeTwo { - passcodeLock.addSign(sign) + passcodeLock.addSign(sign, stringsToBeDisplayed: nil, tintColor: nil, font: nil) } XCTAssertEqual(initialState.numberOfAcceptedPasscodes, 2, "Should call the accept passcode twice") diff --git a/PasscodeLockTests/PasscodeLock/SetPasscodeStateTests.swift b/PasscodeLockTests/PasscodeLock/SetPasscodeStateTests.swift index 20ef1214..1748af63 100644 --- a/PasscodeLockTests/PasscodeLock/SetPasscodeStateTests.swift +++ b/PasscodeLockTests/PasscodeLock/SetPasscodeStateTests.swift @@ -7,6 +7,7 @@ // import XCTest +@testable import PasscodeLock class SetPasscodeStateTests: XCTestCase { @@ -21,7 +22,7 @@ class SetPasscodeStateTests: XCTestCase { let config = FakePasscodeLockConfiguration(repository: repository) - passcodeState = SetPasscodeState() + passcodeState = SetPasscodeState(stringsToShow: nil, tintColor: nil, font: nil) passcodeLock = FakePasscodeLock(state: passcodeState, configuration: config) } @@ -31,7 +32,7 @@ class SetPasscodeStateTests: XCTestCase { var didChangedState = false - override func passcodeLockDidChangeState(lock: PasscodeLockType) { + override func passcodeLockDidChangeState(_ lock: PasscodeLockType) { didChangedState = true } @@ -40,7 +41,7 @@ class SetPasscodeStateTests: XCTestCase { let delegate = MockDelegate() passcodeLock.delegate = delegate - passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock) + passcodeState.acceptPasscode(repository.fakePasscode, fromLock: passcodeLock, stringsToShow: nil, tintColor: nil, font: nil) XCTAssert(passcodeLock.state is ConfirmPasscodeState, "Should change the state to ConfirmPasscodeState") XCTAssertEqual(delegate.didChangedState, true, "Should inform the delegate for the state change") diff --git a/SMFPasscodeLock.podspec b/SMFPasscodeLock.podspec new file mode 100755 index 00000000..a8018e85 --- /dev/null +++ b/SMFPasscodeLock.podspec @@ -0,0 +1,31 @@ +# +# Be sure to run `pod lib lint TestLib.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = 'SMFPasscodeLock' + s.version = '2.1.1' + s.license = { :type => "MIT", :file => 'LICENSE.txt' } + s.summary = 'SMF Fork of PasscodeLock: An iOS passcode lock with Touch ID authentication written in Swift.' + s.homepage = 'https://github.com/smartmobilefactory/SwiftPasscodeLock' + s.source = { :git => 'https://github.com/smartmobilefactory/SwiftPasscodeLock.git', :tag => "releases/#{s.version}" } + s.authors = [{ 'Ramiro Ramirez' => '' }, { 'Yanko Dimitrov' => '' }, { 'Hans Seiffert' => '' }] + + s.ios.deployment_target = '8.0' + + s.source_files = 'PasscodeLock/*.{h,swift}', + 'PasscodeLock/*/*.{swift}' + + s.resources = [ + 'PasscodeLock/Views/PasscodeLockView.xib', + 'PasscodeLock/en.lproj/*', + 'PasscodeLock/PasscodeLockImages.xcassets', + 'PasscodeLock/PasscodeLockImages.xcassets/**/*' + ] + + s.requires_arc = true +end