Files
SecurityDefenseDevice/app/src/main/java/com/example/defenseapplication/login/LoginActivity.kt
2026-05-12 08:34:05 +08:00

186 lines
7.1 KiB
Kotlin

package com.example.defenseapplication.login
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import com.example.defenseapplication.R
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.example.defenseapplication.databinding.ActivityLoginBinding
import com.gyf.immersionbar.ImmersionBar
//登录
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private var currentLoginMode = LoginMode.SMS
enum class LoginMode { SMS, PASSWORD }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
// 设置渐变背景
val startColor = Color.parseColor("#CBEBFA")
val endColor = Color.parseColor("#FFF2EF")
setGradientBackground(binding.main, startColor, endColor)
ImmersionBar.with(this)
.statusBarDarkFont(true)
.titleBar(binding.logoFrame)
.init()
setupTabListeners()
setupClickListeners()
switchToSmsMode()
}
private fun setupTabListeners() {
binding.tvSmsLogin.setOnClickListener {
if (currentLoginMode != LoginMode.SMS) {
currentLoginMode = LoginMode.SMS
switchToSmsMode()
}
}
binding.tvPwdLogin.setOnClickListener {
if (currentLoginMode != LoginMode.PASSWORD) {
currentLoginMode = LoginMode.PASSWORD
switchToPasswordMode()
}
}
}
private fun switchToSmsMode() {
binding.tvSmsLogin.setTextColor(getColor(R.color.black))
binding.tvPwdLogin.setTextColor(getColor(R.color.gray))
binding.smsRowLayout.visibility = View.VISIBLE
binding.passwordRowLayout.visibility = View.GONE // 隐藏密码行容器
binding.registerText.visibility = View.VISIBLE
binding.forgetText.visibility = View.GONE
updateRegisterTextConstraints(center = true)
//需要正确的方法名和参数
updateLoginButtonTopConstraint(R.id.smsRowLayout)
}
private fun switchToPasswordMode() {
binding.tvPwdLogin.setTextColor(getColor(R.color.black))
binding.tvSmsLogin.setTextColor(getColor(R.color.gray))
binding.smsRowLayout.visibility = View.GONE
//正确的属性访问
binding.passwordRowLayout.visibility = View.VISIBLE // 显示密码行容器
binding.registerText.visibility = View.VISIBLE
binding.forgetText.visibility = View.VISIBLE
updateRegisterTextConstraints(center = false)
updateLoginButtonTopConstraint(R.id.passwordRowLayout)
}
// 动态修改登录按钮的顶部约束
private fun updateLoginButtonTopConstraint(topTargetId: Int) {
val params = binding.loginBtn.layoutParams as ConstraintLayout.LayoutParams
params.topToBottom = topTargetId
params.topMargin = 32
binding.loginBtn.layoutParams = params
}
// 动态修改立即注册的约束(居中/左对齐)
private fun updateRegisterTextConstraints(center: Boolean) {
val params = binding.registerText.layoutParams as ConstraintLayout.LayoutParams
if (center) {
// 短信模式:居中显示
params.startToStart = ConstraintSet.PARENT_ID
params.endToEnd = ConstraintSet.PARENT_ID
} else {
// 密码模式:左对齐登录按钮
params.startToStart = binding.loginBtn.id
params.endToEnd = ConstraintSet.UNSET
}
params.topToBottom = binding.loginBtn.id
params.topMargin = 20
binding.registerText.layoutParams = params
}
private fun setupClickListeners() {
binding.loginBtn.setOnClickListener {
val phone = binding.etPhone.text.toString()
if (phone.isEmpty()) {
Toast.makeText(this, R.string.enter_phone_number, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
when (currentLoginMode) {
LoginMode.SMS -> {
val code = binding.etSmsCode.text.toString()
if (code.isEmpty()) {
Toast.makeText(this, R.string.enter_verification_code_pls, Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, getString(R.string.sms_login_success, phone, code), Toast.LENGTH_SHORT).show()
}
}
LoginMode.PASSWORD -> {
val pwd = binding.etPassword.text.toString()
if (pwd.isEmpty()) {
Toast.makeText(this, R.string.password_hint, Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, getString(R.string.password_login_success, phone, pwd), Toast.LENGTH_SHORT).show()
}
}
}
}
binding.sendCodeBtn.setOnClickListener {
val phone = binding.etPhone.text.toString()
if (phone.isEmpty()) {
Toast.makeText(this, R.string.phone_hint, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
Toast.makeText(this, getString(R.string.code_sent_to, phone), Toast.LENGTH_SHORT).show()
startCountDown()
}
binding.registerText.setOnClickListener {
val intent= Intent(this, RegisterActivity::class.java)
startActivity(intent)
Toast.makeText(this, R.string.redirect_register_page, Toast.LENGTH_SHORT).show()
}
binding.forgetText.setOnClickListener {
val intent= Intent(this, ForgetPasswordActivity::class.java)
startActivity(intent)
Toast.makeText(this, R.string.forgot_password_page, Toast.LENGTH_SHORT).show()
}
}
private fun startCountDown() {
binding.sendCodeBtn.isEnabled = false
object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
}
override fun onFinish() {
binding.sendCodeBtn.text = getString(R.string.send_code)
binding.sendCodeBtn.isEnabled = true
}
}.start()
}
private fun setGradientBackground(
view: android.view.View,
startColor: Int,
endColor: Int,
orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.TL_BR
) {
val gradientDrawable = GradientDrawable(orientation, intArrayOf(startColor, endColor))
gradientDrawable.gradientType = GradientDrawable.LINEAR_GRADIENT
view.background = gradientDrawable
}
}