diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c7c9e1f3..186fd248 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -194,6 +194,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/deakin/gopher/guardian/model/login/RoleName.kt b/app/src/main/java/deakin/gopher/guardian/model/login/RoleName.kt
index 924e33fd..da6e0a9d 100644
--- a/app/src/main/java/deakin/gopher/guardian/model/login/RoleName.kt
+++ b/app/src/main/java/deakin/gopher/guardian/model/login/RoleName.kt
@@ -15,4 +15,13 @@ sealed class RoleName(val name: String) : Serializable {
data object Nurse : RoleName(R.string.nurse_role_name.toString()) {
private fun readResolve(): Any = Nurse
}
+
+ data object Doctor : RoleName(R.string.doctor_role_name.toString()) {
+ private fun readResolve(): Any = Doctor
+ }
+
+
+
+
+
}
diff --git a/app/src/main/java/deakin/gopher/guardian/services/NavigationService.kt b/app/src/main/java/deakin/gopher/guardian/services/NavigationService.kt
index bd22a8ce..0fcf46e8 100644
--- a/app/src/main/java/deakin/gopher/guardian/services/NavigationService.kt
+++ b/app/src/main/java/deakin/gopher/guardian/services/NavigationService.kt
@@ -7,11 +7,13 @@ import deakin.gopher.guardian.view.general.Homepage4admin
import deakin.gopher.guardian.view.general.Homepage4caretaker
import deakin.gopher.guardian.view.general.Homepage4nurse
import deakin.gopher.guardian.view.general.LoginActivity
-import deakin.gopher.guardian.view.general.PinCodeActivity
import deakin.gopher.guardian.view.general.RegisterActivity
import deakin.gopher.guardian.view.general.Setting
import deakin.gopher.guardian.view.general.TaskAddActivity
import deakin.gopher.guardian.view.general.TasksListActivity
+import deakin.gopher.guardian.view.general.DashboardActivity
+import deakin.gopher.guardian.view.general.DoctorPortalActivity
+
class NavigationService(val activity: Activity) {
fun toHomeScreenForRole(roleName: RoleName) {
@@ -33,6 +35,16 @@ class NavigationService(val activity: Activity) {
),
)
}
+ RoleName.Doctor -> {
+ activity.startActivity(
+ Intent(
+ activity.applicationContext,
+ DoctorPortalActivity::class.java,
+ ),
+ )
+ }
+
+
RoleName.Admin -> {
activity.startActivity(
@@ -100,7 +112,8 @@ class NavigationService(val activity: Activity) {
}
fun toPinCodeActivity(roleName: RoleName) {
- val intent = Intent(activity.applicationContext, PinCodeActivity::class.java)
+ val intent = Intent(activity.applicationContext, DashboardActivity::class.java)
+
intent.putExtra("role", roleName)
activity.startActivity(intent)
}
diff --git a/app/src/main/java/deakin/gopher/guardian/util/SecurityUtils.kt b/app/src/main/java/deakin/gopher/guardian/util/SecurityUtils.kt
new file mode 100644
index 00000000..f708d25e
--- /dev/null
+++ b/app/src/main/java/deakin/gopher/guardian/util/SecurityUtils.kt
@@ -0,0 +1,11 @@
+package deakin.gopher.guardian.utils
+
+import java.security.MessageDigest
+
+object SecurityUtils {
+ fun hashPassword(password: String): String {
+ val digest = MessageDigest.getInstance("SHA-256")
+ val bytes = digest.digest(password.toByteArray())
+ return bytes.joinToString("") { "%02x".format(it) }
+ }
+}
diff --git a/app/src/main/java/deakin/gopher/guardian/view/general/DashboardActivity.kt b/app/src/main/java/deakin/gopher/guardian/view/general/DashboardActivity.kt
new file mode 100644
index 00000000..1313c8c0
--- /dev/null
+++ b/app/src/main/java/deakin/gopher/guardian/view/general/DashboardActivity.kt
@@ -0,0 +1,76 @@
+package deakin.gopher.guardian.view.general
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.*
+import androidx.appcompat.app.AppCompatActivity
+import deakin.gopher.guardian.R
+
+// Define the data class for tasks
+data class Task(val id: Int, val name: String, val status: String)
+
+class DashboardActivity : AppCompatActivity() {
+
+ // Sample static tasks list
+ private val tasks = mutableListOf(
+ Task(1, "Check patient vitals", "Pending"),
+ Task(2, "Assist with mobility", "In Progress"),
+ Task(3, "Administer medication", "Completed")
+ )
+
+ // Declare views
+ private lateinit var taskSummary: TextView
+ private lateinit var viewTasksBtn: Button
+ private lateinit var sortSpinner: Spinner
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_dashboard)
+
+ // Initialize views
+ taskSummary = findViewById(R.id.taskSummary)
+ viewTasksBtn = findViewById(R.id.buttonViewTasks)
+ sortSpinner = findViewById(R.id.sortSpinner)
+
+ // Spinner setup
+ val sortOptions = arrayOf("None", "Status", "Task Name")
+ val spinnerAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, sortOptions)
+ spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+ sortSpinner.adapter = spinnerAdapter
+
+ // Spinner change listener
+ sortSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
+ val selected = sortOptions[position]
+ val sortedTasks = when (selected) {
+ "Status" -> tasks.sortedBy { it.status }
+ "Task Name" -> tasks.sortedBy { it.name }
+ else -> tasks
+ }
+
+ updateTaskSummary(sortedTasks)
+ }
+
+ override fun onNothingSelected(parent: AdapterView<*>) {}
+ }
+
+ // Show initial summary
+ updateTaskSummary(tasks)
+
+ // View all tasks button navigation
+ viewTasksBtn.setOnClickListener {
+ startActivity(Intent(this, TasksListActivity::class.java))
+ }
+ }
+
+ // Helper method to update summary
+ private fun updateTaskSummary(sortedTasks: List) {
+ val total = sortedTasks.size
+ val pending = sortedTasks.count { it.status == "Pending" }
+ val inProgress = sortedTasks.count { it.status == "In Progress" }
+ val completed = sortedTasks.count { it.status == "Completed" }
+
+ taskSummary.text = "Total Tasks: $total\nPending: $pending | In Progress: $inProgress | Completed: $completed"
+ }
+}
diff --git a/app/src/main/java/deakin/gopher/guardian/view/general/DoctorPortalActivity.kt b/app/src/main/java/deakin/gopher/guardian/view/general/DoctorPortalActivity.kt
new file mode 100644
index 00000000..5abc1e64
--- /dev/null
+++ b/app/src/main/java/deakin/gopher/guardian/view/general/DoctorPortalActivity.kt
@@ -0,0 +1,16 @@
+package deakin.gopher.guardian.view.general
+
+import android.os.Bundle
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import deakin.gopher.guardian.R
+
+class DoctorPortalActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_doctor_portal)
+
+ val welcomeTextView: TextView = findViewById(R.id.doctorWelcomeText)
+ welcomeTextView.text = "Welcome Doctor!"
+ }
+}
diff --git a/app/src/main/java/deakin/gopher/guardian/view/general/LoginActivity.kt b/app/src/main/java/deakin/gopher/guardian/view/general/LoginActivity.kt
index ee4cecff..3d4d621e 100644
--- a/app/src/main/java/deakin/gopher/guardian/view/general/LoginActivity.kt
+++ b/app/src/main/java/deakin/gopher/guardian/view/general/LoginActivity.kt
@@ -37,6 +37,10 @@ import deakin.gopher.guardian.view.show
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
+import deakin.gopher.guardian.utils.SecurityUtils
+import android.util.Log
+
+
class LoginActivity : BaseActivity() {
private var userRole: RoleName = RoleName.Caretaker
@@ -63,6 +67,7 @@ class LoginActivity : BaseActivity() {
R.id.admin_radioButton -> RoleName.Admin
R.id.caretaker_radioButton -> RoleName.Caretaker
R.id.nurse_radioButton -> RoleName.Nurse
+ R.id.doctor_radioButton -> RoleName.Doctor
else -> RoleName.Caretaker
}
}
@@ -77,6 +82,9 @@ class LoginActivity : BaseActivity() {
progressBar.show()
val emailInput = mEmail.text.toString().trim { it <= ' ' }
val passwordInput = mPassword.text.toString().trim { it <= ' ' }
+ val hashedPasswordInput = SecurityUtils.hashPassword(passwordInput)
+ Log.d("HashedPassword", "Hashed value: $hashedPasswordInput")
+
val loginValidationError = validateInputs(emailInput)
@@ -90,7 +98,8 @@ class LoginActivity : BaseActivity() {
return@setOnClickListener
}
- val call = ApiClient.apiService.login(emailInput, passwordInput)
+ val call = ApiClient.apiService.login(emailInput, hashedPasswordInput)
+
call.enqueue(
object : Callback {
@@ -104,7 +113,8 @@ class LoginActivity : BaseActivity() {
val user = response.body()!!.user
val token = response.body()!!.token
SessionManager.createLoginSession(user, token)
- NavigationService(this@LoginActivity).toPinCodeActivity(userRole)
+ NavigationService(this@LoginActivity).toHomeScreenForRole(userRole)
+
} else {
// Handle error
val errorResponse =
diff --git a/app/src/main/java/deakin/gopher/guardian/view/general/PinCodeActivity.kt b/app/src/main/java/deakin/gopher/guardian/view/general/PinCodeActivity.kt
deleted file mode 100644
index 896219e0..00000000
--- a/app/src/main/java/deakin/gopher/guardian/view/general/PinCodeActivity.kt
+++ /dev/null
@@ -1,174 +0,0 @@
-package deakin.gopher.guardian.view.general
-
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.View
-import android.widget.Button
-import android.widget.EditText
-import android.widget.ProgressBar
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.widget.LinearLayoutCompat
-import com.google.gson.Gson
-import deakin.gopher.guardian.R
-import deakin.gopher.guardian.model.ApiErrorResponse
-import deakin.gopher.guardian.model.BaseModel
-import deakin.gopher.guardian.model.login.RoleName
-import deakin.gopher.guardian.model.login.SessionManager
-import deakin.gopher.guardian.services.NavigationService
-import deakin.gopher.guardian.services.api.ApiClient
-import deakin.gopher.guardian.view.hide
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-
-class PinCodeActivity : AppCompatActivity() {
- private lateinit var userRole: RoleName
- private val userEmail = SessionManager.getCurrentUser().email
-
- private lateinit var progressBar: ProgressBar
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.login_enter_pin)
- userRole = intent.getSerializableExtra("role") as RoleName
-
- val pinDigit1 = findViewById(R.id.pin_digit_1)
- val pinDigit2 = findViewById(R.id.pin_digit_2)
- val pinDigit3 = findViewById(R.id.pin_digit_3)
- val pinDigit4 = findViewById(R.id.pin_digit_4)
- val pinDigit5 = findViewById(R.id.pin_digit_5)
- val pinDigit6 = findViewById(R.id.pin_digit_6)
- val submitButton = findViewById