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

//
// 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
}
}