forked from smartmobilefactory/SwiftPasscodeLock
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPasscodeLockPresenter.swift
More file actions
151 lines (113 loc) · 5.78 KB
/
Copy pathPasscodeLockPresenter.swift
File metadata and controls
151 lines (113 loc) · 5.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// PasscodeLockPresenter.swift
// PasscodeLock
//
// Created by Yanko Dimitrov on 8/29/15.
// Copyright © 2015 Yanko Dimitrov. All rights reserved.
//
import UIKit
public struct StringsToBeDisplayed {
public var passcodeLockEnterTitle: String?
public var passcodeLockEnterDescription: String?
public var passcodeLockSetTitle: String?
public var passcodeLockSetDescription: String?
public var passcodeLockConfirmTitle: String?
public var passcodeLockConfirmDescription: String?
public var passcodeLockChangeTitle: String?
public var passcodeLockChangeDescription: String?
public var passcodeLockMismatchTitle: String?
public var passcodeLockMismatchDescription: String?
public var passcodeLockTouchIDReason: String?
public var passcodeLockTouchIDButton: String?
public var cancel: String?
public var delete: String?
public var 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?) {
self.passcodeLockEnterTitle = passcodeLockEnterTitle
self.passcodeLockEnterDescription = passcodeLockEnterDescription
self.passcodeLockSetTitle = passcodeLockSetTitle
self.passcodeLockSetDescription = passcodeLockSetDescription
self.passcodeLockConfirmTitle = passcodeLockConfirmTitle
self.passcodeLockConfirmDescription = passcodeLockConfirmDescription
self.passcodeLockChangeTitle = passcodeLockChangeTitle
self.passcodeLockChangeDescription = passcodeLockChangeDescription
self.passcodeLockMismatchTitle = passcodeLockMismatchTitle
self.passcodeLockMismatchDescription = passcodeLockMismatchDescription
self.passcodeLockTouchIDReason = passcodeLockTouchIDReason
self.passcodeLockTouchIDButton = passcodeLockTouchIDButton
self.cancel = cancel
self.delete = delete
self.useTouchID = useTouchID
}
}
public class PasscodeLockPresenter {
private var mainWindow: UIWindow?
public lazy var passcodeLockWindow: UIWindow = {
let window = UIWindow(frame: UIScreen.mainScreen().bounds)
window.windowLevel = 0
window.makeKeyAndVisible()
return window
}()
private let passcodeConfiguration: PasscodeLockConfigurationType
public var isPasscodePresented = false
public let passcodeLockVC: PasscodeLockViewController
public 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?, tintColor: UIColor?, font: UIFont?) {
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, 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
mainWindow?.windowLevel = 1
mainWindow?.endEditing(true)
let passcodeLockVC = PasscodeLockViewController(state: .EnterPasscode, configuration: (config ?? passcodeConfiguration), stringsToShow: stringsToShow, tintColor: tintColor, font: font)
if (image != nil) {
passcodeLockVC.customImage = image
}
let userDismissCompletionCallback = passcodeLockVC.dismissCompletionCallback
passcodeLockVC.dismissCompletionCallback = { [weak self] in
dismissCompletionBlock?()
userDismissCompletionCallback?()
self?.dismissPasscodeLock()
}
passcodeLockWindow.rootViewController = passcodeLockVC
}
public func dismissPasscodeLock(animated animated: Bool = true) {
isPasscodePresented = false
mainWindow?.windowLevel = 1
mainWindow?.makeKeyAndVisible()
if animated {
animatePasscodeLockDismissal()
} else {
passcodeLockWindow.windowLevel = 0
passcodeLockWindow.rootViewController = nil
}
}
internal func animatePasscodeLockDismissal() {
UIView.animateWithDuration(
0.5,
delay: 0,
usingSpringWithDamping: 1,
initialSpringVelocity: 0,
options: [.CurveEaseInOut],
animations: { [weak self] in
self?.passcodeLockWindow.alpha = 0
},
completion: { [weak self] _ in
self?.passcodeLockWindow.windowLevel = 0
self?.passcodeLockWindow.rootViewController = nil
self?.passcodeLockWindow.alpha = 1
}
)
}
}