Home > Mobile >  LogIn (with multiple userlvls) problems in android studio
LogIn (with multiple userlvls) problems in android studio

Time:11-30

I am developing an application.For some context it's about food stuff and i want to build like 3 types of users that are "users" "restaurateur" and "admin".I'm having trouble in login class cause i want to start differents avtivity based on their userlvl

Here is my login class

package com.example.progettoprogrammazione.activity

import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.progettoprogrammazione.databinding.ActivityLoginBinding
import com.example.progettoprogrammazione.models.User
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener


class LoginActivity : AppCompatActivity() {

private lateinit var binding: ActivityLoginBinding
private lateinit var firebaseAuth: FirebaseAuth
private lateinit var firebaseDatabase: FirebaseDatabase
private lateinit var user_lvl: String

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

    binding = ActivityLoginBinding.inflate(layoutInflater)
    setContentView(binding.root)

    firebaseAuth = FirebaseAuth.getInstance()

    binding.ConstraintEntra.setOnClickListener() {
        val Email = binding.email.text.toString()
        val Password = binding.password.text.toString()


        //SI PUO SCRIVERE MEGLIO L'IF TIPO ELIMINANDO I RAMI RIGA 46 CONTROLLI SE USER è LVL 1
        if (Email.isNotEmpty() && Password.isNotEmpty()) {
            firebaseAuth.signInWithEmailAndPassword(Email, Password).addOnCompleteListener {
                if (it.isSuccessful) {

                    getUserData(object : FireBaseCallback {
                        override fun onResponse(response: Response) {
                            user_lvl = response.user!!.Livello
                        }
                    })

                    Toast.makeText(this, "Login effettuato con successo!", Toast.LENGTH_LONG)
                        .show()
                    if (user_lvl.equals("1")) {
                        val intent = Intent(this, MainActivity::class.java)
                        startActivity(intent)
                    } else if (user_lvl.equals("2")) {
                        val intent = Intent(this, EmployeeActivity::class.java)
                        startActivity(intent)
                    } else if (user_lvl.equals("3")) {
                        val intent = Intent(this, RestaurateurActivity::class.java)
                        startActivity(intent)
                    } else {
                        Toast.makeText(
                            this,
                            "Email e password non corrispondono!",
                            Toast.LENGTH_LONG
                        ).show()
                    }
                }
            }
        } else {
            Toast.makeText(this, "Nessun campo può essere vuoto!", Toast.LENGTH_LONG).show()
        }
    }

    binding.noaccount.setOnClickListener() {
        val intent = Intent(this, RegisterActivity::class.java)
        startActivity(intent)
    }

}

override fun onStart() {
    super.onStart()

    if (firebaseAuth.currentUser != null) {
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
    }
}

//PRENDIAMO I DATI DEGLI USER
private interface FireBaseCallback {
    fun onResponse(response: Response)
}

data class Response(
    var user: User? = null
)

private fun getUserData(callBack: FireBaseCallback) {
    firebaseAuth = FirebaseAuth.getInstance()
    firebaseDatabase = FirebaseDatabase.getInstance()

    firebaseDatabase.getReference("Utenti").child(firebaseAuth.currentUser!!.uid)
        .addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val response = Response()
                response.user = User(
                    snapshot.child("Nome").value.toString(),
                    snapshot.child("Cognome").value.toString(),
                    snapshot.child("Email").value.toString(),
                    snapshot.child("Password").value.toString(),
                    snapshot.child("Telefono").value.toString(),
                    snapshot.child("Uri").value.toString(),
                    snapshot.child("Livello").value.toString()
                )
                callBack.onResponse(response)
            }

            override fun onCancelled(error: DatabaseError) {
                Toast.makeText(
                    this@LoginActivity,
                    "Errore durante il caricamento dei dati",
                    Toast.LENGTH_LONG
                ).show()
            }
        })
}
}

Basically when they get logged in I'm trying to start different activities based on userlvl. But I'm not understanding ,even with debbugging ,what values my variable user_lvl has. After the toast my variable is null and i don't get why. Can you guys help me? Also if i fix this could you try to make me think of a way of writing this code in a better way cause i think it's a bit messy this way.

CodePudding user response:

You must write in onResponse code block your codes. Like this;

 getUserData(object : FireBaseCallback {
                override fun onResponse(response: Response) {
                    user_lvl = response.user!!.Livello
 Toast.makeText(this, "Login effettuato con successo!", Toast.LENGTH_LONG)
                .show()
            if (user_lvl.equals("1")) {
                val intent = Intent(this, MainActivity::class.java)
                startActivity(intent)
            } else if (user_lvl.equals("2")) {
                val intent = Intent(this, EmployeeActivity::class.java)
                startActivity(intent)
            } else if (user_lvl.equals("3")) {
                val intent = Intent(this, RestaurateurActivity::class.java)
                startActivity(intent)
            } else {
                Toast.makeText(
                    this,
                    "Email e password non corrispondono!",
                    Toast.LENGTH_LONG
                ).show()
            }
            })
  • Related