Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,40 +16,21 @@ 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,
),
)
}

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

Role.Admin -> {
activity.startActivity(
Intent(
activity.applicationContext,
Homepage4admin::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)
}
// 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 @@ -58,25 +39,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 @@ -85,7 +64,7 @@ class NavigationService(val activity: Activity) {
fun onLaunchTasks() {
activity.startActivity(
Intent(
activity.applicationContext,
activity,
TasksListActivity::class.java,
),
)
Expand All @@ -94,24 +73,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,29 @@ 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 +179,10 @@ class LoginActivity : BaseActivity() {
return LoginValidationError.InvalidEmail
}

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

return null
}

Expand All @@ -170,13 +200,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