Untitled

 avatar
unknown
plain_text
a month ago
11 kB
4
Indexable
package com.example.safety.activity

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import com.example.safety.api.RetrofitInstance
import com.example.safety.common.Constants
import com.example.safety.common.SharedPrefFile
import com.example.safety.databinding.ActivityLoginUserBinding
import com.example.safety.models.APIResponseModel
import com.example.safety.models.ForgotPasswordRequest
import com.example.safety.models.LoginInfoModel
import com.example.safety.models.VerifiedUserModel
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

/**
 * LoginUserActivity
 *
 * This activity handles user login functionality.
 * It provides UI for users to enter their credentials and authenticate themselves.
 */
class LoginUserActivity : AppCompatActivity() {

    private val TAG = "LoginUserActivity" // Tag for logging

    private lateinit var binding: ActivityLoginUserBinding // View binding for activity layout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Initialize Retrofit instance for network calls
        val retrofit = RetrofitInstance.initialize()

        // Initialize shared preferences for storing user data
        val sharedpref = SharedPrefFile
        sharedpref.init(this)

        // Set up view binding for activity layout
        binding = ActivityLoginUserBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Handle back button press to finish activity
        val callback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                finish()
            }
        }
        this.onBackPressedDispatcher.addCallback(this, callback)

        // Navigate to registration screen when 'New User? Register' is clicked
        binding.tVNewUserRegister.setOnClickListener {
            val intent = Intent(this, RegisterUserActivity::class.java)
            startActivity(intent)
        }

        binding.apply {
            forgetPassword.setOnClickListener {
                forgotPasswordLL.isVisible = true
                loginLL.isVisible = false
            }
            cancelBtnFP.setOnClickListener {
                forgotPasswordLL.isVisible = false
                loginLL.isVisible = true
            }
        }

        // Handle login button click
        binding.loginBtn.setOnClickListener {
            val email = binding.tilemailLogin.editText?.text.toString()
            val password = binding.tilpasswordLogin.editText?.text.toString()

            // Check if email or password fields are empty
            if (email.isEmpty() || password.isEmpty()) {
                Toast.makeText(this, "Enter email and password", Toast.LENGTH_SHORT).show()
            } else {
                // Show progress bar before navigating to main screen
                binding.progressBar.visibility = View.VISIBLE
                binding.mainContent.visibility = View.GONE
                // Make API call to verify user credentials
                retrofit.verifyUser(LoginInfoModel(email, password))
                    .enqueue(object : Callback<VerifiedUserModel> {
                        override fun onResponse(
                            call: Call<VerifiedUserModel>,
                            response: Response<VerifiedUserModel>,
                        ) {
                            Log.d("Rupam $TAG", "Response: ${response.body()?.userData}")


                            try {
                                if (response.isSuccessful) {  //  Handles 200-299
                                    // Successful login
                                    sharedpref.putLoggedInfo(Constants.SP_LOGGED_INFO, true)
                                    sharedpref.putUserData(
                                        Constants.SP_USERDATA,
                                        response.body()!!.userData
                                    )

                                    startActivity(Intent(baseContext, MainActivity::class.java))

                                } else {  // Handles 400, 404, 500
                                    val errorMessage = JSONObject(
                                        response.errorBody()?.string().toString()
                                    ).getString("status") ?: "Unknown error"
                                    Toast.makeText(baseContext, errorMessage, Toast.LENGTH_SHORT)
                                        .show()
                                    Log.e("${Constants.TAG} Login User",errorMessage)
                                }
                            } catch (e: Exception) {
                                Log.e(
                                    "${Constants.TAG} ProfileFragment",
                                    "Error processing response: ${e.message}"
                                )
                                Toast.makeText(
                                    baseContext,
                                    "Something went wrong!",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                        }

                        override fun onFailure(call: Call<VerifiedUserModel>, t: Throwable) {
                            Log.e(
                                "Rupam $TAG",
                                "Response: ${t.message}"
                            ) // Log error on API failure
                        }
                    })
            }

            binding.progressBar.postDelayed({
                binding.progressBar.visibility = View.GONE
                binding.mainContent.visibility = View.VISIBLE
            }, 3000)
        }

        binding.apply {
            resetPasswordBtnFP.setOnClickListener {
                val emailOrPhone = emailOrPhoneFP.editText?.text.toString()
                val securityPIN = securityPINFP.editText?.text.toString()
                val newPassword = newPasswordFP.editText?.text.toString()

                if (emailOrPhone.isBlank() || securityPIN.isBlank() || newPassword.isBlank()) {
                    Toast.makeText(baseContext, "Enter all the details", Toast.LENGTH_SHORT).show()
                } else {
                    val forgotPassword = ForgotPasswordRequest(
                        emailOrPhone = emailOrPhone,
                        securityPIN = securityPIN,
                        newPassword = newPassword
                    )

                    retrofit.forgotPassword(forgotPassword)
                        .enqueue(object : Callback<APIResponseModel> {
                            override fun onResponse(
                                call: Call<APIResponseModel>,
                                response: Response<APIResponseModel>,
                            ) {
                                Log.d("${Constants.TAG} ForgotPassword ", " ${response}")

                                when (response.code()) {
                                    200 -> {
                                        Toast.makeText(
                                            baseContext,
                                            "Password reset successful",
                                            Toast.LENGTH_SHORT
                                        ).show()
                                        finish()
                                        startActivity(
                                            Intent(
                                                baseContext,
                                                LoginUserActivity::class.java
                                            )
                                        )
                                    }

                                    404 -> {
                                        Toast.makeText(
                                            baseContext,
                                            "User not found",
                                            Toast.LENGTH_SHORT
                                        ).show()
                                        finish()
                                        startActivity(
                                            Intent(
                                                baseContext,
                                                LoginUserActivity::class.java
                                            )
                                        )
                                    }

                                    401 -> {
                                        Toast.makeText(
                                            baseContext,
                                            "Invalid Email or PIN",
                                            Toast.LENGTH_SHORT
                                        ).show()
                                        finish()
                                        startActivity(
                                            Intent(
                                                baseContext,
                                                LoginUserActivity::class.java
                                            )
                                        )
                                    }

                                    else -> {
                                        Toast.makeText(
                                            baseContext,
                                            "Error in response",
                                            Toast.LENGTH_SHORT
                                        ).show()
                                    }
                                }

                            }

                            override fun onFailure(call: Call<APIResponseModel>, t: Throwable) {
                                Log.d(
                                    "${Constants.TAG} ForgotPassword ",
                                    "API Call Failed: ${t.message}"
                                )

                            }
                        })
                }
            }
        }

    }
}
Editor is loading...
Leave a Comment