Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -17,49 +17,23 @@ import deakin.gopher.guardian.view.general.TasksListActivity

class NavigationService(val activity: Activity) {
fun toHomeScreenForRole(role: Role) {
when (role) {
Role.Caretaker -> {
activity.startActivity(
Intent(
activity.applicationContext,
Homepage4caretaker::class.java,
),
)
val intent =
when (role) {
Role.Caretaker -> Intent(activity, Homepage4caretaker::class.java)
Role.Nurse -> Intent(activity, Homepage4nurse::class.java)
Role.Admin -> Intent(activity, Homepage4admin::class.java)
Role.Doctor -> Intent(activity, Homepage4doctor::class.java)
}

Role.Nurse -> {
activity.startActivity(
Intent(
activity.applicationContext,
Homepage4nurse::class.java,
),
)
}

Role.Admin -> {
activity.startActivity(
Intent(
activity.applicationContext,
Homepage4admin::class.java,
),
)
}

Role.Doctor -> {
activity.startActivity(
Intent(
activity.applicationContext,
Homepage4doctor::class.java,
),
)
}
}
// Clear back stack so user cannot go back to Login/PIN screens
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
activity.startActivity(intent)
activity.finish()
}

fun toRegistration() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
RegisterActivity::class.java,
),
)
Expand All @@ -68,25 +42,23 @@ class NavigationService(val activity: Activity) {
fun onSettings() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
Setting::class.java,
),
)
}

fun onSignOut() {
activity.startActivity(
Intent(
activity.applicationContext,
LoginActivity::class.java,
),
)
val intent = Intent(activity, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
activity.startActivity(intent)
activity.finish()
}

fun onLaunchPatientList() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
PatientListActivity::class.java,
),
)
Expand All @@ -95,7 +67,7 @@ class NavigationService(val activity: Activity) {
fun onLaunchTasks() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
TasksListActivity::class.java,
),
)
Expand All @@ -104,24 +76,26 @@ class NavigationService(val activity: Activity) {
fun onLaunchTaskCreator() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
TaskAddActivity::class.java,
),
)
}

fun toLogin() {
activity.startActivity(
Intent(
activity.applicationContext,
LoginActivity::class.java,
),
)
val intent = Intent(activity, LoginActivity::class.java)
// If coming from Registration, we want to clear the Registration screen from stack
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
activity.startActivity(intent)
activity.finish()
}

