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

import androidx.lifecycle.ViewModelProvider
import com.casic.smarttube.R
import com.casic.smarttube.utils.*
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 kotlinx.android.synthetic.main.activity_login.*

class LoginActivity : KotlinBaseActivity() {

    private lateinit var authenticateViewModel: AuthenticateViewModel
    private lateinit var loginViewModel: LoginViewModel
    private lateinit var userViewModel: UserViewModel

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

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

    override fun initData() {
        // 设置默认账号密码
        userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
        userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.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() {
        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(LocaleConstant.ACCOUNT, account)
            SaveKeyValues.putValue(LocaleConstant.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, {
                    LoadingDialogHub.dismiss()
                })
            }
        })
        authenticateViewModel.loadState.observe(this, {
            LoadingDialogHub.show(this, "登录中,请稍后")
        })
    }
}