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() } } }) } }) } }