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.

192 lines
4.7 KiB

  1. //
  2. // SecureKeypad.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Kim on 17/04/2019.
  6. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. protocol SecureKeypadDelegate: class {
  10. func didComplete(_ encryptedString: String)
  11. }
  12. enum SecureKeypadType {
  13. case ascii
  14. case numberic
  15. }
  16. class SecureKeypad: NSObject {
  17. weak var delegate: SecureKeypadDelegate?
  18. var title = "Enter Your GME Password" {
  19. didSet {
  20. self.updateUI()
  21. }
  22. }
  23. var placeholder = "Enter Your GME Password" {
  24. didSet {
  25. self.updateUI()
  26. }
  27. }
  28. var placeholderFont: UIFont? = UIFont(name: "SanFranciscoDisplay-Regular", size: 15) {
  29. didSet {
  30. self.updateUI()
  31. }
  32. }
  33. private lazy var asciiKeypad = TransKeyView()
  34. private lazy var numberPad = TransKeyView()
  35. private var target: UIViewController!
  36. private var keypadType: SecureKeypadType = .ascii
  37. private var encryptedString = ""
  38. init(target: UIViewController, keypadType: SecureKeypadType = .ascii) {
  39. super.init()
  40. self.target = target
  41. self.keypadType = keypadType
  42. self.initKeypad()
  43. }
  44. deinit {
  45. self.asciiKeypad.mTK_ClearDelegateSubviews()
  46. self.numberPad.mTK_ClearDelegateSubviews()
  47. self.asciiKeypad.delegate = nil;
  48. self.numberPad.delegate = nil;
  49. }
  50. func present(animated: Bool, completion: (() -> Void)? = nil) {
  51. let vc: TransKeyView
  52. switch keypadType {
  53. case .ascii:
  54. vc = self.asciiKeypad
  55. case .numberic:
  56. vc = self.numberPad
  57. }
  58. self.target.present(vc, animated: true, completion: completion)
  59. }
  60. private func updateUI() {
  61. switch self.keypadType {
  62. case .ascii:
  63. self.updateASCIIUI()
  64. case .numberic:
  65. self.updateNumber()
  66. }
  67. }
  68. private func initKeypad(){
  69. switch self.keypadType {
  70. case .ascii:
  71. self.initASCIIKeypad()
  72. self.updateASCIIUI()
  73. case.numberic:
  74. //TODO: Numberic keypad
  75. self.initNumberKeypad()
  76. self.updateNumber()
  77. break
  78. }
  79. }
  80. /// init ASCII keypad
  81. private func initASCIIKeypad() {
  82. asciiKeypad.mTK_Init(self)
  83. asciiKeypad.delegate = self
  84. asciiKeypad.mTK_MakeSecureKey()
  85. asciiKeypad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  86. asciiKeypad.mTK_UseCursor(true)
  87. asciiKeypad.mTK_UseAllDeleteButton(true)
  88. asciiKeypad.mTK_UseNavigationBar(true)
  89. asciiKeypad.mTK_UseVoiceOver(true)
  90. asciiKeypad.mTK_setHideInputPasswordDelay(3)
  91. asciiKeypad.mTK_SetControlCenter(false)
  92. asciiKeypad.mTK_setIgnoreStatusbar(false)
  93. asciiKeypad.mTK_UseShiftOptional(true)
  94. asciiKeypad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  95. asciiKeypad.mTK_EnableSamekeyInputDataEncrypt(true)
  96. asciiKeypad.mTK_SetUseBalloonImageButton(true)
  97. asciiKeypad.mTK_LicenseCheck("license_mtranskey")
  98. }
  99. /// update ASCII UI
  100. private func updateASCIIUI() {
  101. asciiKeypad.mTK_SetHint(self.placeholder, font: self.placeholderFont)
  102. asciiKeypad.setKeyboardType(
  103. self,
  104. keypadType: 0,
  105. mTK_inputType: 2,
  106. mTK_inputTitle: self.title,
  107. mTK_cryptType: 0,
  108. mTK_maxLength: 100,
  109. mTK_minLength: 0,
  110. mTK_keypadUpper: false,
  111. mTK_languageType: 1
  112. )
  113. }
  114. private func initNumberKeypad(){
  115. numberPad.mTK_Init(self)
  116. numberPad.delegate = self
  117. numberPad.mTK_MakeSecureKey()
  118. numberPad.mTK_LicenseCheck("license_mtranskey")
  119. numberPad.mTK_ShowMessageIfMinLength("0자리 이상 입력해주세요.")
  120. numberPad.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
  121. numberPad.mTK_UseVoiceOver(false)
  122. numberPad.mTK_setIgnoreStatusbar(false)
  123. numberPad.mTK_SetControlCenter(false)
  124. numberPad.mTK_UseAllDeleteButton(false)
  125. numberPad.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
  126. }
  127. private func updateNumber(){
  128. numberPad.mTK_SetHint(self.placeholder, font: self.placeholderFont)
  129. numberPad.setKeyboardType(
  130. self,
  131. keypadType: TransKeyKeypadTypeText,
  132. mTK_inputType: 2,
  133. mTK_inputTitle: self.title,
  134. mTK_cryptType: 0,
  135. mTK_maxLength: 16,
  136. mTK_minLength: 0,
  137. mTK_keypadUpper: false,
  138. mTK_languageType: Int(mTK_Language_English.rawValue)
  139. )
  140. }
  141. }
  142. extension SecureKeypad: TransKeyViewDelegate {
  143. func secureInputFinish(_ type: Int) {
  144. let vc: TransKeyView
  145. switch keypadType {
  146. case .ascii:
  147. vc = self.asciiKeypad
  148. case .numberic:
  149. vc = self.numberPad
  150. }
  151. self.encryptedString = vc.mTK_GetSecureData()
  152. if vc.mTK_GetDataLength() == 0 {
  153. self.encryptedString = ""
  154. }
  155. vc.dismiss(animated: true){
  156. self.delegate?.didComplete(self.encryptedString)
  157. }
  158. }
  159. }