fun toPinCodeActivity(role: Role) {
val intent = Intent(activity.applicationContext, PinCodeActivity::class.java)
val intent = Intent(activity, PinCodeActivity::class.java)
intent.putExtra("role", role)
activity.startActivity(intent)
// We keep LoginActivity in the stack in case user wants to go back from PIN screen?
// Actually, usually you'd want to finish() it too if PIN is mandatory.
// If we want the back button on PIN screen to go back to Login, we don't finish() here.
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import android.widget.ProgressBar
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.widget.addTextChangedListener
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.SignInButton
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.tasks.Task
import com.google.android.material.textfield.TextInputLayout
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.GoogleAuthProvider
import com.google.gson.Gson
Expand Down Expand Up @@ -44,6 +46,8 @@ class LoginActivity : BaseActivity() {
setContentView(R.layout.activity_login)
val mEmail: EditText = findViewById(R.id.Email)
val mPassword: EditText = findViewById(R.id.password)
val emailLayout: TextInputLayout = findViewById(R.id.emailTextInputLayout)
val passwordLayout: TextInputLayout = findViewById(R.id.passwordTextInputLayout)
val progressBar: ProgressBar = findViewById(R.id.progressBar)
val loginButton: Button = findViewById(R.id.loginBtn)
val loginGoogleButton: SignInButton = findViewById(R.id.loginGoogleBtn)
Expand All @@ -56,23 +60,30 @@ class LoginActivity : BaseActivity() {
.build()
gsoClient = GoogleSignIn.getClient(this, gso)

mEmail.addTextChangedListener { emailLayout.error = null }
mPassword.addTextChangedListener { passwordLayout.error = null }

loginButton.setOnClickListener {
progressBar.show()
val emailInput = mEmail.text.toString().trim { it <= ' ' }
val passwordInput = mPassword.text.toString().trim { it <= ' ' }

val loginValidationError = validateInputs(emailInput)
val loginValidationError = validateInputs(emailInput, passwordInput)

if (loginValidationError != null) {
progressBar.hide()
Toast.makeText(
applicationContext,
loginValidationError.messageResoureId,
Toast.LENGTH_LONG,
).show()
when (loginValidationError) {
LoginValidationError.EmptyEmail, LoginValidationError.InvalidEmail -> {
emailLayout.error = getString(loginValidationError.messageResoureId)
}
LoginValidationError.EmptyPassword -> {
passwordLayout.error = getString(loginValidationError.messageResoureId)
}
else -> showMessage(getString(loginValidationError.messageResoureId))
}
return@setOnClickListener
}

setLoading(true, loginButton, progressBar)

val call = ApiClient.apiService.login(emailInput, passwordInput)

call.enqueue(
Expand All @@ -81,31 +92,24 @@ class LoginActivity : BaseActivity() {
call: Call<AuthResponse>,
response: Response<AuthResponse>,
) {
progressBar.hide()
setLoading(false, loginButton, progressBar)
if (response.isSuccessful && response.body() != null) {
// Handle successful login
val user = response.body()!!.user
val token = response.body()!!.token
SessionManager.createLoginSession(user, token)
NavigationService(this@LoginActivity).toPinCodeActivity(user.role)
} else {
// Handle error
val errorResponse =
Gson().fromJson(
response.errorBody()?.string(),
ApiErrorResponse::class.java,
)
showMessage(errorResponse.apiError ?: response.message())
val errorResponse = parseError(response)
showMessage(errorResponse ?: response.message())
}
}

override fun onFailure(
call: Call<AuthResponse>,
t: Throwable,
) {
// Handle failure
progressBar.hide()
showMessage(getString(R.string.toast_login_error, t.message))
setLoading(false, loginButton, progressBar)
showMessage(getString(R.string.toast_login_error, t.localizedMessage))
}
},
)
Expand Down Expand Up @@ -143,7 +147,37 @@ class LoginActivity : BaseActivity() {
}
}

private fun validateInputs(rawEmail: String?): LoginValidationError? {
private fun setLoading(
isLoading: Boolean,
button: Button,
progressBar: ProgressBar,
) {
if (isLoading) {
button.isEnabled = false
progressBar.show()
} else {
button.isEnabled = true
progressBar.hide()
}
}

private fun parseError(response: Response<*>): String? {
return try {
val errorResponse =
Gson().fromJson(
response.errorBody()?.string(),
ApiErrorResponse::class.java,
)
errorResponse.apiError
} catch (e: Exception) {
null
}
}

private fun validateInputs(
rawEmail: String?,
rawPassword: String?,
): LoginValidationError? {
if (rawEmail.isNullOrEmpty()) {
return LoginValidationError.EmptyEmail
}
Expand All @@ -153,6 +187,10 @@ class LoginActivity : BaseActivity() {
return LoginValidationError.InvalidEmail
}

if (rawPassword.isNullOrEmpty()) {
return LoginValidationError.EmptyPassword
}

return null
}

Expand All @@ -170,13 +208,8 @@ class LoginActivity : BaseActivity() {
?: getString(R.string.toast_reset_link_sent_to_your_email),
)
} else {
// Handle error
val errorResponse =
Gson().fromJson(
response.errorBody()?.string(),
ApiErrorResponse::class.java,
)
showMessage(errorResponse.apiError ?: response.message())
val errorResponse = parseError(response)
showMessage(errorResponse ?: response.message())
}
}

Expand Down
Loading
Loading