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.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.ActivityStackManager
import com.pengxh.kt.lite.utils.LoadingDialog
import com.pengxh.kt.lite.utils.SaveKeyValues

class LoginActivity : KotlinBaseActivity<ActivityLoginBinding>() {

    private val context = this
    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?) {
        ActivityStackManager.addActivity(this)
        // 设置默认账号密码
        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) {
            LoadingDialog.show(this, "登录中,请稍后")
        }

        loginViewModel.loadState.observe(this) {
            LoadingDialog.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.getPublicKey(this)
        }
        authenticateViewModel.keyData.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!!
                )
                loginViewModel.enter(context, it.data!!.sid!!, account, dataByPublicKey)
                loginViewModel.enterResultData.observe(this) { loginResult ->
                    if (loginResult.code == 200) {
                        AuthenticationHelper.saveToken(loginResult.data!!.token!!)
                        userViewModel.getUserDetail()
                        navigatePageTo<MainActivity>()
                        finish()
                    }
                }
            }
        }
    }
}