Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / view / LoginActivity.kt
package com.casic.smarttube.view

import android.text.Editable
import android.text.TextWatcher
import android.view.KeyEvent
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
import com.casic.smarttube.R
import com.casic.smarttube.utils.AuthenticationHelper
import com.casic.smarttube.utils.DialogHelper
import com.casic.smarttube.utils.LocalConstant
import com.casic.smarttube.utils.RSAUtils
import com.casic.smarttube.vm.AuthenticateViewModel
import com.casic.smarttube.vm.LoginViewModel
import com.casic.smarttube.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*

class LoginActivity : KotlinBaseActivity() {

    private lateinit var authenticateViewModel: AuthenticateViewModel
    private lateinit var loginViewModel: LoginViewModel
    private lateinit var userViewModel: UserViewModel
    private val textWatcher = object : TextWatcher {
        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {

        }

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {

        }

        override fun afterTextChanged(s: Editable) {
            if (s.toString().trim { it <= ' ' }.length > 16) {
                inputLayout.error = "密码长度超出限制"
            } else {
                inputLayout.error = null
            }
        }
    }

    override fun initLayoutView(): Int = R.layout.activity_login

    override fun setupTopBarLayout() {
        ImmersionBar.with(this).statusBarDarkFont(true).init()
    }

    override fun initData() {
        // 设置默认账号密码
        userNameView.setText(SaveKeyValues.getValue(LocalConstant.ACCOUNT, "") as String)
        userPasswordView.setText(SaveKeyValues.getValue(LocalConstant.PASSWORD, "") as String)
        authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java)
        loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java)
        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    }

    override fun initEvent() {
        val editText: EditText? = inputLayout.editText
        editText?.addTextChangedListener(textWatcher)
        //点击输入法键盘"完成"
        editText?.setOnEditorActionListener { _: TextView?, actionId: Int, _: KeyEvent? ->
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                authenticateViewModel.obtainPublicKey()
                return@setOnEditorActionListener true
            }
            false
        }

        loginButton.setOnClickListener {
            val account = userNameView.text.toString().trim()
            val userPassword = userPasswordView.text.toString().trim()
            if (account.isBlank()) {
                "用户名不能为空".show(this)
                return@setOnClickListener
            }
            if (userPassword.isBlank()) {
                "密码不能为空".show(this)
                return@setOnClickListener
            }
            SaveKeyValues.putValue(LocalConstant.ACCOUNT, account)
            SaveKeyValues.putValue(LocalConstant.PASSWORD, userPassword)
            authenticateViewModel.obtainPublicKey()
        }
        authenticateViewModel.keyModel.observe(this, {
            if (it.code == 200) {//用code判断,别的判断可能有坑
                val keyString = it.data!!.publicKey!!
                /**
                 * 修改密码需要用到key,先存着
                 * */
                AuthenticationHelper.savePublicKey(keyString)
                val publicKey = RSAUtils.keyStrToPublicKey(keyString)

                val account = userNameView.text.toString()
                val userPassword = userPasswordView.text.toString()
                val dataByPublicKey =
                    RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
                //登录并获取Token,POST请求
                loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
                loginViewModel.enterResultModel.observe(this, { loginResult ->
                    if (loginResult.code == 200) {
                        AuthenticationHelper.saveToken(loginResult.data!!.token!!)
                        /**
                         * 获取token之后保存用户信息
                         * */
                        userViewModel.obtainUserDetail()
                        //验证成功登录
                        this.navigatePageTo<MainActivity>()
                        finish()
                    }
                })
                loginViewModel.loadState.observe(this, { loginState ->
                    when (loginState) {
                        is LoadState.Loading -> {
                            DialogHelper.showLoadingDialog(this, "登录中,请稍后")
                        }
                        else -> {
                            DialogHelper.dismissLoadingDialog()
                        }
                    }
                })
            }
        })
    }
}