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
345 lines
12 KiB
//
|
|
// LoginViewController.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by gme_2 on 07/09/2018.
|
|
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Localize_Swift
|
|
import LocalAuthentication
|
|
|
|
class LoginViewController: UIViewController {
|
|
struct StringConstants {
|
|
let headerTitle = "login_title_text".localized()
|
|
let subHeaderTitle = "login_subtitle_text".localized()
|
|
let userIdTitle = "login_user_id_text".localized()
|
|
let userIdPlaceholder = "user_Id_placeholder_text".localized()
|
|
let passwordTitle = "password_text".localized()
|
|
|
|
let forgotPasswordText = "forgot_password_text".localized()
|
|
let newToGmeText = "new_to_gme_text".localized()
|
|
let registerHereText = "login_register_here_text".localized()
|
|
let loginText = "login_text".localized()
|
|
}
|
|
|
|
|
|
// MARK: IBOutlets
|
|
|
|
@IBOutlet weak var userNameTextField: UITextField!
|
|
@IBOutlet weak var passwordTextField: UITextField!
|
|
|
|
// views
|
|
@IBOutlet weak var backgroundTextfieldsView: UIView!
|
|
@IBOutlet weak var userIdBackgroundView: UIView!
|
|
@IBOutlet weak var passwordBackgroundView: UIView!
|
|
|
|
@IBOutlet weak var headerTitle: UILabel!
|
|
@IBOutlet weak var subtitle: UILabel!
|
|
@IBOutlet weak var userIdTitleLabel: UILabel!
|
|
|
|
@IBOutlet weak var passwordTitleLabel: UILabel!
|
|
|
|
@IBOutlet weak var newToGmeLabel: UILabel!
|
|
|
|
@IBOutlet weak var registerHereButton: UIButton!
|
|
|
|
@IBOutlet weak var forgotPasswordButton: UIButton!
|
|
@IBOutlet weak var forgotPasswordView: UIView!
|
|
@IBOutlet weak var logoImageView: UIImageView!
|
|
@IBOutlet weak var loginButton: UIButton!
|
|
|
|
|
|
// keyboard
|
|
var mQwertyTransKeyView : TransKeyView?
|
|
var mNumberTransKeyView : TransKeyView?
|
|
|
|
var secureKey : NSData!
|
|
var encryptedPassword : String?
|
|
|
|
var numberCipherString : String!
|
|
var qwertyCipherString : String!
|
|
|
|
var isTranskeyShowing : Bool!
|
|
var isShowQwerty : Bool! = true
|
|
var isShowNumber : Bool!
|
|
|
|
|
|
// MARK: Properties
|
|
|
|
var presenter: LoginModuleInterface?
|
|
|
|
|
|
// MARK: VC's Life cycle
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.setup()
|
|
configureLanguage()
|
|
}
|
|
|
|
override func viewDidDisappear(_ animated: Bool) {
|
|
super.viewDidDisappear(animated)
|
|
mQwertyTransKeyView?.mTK_ClearDelegateSubviews()
|
|
mNumberTransKeyView?.mTK_ClearDelegateSubviews()
|
|
if isTranskeyShowing == false {
|
|
mQwertyTransKeyView?.delegate = nil;
|
|
mNumberTransKeyView?.delegate = nil;
|
|
}
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
self.setupKeyboard()
|
|
}
|
|
|
|
|
|
|
|
override func viewWillDisappear(_ animated: Bool) {
|
|
super.viewWillDisappear(animated)
|
|
self.navigationItem.title = ""
|
|
}
|
|
|
|
// MARK: IBActions
|
|
@IBAction func forgotPassword(_ sender: UIButton) {
|
|
self.presenter?.forgotPassword()
|
|
}
|
|
|
|
@IBAction func register(_ sender: UIButton) {
|
|
self.presenter?.register()
|
|
}
|
|
|
|
@IBAction func login(_ sender: UIButton) {
|
|
let username = self.userNameTextField.text!
|
|
let password = self.passwordTextField.text!
|
|
self.presenter?.login(userName: username, password: password, encryptedPassword: self.encryptedPassword ?? "")
|
|
}
|
|
// MARK: Other Functions
|
|
|
|
private func setup() {
|
|
// all setup should be done here
|
|
setupNavBar()
|
|
setupColor()
|
|
self.passwordTextField.delegate = self
|
|
// showAnimation()
|
|
}
|
|
|
|
|
|
|
|
func authenticateUser() {
|
|
let context : LAContext = LAContext()
|
|
var error: NSError?
|
|
let reasonString = "Authentication is needed to access Gme Remit application."
|
|
|
|
if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
|
|
context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString) { (success, error) in
|
|
if success {
|
|
print("authenticated")
|
|
}
|
|
else {
|
|
// print(evalPolicyError?.localizedDescription)
|
|
guard let error = error as NSError? else {return}
|
|
switch error.code {
|
|
case LAError.systemCancel.rawValue:
|
|
print("Authentication was cancell by the system")
|
|
case LAError.userCancel.rawValue:
|
|
print("Authentication cancelled by the user")
|
|
case LAError.userFallback.rawValue:
|
|
print("user selected to enter custome password")
|
|
default:
|
|
print("Authentication failed.")
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func setupKeyboard() {
|
|
isShowNumber = false
|
|
isShowQwerty = true
|
|
isTranskeyShowing = false
|
|
let iv: Array<String> = ["M", "o", "b", "i", "l", "e", "T", "r" , "a", "n", "s", "K", "e", "y", "1", "0"]
|
|
secureKey = NSData(bytes: iv, length: 16)
|
|
setQwertyTranskey()
|
|
// self.showQwertyTranskeyAction()
|
|
}
|
|
|
|
func setQwertyTranskey() {
|
|
mQwertyTransKeyView = TransKeyView()
|
|
mQwertyTransKeyView?.mTK_Init(self)
|
|
mQwertyTransKeyView?.delegate = self
|
|
mQwertyTransKeyView?.mTK_MakeSecureKey()
|
|
mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(false)
|
|
mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortrait)
|
|
// ccr key
|
|
mQwertyTransKeyView?.mTK_LicenseCheck("license_IBK_TEST_IONEBANK_20181105_20190531")
|
|
}
|
|
|
|
private func configureLanguage() {
|
|
// Localize.setCurrentLanguage("en")
|
|
self.headerTitle.text = StringConstants().headerTitle
|
|
self.subtitle.text = StringConstants().subHeaderTitle
|
|
self.userIdTitleLabel.text = StringConstants().userIdTitle
|
|
self.userNameTextField.placeholder = StringConstants().userIdPlaceholder
|
|
self.passwordTitleLabel.text = StringConstants().passwordTitle
|
|
|
|
self.forgotPasswordButton.setTitle(StringConstants().forgotPasswordText, for: .normal)
|
|
self.newToGmeLabel.text = StringConstants().newToGmeText
|
|
self.registerHereButton.setTitle(StringConstants().registerHereText, for: .normal)
|
|
self.loginButton.setTitle(StringConstants().loginText, for: .normal)
|
|
}
|
|
|
|
|
|
func setupColor() {
|
|
self.loginButton.backgroundColor = AppConstants.themeRedColor
|
|
self.headerTitle.textColor = AppConstants.themeRedColor
|
|
}
|
|
|
|
func showAnimation() {
|
|
setupInitialPositionsOfviews()
|
|
animateViews()
|
|
}
|
|
|
|
private func setupInitialPositionsOfviews() {
|
|
self.userIdBackgroundView.center.x -= self.view.bounds.width
|
|
self.passwordBackgroundView.center.x -= self.view.bounds.width
|
|
self.loginButton.transform = CGAffineTransform.init(scaleX: 0, y: 1)
|
|
self.headerTitle.alpha = 0
|
|
self.headerTitle.center.y -= 200
|
|
self.subtitle.alpha = 0
|
|
self.forgotPasswordView.alpha = 0
|
|
self.logoImageView.center.y += (self.logoImageView.bounds.height + 20)
|
|
self.loginButton.setTitle("", for: UIControlState.normal)
|
|
|
|
}
|
|
|
|
private func animateViews() {
|
|
// user id
|
|
UIView.animate(withDuration: 0.5, animations: {
|
|
self.userIdBackgroundView.center.x += self.view.bounds.width
|
|
})
|
|
|
|
// password
|
|
UIView.animate(withDuration: 0.5, delay: 0.3, options: [], animations: {
|
|
self.passwordBackgroundView.center.x += self.view.bounds.width
|
|
}, completion: nil)
|
|
|
|
// login button
|
|
UIView.animate(withDuration: 0.5, delay: 0.4, options: [], animations: {
|
|
self.loginButton.transform = CGAffineTransform.identity
|
|
}, completion: { (_) in
|
|
self.loginButton.setTitle("Login", for: UIControlState.normal)
|
|
})
|
|
|
|
|
|
// subtitle
|
|
UIView.animate(withDuration: 0.5, delay: 0.7, options: [], animations: {
|
|
self.subtitle.alpha = 1
|
|
}, completion: nil)
|
|
|
|
// forgot password
|
|
UIView.animate(withDuration: 0.5, delay: 0.9, options: [], animations: {
|
|
self.forgotPasswordView.alpha = 1
|
|
})
|
|
|
|
|
|
// header title
|
|
// logoimageview
|
|
UIView.animate(withDuration: 0.7, delay: 0, options: [], animations: {
|
|
// todo
|
|
self.headerTitle.alpha = 1
|
|
self.headerTitle.center.y += 200
|
|
self.logoImageView.center.y -= (self.logoImageView.bounds.height + 20)
|
|
}, completion: nil)
|
|
|
|
}
|
|
|
|
private func setupNavBar() {
|
|
self.setupPicturedNavBar()
|
|
}
|
|
}
|
|
|
|
// MARK: LoginViewInterface
|
|
extension LoginViewController: LoginViewInterface {
|
|
func show(error: String) {
|
|
self.alert(message: error)
|
|
}
|
|
|
|
func showLoading() {
|
|
self.showProgressHud()
|
|
}
|
|
|
|
func hideLoading() {
|
|
self.hideProgressHud()
|
|
}
|
|
}
|
|
|
|
|
|
extension LoginViewController: TransKeyViewDelegate {
|
|
func secureInputFinish(_ type: Int) {
|
|
var targetView : TransKeyView?
|
|
if isShowQwerty == true {
|
|
qwertyCipherString = mQwertyTransKeyView?.mTK_GetSecureData()
|
|
targetView = mQwertyTransKeyView
|
|
self.encryptedPassword = qwertyCipherString
|
|
self.passwordTextField.text = "password"
|
|
}
|
|
|
|
isShowQwerty = false
|
|
isShowNumber = false
|
|
isTranskeyShowing = false
|
|
targetView?.dismiss(animated: true, completion: nil)
|
|
}
|
|
|
|
func showQwertyTranskeyAction(){
|
|
if mQwertyTransKeyView?.isBeingPresented == false {
|
|
isShowQwerty = true
|
|
isTranskeyShowing = true
|
|
|
|
let hintStr = String(format:"password", 0)
|
|
let font = UIFont(name: "Arial", size: 15)
|
|
|
|
mQwertyTransKeyView?.mTK_SetHint(hintStr, font: font)
|
|
mQwertyTransKeyView?.mTK_ShowMessageIfMaxLength("16자리 입력이 초과되었습니다.")
|
|
mQwertyTransKeyView?.mTK_UseCursor(true)
|
|
mQwertyTransKeyView?.mTK_UseAllDeleteButton(true)
|
|
mQwertyTransKeyView?.mTK_UseNavigationBar(true)
|
|
mQwertyTransKeyView?.mTK_UseVoiceOver(true)
|
|
mQwertyTransKeyView?.mTK_setHideInputPasswordDelay(3)
|
|
mQwertyTransKeyView?.mTK_SetControlCenter(false)
|
|
mQwertyTransKeyView?.mTK_setIgnoreStatusbar(false)
|
|
// mQwertyTransKeyView?.mTK_SetLanguage(1)
|
|
mQwertyTransKeyView?.mTK_Supported(byDeviceOrientation: SupportedByDevicePortraitAndLandscape)
|
|
|
|
mQwertyTransKeyView?.setKeyboardType(self,
|
|
keypadType: 0,
|
|
mTK_inputType: 2,
|
|
mTK_inputTitle: "password",
|
|
mTK_cryptType: 0,
|
|
mTK_maxLength: 100,
|
|
mTK_minLength: 0,
|
|
mTK_keypadUpper: false,
|
|
mTK_languageType: 1)
|
|
mQwertyTransKeyView?.mTK_EnableSamekeyInputDataEncrypt(false)
|
|
mQwertyTransKeyView?.mTK_SetUseBalloonImageButton(true)
|
|
if let mQwertyTransKeyView = mQwertyTransKeyView {
|
|
self.present(mQwertyTransKeyView, animated: true, completion: nil)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
extension LoginViewController: UITextFieldDelegate {
|
|
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
|
|
if textField == passwordTextField {
|
|
self.showQwertyTranskeyAction()
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
}
|