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

import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.casic.smarttube.databinding.ActivityLoginBinding
import com.casic.smarttube.utils.AuthenticationHelper
import com.casic.smarttube.utils.LoadingDialogHub
import com.casic.smarttube.utils.LocaleConstant
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

class LoginActivity : KotlinBaseActivity<ActivityLoginBinding>() {

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

    override fun initViewBinding(): ActivityLoginBinding {
        return ActivityLoginBinding.inflate(layoutInflater)
    }

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

    override fun initOnCreate(savedInstanceState: Bundle?) {
        // 设置默认账号密码
        binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
        binding.userPasswordView.setText(
            SaveKeyValues.getValue(
                LocaleConstant.PASSWORD, ""
            ) as String
        )
        authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
        loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
        userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
    }

    override fun observeRequestState() {
        authenticateViewModel.loadState.observe(this) {
            LoadingDialogHub.show(this, "登录中,请稍后")
        }

        loginViewModel.loadState.observe(this) {
            LoadingDialogHub.dismiss()
        }
    }

    override fun initEvent() {
        binding.loginButton.setOnClickListener {
            val account = binding.userNameView.text.toString().trim()
            val userPassword = binding.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 = binding.userNameView.text.toString()
                val userPassword = binding.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()
                    }
                }
            }
        }
    }
}