Untitled

 avatar
unknown
plain_text
a year ago
11 kB
12
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