You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
12 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // LoginViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 07/09/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import Localize_Swift
  10. import LocalAuthentication
  11. class LoginViewController: UIViewController {
  12. struct StringConstants {
  13. let headerTitle = "login_title_text".localized()
  14. let subHeaderTitle = "login_subtitle_text".localized()
  15. let userIdTitle = "login_user_id_text".localized()
  16. let userIdPlaceholder = "user_Id_placeholder_text".localized()
  17. let passwordTitle = "password_text".localized()
  18. let forgotPasswordText = "forgot_password_text".localized()
  19. let newToGmeText = "new_to_gme_text".localized()
  20. let registerHereText = "login_register_here_text".localized()
  21. let loginText = "login_text".localized()
  22. }
  23. // MARK: IBOutlets
  24. @IBOutlet weak var userNameTextField: UITextField!
  25. @IBOutlet weak var passwordTextField: UITextField!
  26. // views
  27. @IBOutlet weak var backgroundTextfieldsView: UIView!
  28. @IBOutlet weak var userIdBackgroundView: UIView!
  29. @IBOutlet weak var passwordBackgroundView: UIView!
  30. @IBOutlet weak var headerTitle: UILabel!
  31. @IBOutlet weak var subtitle: UILabel!
  32. @IBOutlet weak var userIdTitleLabel: UILabel!
  33. @IBOutlet weak var passwordTitleLabel: UILabel!
  34. @IBOutlet weak var newToGmeLabel: UILabel!
  35. @IBOutlet weak var registerHereButton: UIButton!
  36. @IBOutlet weak var forgotPasswordButton: UIButton!
  37. @IBOutlet weak var forgotPasswordView: UIView!
  38. @IBOutlet weak var logoImageView: UIImageView!
  39. @IBOutlet weak var loginButton: UIButton!
  40. // keyboard
  41. var mQwertyTransKeyView : TransKeyView?
  42. var mNumberTransKeyView : TransKeyView?
  43. var secureKey : NSData!
  44. var encryptedPassword : String?
  45. var numberCipherString : String!
  46. var qwertyCipherString : String!
  47. var isTranskeyShowing : Bool!
  48. var isShowQwerty : Bool! = true
  49. var isShowNumber : Bool!
  50. // MARK: Properties
  51. var presenter: LoginModuleInterface?
  52. // MARK: VC's Life cycle
  53. override func viewDidLoad() {
  54. super.viewDidLoad()
  55. self.setup()
  56. configureLanguage()
  57. }
  58. override func viewDidDisappear(_ animated: Bool) {
  59. super.viewDidDisappear(animated)
  60. mQwertyTransKeyView?.mTK_ClearDelegateSubviews()
  61. mNumberTransKeyView?.mTK_ClearDelegateSubviews()
  62. if isTranskeyShowing == false {
  63. mQwertyTransKeyView?.delegate = nil;
  64. mNumberTransKeyView?.delegate = nil;
  65. }
  66. }
  67. override func viewWillAppear(_ animated: Bool) {
  68. super.viewWillAppear(animated)
  69. self.setupKeyboard()
  70. }
  71. override func viewWillDisappear(_ animated: Bool) {
  72. super.viewWillDisappear(animated)
  73. self.navigationItem.title = ""
  74. }
  75. // MARK: IBActions
  76. @IBAction func forgotPassword(_ sender: UIButton) {
  77. self.presenter?.forgotPassword()
  78. }
  79. @IBAction func register(_ sender: UIButton) {
  80. self.presenter?.register()
  81. }
  82. @IBAction func login(_ sender: UIButton) {
  83. let username = self.userNameTextField.text!
  84. let password = self.passwordTextField.text!
  85. self.presenter?.login(userName: username, password: password, encryptedPassword: self.encryptedPassword ?? "")
  86. }
  87. // MARK: Other Functions
  88. private func setup() {
  89. // all setup should be done here
  90. setupNavBar()
  91. setupColor()
  92. self.passwordTextField.delegate = self
  93. // showAnimation()
  94. }
  95. func authenticateUser() {
  96. let context : LAContext = LAContext()
  97. var error: NSError?
  98. let reasonString = "Authentication is needed to access Gme Remit application."
  99. if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
  100. context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString) { (success, error) in
  101. if success {
  102. print("authenticated")
  103. }
  104. else {
  105. // print(evalPolicyError?.localizedDescription)
  106. guard let error = error as NSError? else {return}
  107. switch error.code {
  108. case LAError.systemCancel.rawValue:
  109. print("Authentication was cancell by the system")
  110. case LAError.userCancel.rawValue:
  111. print("Authentication cancelled by the user")
  112. case LAError.userFallback.rawValue:
  113. print("user selected to enter custome password")
  114. default:
  115. print("Authentication failed.")
  116. }
  117. }
  118. }
  119. }
  120. }
  121. func setupKeyboard() {
  122. isShowNumber = false
  123. isShowQwerty = true
  124. isTranskeyShowing = false
  125. let iv: Array<String> = ["M", "o", "b", "i", "l", "e", "T", "r" , "a", "n", "s", "K", "e", "y", "1", "0"]
  126. secureKey = NSData(bytes: iv, length: 16)
  127. setQwertyTranskey()
  128. // self.showQwertyTranskeyAction()
  129. }
  130. func setQwertyTranskey() {
  131. mQwertyTransKeyView = TransKeyView()
  132. mQwertyTransKeyView?.mTK_Init(self)
  133. mQwertyTransKeyView?.delegate = self
  134. mQwertyTransKeyView?.mTK_MakeSecureKey()
  135. mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(false)
  136. mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortrait)
  137. // ccr key
  138. mQwertyTransKeyView?.mTK_LicenseCheck("license_IBK_TEST_IONEBANK_20181105_20190531")
  139. }
  140. private func configureLanguage() {
  141. // Localize.setCurrentLanguage("en")
  142. self.headerTitle.text = StringConstants().headerTitle
  143. self.subtitle.text = StringConstants().subHeaderTitle
  144. self.userIdTitleLabel.text = StringConstants().userIdTitle
  145. self.userNameTextField.placeholder = StringConstants().userIdPlaceholder
  146. self.passwordTitleLabel.text = StringConstants().passwordTitle
  147. self.forgotPasswordButton.setTitle(StringConstants().forgotPasswordText, for: .normal)
  148. self.newToGmeLabel.text = StringConstants().newToGmeText
  149. self.registerHereButton.setTitle(StringConstants().registerHereText, for: .normal)
  150. self.loginButton.setTitle(StringConstants().loginText, for: .normal)
  151. }
  152. func setupColor() {
  153. self.loginButton.backgroundColor = AppConstants.themeRedColor
  154. self.headerTitle.textColor = AppConstants.themeRedColor
  155. }
  156. func showAnimation() {
  157. setupInitialPositionsOfviews()
  158. animateViews()
  159. }
  160. private func setupInitialPositionsOfviews() {
  161. self.userIdBackgroundView.center.x -= self.view.bounds.width
  162. self.passwordBackgroundView.center.x -= self.view.bounds.width
  163. self.loginButton.transform = CGAffineTransform.init(scaleX: 0, y: 1)
  164. self.headerTitle.alpha = 0
  165. self.headerTitle.center.y -= 200
  166. self.subtitle.alpha = 0
  167. self.forgotPasswordView.alpha = 0
  168. self.logoImageView.center.y += (self.logoImageView.bounds.height + 20)
  169. self.loginButton.setTitle("", for: UIControlState.normal)
  170. }
  171. private func animateViews() {
  172. // user id
  173. UIView.animate(withDuration: 0.5, animations: {
  174. self.userIdBackgroundView.center.x += self.view.bounds.width
  175. })
  176. // password
  177. UIView.animate(withDuration: 0.5, delay: 0.3, options: [], animations: {
  178. self.passwordBackgroundView.center.x += self.view.bounds.width
  179. }, completion: nil)
  180. // login button
  181. UIView.animate(withDuration: 0.5, delay: 0.4, options: [], animations: {
  182. self.loginButton.transform = CGAffineTransform.identity
  183. }, completion: { (_) in
  184. self.loginButton.setTitle("Login", for: UIControlState.normal)
  185. })
  186. // subtitle
  187. UIView.animate(withDuration: 0.5, delay: 0.7, options: [], animations: {
  188. self.subtitle.alpha = 1
  189. }, completion: nil)
  190. // forgot password
  191. UIView.animate(withDuration: 0.5, delay: 0.9, options: [], animations: {
  192. self.forgotPasswordView.alpha = 1
  193. })
  194. // header title
  195. // logoimageview
  196. UIView.animate(withDuration: 0.7, delay: 0, options: [], animations: {
  197. // todo
  198. self.headerTitle.alpha = 1
  199. self.headerTitle.center.y += 200
  200. self.logoImageView.center.y -= (self.logoImageView.bounds.height + 20)
  201. }, completion: nil)
  202. }
  203. private func setupNavBar() {
  204. self.setupPicturedNavBar()
  205. }
  206. }
  207. // MARK: LoginViewInterface
  208. extension LoginViewController: LoginViewInterface {
  209. func show(error: String) {
  210. self.alert(message: error)
  211. }
  212. func showLoading() {
  213. self.showProgressHud()
  214. }
  215. func hideLoading() {
  216. self.hideProgressHud()
  217. }
  218. }
  219. extension LoginViewController: TransKeyViewDelegate {
  220. func secureInputFinish(_ type: Int) {
  221. var targetView : TransKeyView?
  222. if isShowQwerty == true {
  223. qwertyCipherString = mQwertyTransKeyView?.mTK_GetSecureData()
  224. targetView = mQwertyTransKeyView
  225. self.encryptedPassword = qwertyCipherString
  226. self.passwordTextField.text = "password"
  227. }
  228. isShowQwerty = false
  229. isShowNumber = false
  230. isTranskeyShowing = false
  231. targetView?.dismiss(animated: true, completion: nil)
  232. }
  233. func showQwertyTranskeyAction(){
  234. if mQwertyTransKeyView?.isBeingPresented == false {
  235. isShowQwerty = true
  236. isTranskeyShowing = true
  237. let hintStr = String(format:"password", 0)
  238. let font = UIFont(name: "Arial", size: 15)
  239. mQwertyTransKeyView?.mTK_SetHint(hintStr, font: font)
  240. mQwertyTransKeyView?.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  241. mQwertyTransKeyView?.mTK_UseCursor(true)
  242. mQwertyTransKeyView?.mTK_UseAllDeleteButton(true)
  243. mQwertyTransKeyView?.mTK_UseNavigationBar(true)
  244. mQwertyTransKeyView?.mTK_UseVoiceOver(true)
  245. mQwertyTransKeyView?.mTK_setHideInputPasswordDelay(3)
  246. mQwertyTransKeyView?.mTK_SetControlCenter(false)
  247. mQwertyTransKeyView?.mTK_setIgnoreStatusbar(false)
  248. // mQwertyTransKeyView?.mTK_SetLanguage(1)
  249. mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  250. mQwertyTransKeyView?.setKeyboardType(self,
  251. keypadType: 0,
  252. mTK_inputType: 2,
  253. mTK_inputTitle: "password",
  254. mTK_cryptType: 0,
  255. mTK_maxLength: 100,
  256. mTK_minLength: 0,
  257. mTK_keypadUpper: false,
  258. mTK_languageType: 1)
  259. mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(false)
  260. mQwertyTransKeyView?.mTK_SetUseBalloonImageButton(true)
  261. if let mQwertyTransKeyView = mQwertyTransKeyView {
  262. self.present(mQwertyTransKeyView, animated: true, completion: nil)
  263. }
  264. }
  265. }
  266. }
  267. extension LoginViewController: UITextFieldDelegate {
  268. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  269. if textField == passwordTextField {
  270. self.showQwertyTranskeyAction()
  271. return false
  272. }
  273. return true
  274. }
  275. }