From 7f85fd4887bb9a9fe620f56a401bacbef177e689 Mon Sep 17 00:00:00 2001 From: JI RONG LING Date: Tue, 10 Dec 2024 00:39:40 +1100 Subject: [PATCH 01/12] first commit --- app/src/main/java/communication/Message.kt | 51 +++++++++++++++++++ .../adapter/CarePlanProgressAdapter.kt | 4 ++ .../gopher/guardian/adapter/MessageAdapter.kt | 35 +++++++++++++ .../adapter/PatientOverviewActivity.kt | 4 ++ .../guardian/adapter/TaskHistoryAdapter.kt | 4 ++ .../patient/CarePlanProgressFragment.kt | 4 ++ .../patient/TaskHistoryFragment.kt | 4 ++ .../res/layout/activity_patient_overview.xml | 7 +++ .../layout/fragment_care_plan_progress.xml | 7 +++ .../main/res/layout/fragment_task_history.xml | 7 +++ .../res/layout/item_care_plan_progress.xml | 7 +++ app/src/main/res/layout/item_message.xml | 7 +++ app/src/main/res/layout/item_task_history.xml | 7 +++ 13 files changed, 148 insertions(+) create mode 100644 app/src/main/java/communication/Message.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/adapter/CarePlanProgressAdapter.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/adapter/MessageAdapter.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/CarePlanProgressFragment.kt create mode 100644 app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/TaskHistoryFragment.kt create mode 100644 app/src/main/res/layout/activity_patient_overview.xml create mode 100644 app/src/main/res/layout/fragment_care_plan_progress.xml create mode 100644 app/src/main/res/layout/fragment_task_history.xml create mode 100644 app/src/main/res/layout/item_care_plan_progress.xml create mode 100644 app/src/main/res/layout/item_message.xml create mode 100644 app/src/main/res/layout/item_task_history.xml diff --git a/app/src/main/java/communication/Message.kt b/app/src/main/java/communication/Message.kt new file mode 100644 index 00000000..d487ee25 --- /dev/null +++ b/app/src/main/java/communication/Message.kt @@ -0,0 +1,51 @@ +package deakin.gopher.guardian.communication; + +import java.util.Date; + +public class Message { + private String senderId; + private String receiverId; + private String messageContent; + private Date timestamp; + + // Constructor + public Message(String senderId, String receiverId, String messageContent, Date timestamp) { + this.senderId = senderId; + this.receiverId = receiverId; + this.messageContent = messageContent; + this.timestamp = timestamp; + } + + // Getters and Setters + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + public String getReceiverId() { + return receiverId; + } + + public void setReceiverId(String receiverId) { + this.receiverId = receiverId; + } + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public Date getTimestamp() { + return timestamp; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } +} diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/CarePlanProgressAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/CarePlanProgressAdapter.kt new file mode 100644 index 00000000..00e688f4 --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/adapter/CarePlanProgressAdapter.kt @@ -0,0 +1,4 @@ +package deakin.gopher.guardian.adapter + +class CarePlanProgressAdapter { +} \ No newline at end of file diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/MessageAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/MessageAdapter.kt new file mode 100644 index 00000000..762d3f64 --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/adapter/MessageAdapter.kt @@ -0,0 +1,35 @@ +package deakin.gopher.guardian.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import deakin.gopher.guardian.R +import deakin.gopher.guardian.communication.Message +import java.text.SimpleDateFormat +import java.util.Locale + +class MessageAdapter(private val messageList: List) : RecyclerView.Adapter() { + +override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_message, parent, false) + return MessageViewHolder(view) +} + +override fun onBindViewHolder(holder: MessageViewHolder, position: Int) { + val message = messageList[position] + holder.textViewMessage.text = message.messageContent + val sdf = SimpleDateFormat("hh:mm a", Locale.getDefault()) + holder.textViewTimestamp.text = sdf.format(message.timestamp) +} + +override fun getItemCount(): Int { + return messageList.size +} + +class MessageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val textViewMessage: TextView = itemView.findViewById(R.id.textViewMessage) + val textViewTimestamp: TextView = itemView.findViewById(R.id.textViewTimestamp) +} +} diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt b/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt new file mode 100644 index 00000000..da05c079 --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt @@ -0,0 +1,4 @@ +package deakin.gopher.guardian.adapter + +class PatientOverviewActivity { +} \ No newline at end of file diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt new file mode 100644 index 00000000..f284f262 --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt @@ -0,0 +1,4 @@ +package deakin.gopher.guardian.adapter + +class TaskHistoryAdapter { +} \ No newline at end of file diff --git a/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/CarePlanProgressFragment.kt b/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/CarePlanProgressFragment.kt new file mode 100644 index 00000000..5a7f8060 --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/CarePlanProgressFragment.kt @@ -0,0 +1,4 @@ +package deakin.gopher.guardian.view.patient.patientdata.patient + +class CarePlanProgressFragment { +} \ No newline at end of file diff --git a/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/TaskHistoryFragment.kt b/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/TaskHistoryFragment.kt new file mode 100644 index 00000000..9767b4ec --- /dev/null +++ b/app/src/main/java/deakin/gopher/guardian/view/patient/patientdata/patient/TaskHistoryFragment.kt @@ -0,0 +1,4 @@ +package deakin.gopher.guardian.view.patient.patientdata.patient + +class TaskHistoryFragment { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_patient_overview.xml b/app/src/main/res/layout/activity_patient_overview.xml new file mode 100644 index 00000000..d829e291 --- /dev/null +++ b/app/src/main/res/layout/activity_patient_overview.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_care_plan_progress.xml b/app/src/main/res/layout/fragment_care_plan_progress.xml new file mode 100644 index 00000000..4c64172f --- /dev/null +++ b/app/src/main/res/layout/fragment_care_plan_progress.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_history.xml b/app/src/main/res/layout/fragment_task_history.xml new file mode 100644 index 00000000..d829e291 --- /dev/null +++ b/app/src/main/res/layout/fragment_task_history.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_care_plan_progress.xml b/app/src/main/res/layout/item_care_plan_progress.xml new file mode 100644 index 00000000..4c64172f --- /dev/null +++ b/app/src/main/res/layout/item_care_plan_progress.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml new file mode 100644 index 00000000..d829e291 --- /dev/null +++ b/app/src/main/res/layout/item_message.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_task_history.xml b/app/src/main/res/layout/item_task_history.xml new file mode 100644 index 00000000..4c64172f --- /dev/null +++ b/app/src/main/res/layout/item_task_history.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file From c7710b11918bb59766232223067fc789173f73a7 Mon Sep 17 00:00:00 2001 From: JI RONG LING Date: Tue, 10 Dec 2024 01:17:09 +1100 Subject: [PATCH 02/12] Implement messaging system: added message model, adapter, and UI components --- .vs/Guardian/v17/.wsuo | Bin 0 -> 11264 bytes .vs/Guardian/v17/DocumentLayout.json | 12 +++ .vs/Guardian/v17/workspaceFileList.bin | Bin 0 -> 70787 bytes .vs/VSWorkspaceState.json | 6 ++ .vs/slnx.sqlite | Bin 0 -> 163840 bytes app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 1 + app/src/main/java/communication/Message.kt | 56 ++--------- .../adapter/CarePlanProgressAdapter.kt | 30 +++++- .../guardian/adapter/PatientListAdapter.kt | 11 +- .../adapter/PatientOverviewActivity.kt | 82 ++++++++++++++- .../guardian/adapter/PatientProfileAdapter.kt | 4 +- .../guardian/adapter/TaskHistoryAdapter.kt | 31 +++++- .../deakin/gopher/guardian/model/Patient.kt | 8 ++ .../guardian/view/general/MainActivity.kt | 95 ++++++++++++++++-- .../patient/CarePlanProgressFragment.kt | 49 ++++++++- .../patient/TaskHistoryFragment.kt | 49 ++++++++- app/src/main/res/layout/activity_main.xml | 92 ++++++++++------- .../res/layout/activity_patient_overview.xml | 30 +++++- .../layout/fragment_care_plan_progress.xml | 12 ++- .../main/res/layout/fragment_task_history.xml | 10 +- .../res/layout/item_care_plan_progress.xml | 15 ++- app/src/main/res/layout/item_message.xml | 20 +++- app/src/main/res/layout/item_task_history.xml | 15 ++- app/src/main/res/values/colors.xml | 3 + gradle/wrapper/gradle-wrapper.properties | 2 + 26 files changed, 503 insertions(+), 138 deletions(-) create mode 100644 .vs/Guardian/v17/.wsuo create mode 100644 .vs/Guardian/v17/DocumentLayout.json create mode 100644 .vs/Guardian/v17/workspaceFileList.bin create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/Guardian/v17/.wsuo b/.vs/Guardian/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..da4e51d0ed541fc34c1d155b2437d05a01f6018e GIT binary patch literal 11264 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

<-F-i`#D1?r2iy+g6GaFO5;+ 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

b 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 TgN-(?(WPVfw8ka6^7a1*ZUMD| literal 0 HcmV?d00001 diff --git a/app/build.gradle b/app/build.gradle index c04565ca..563f508a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,6 +81,8 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.firebase:firebase-database:21.0.0' + // Add this line to include graphview for charting + implementation 'com.jjoe64.graphview:core:4.2.2' implementation 'com.github.bumptech.glide:glide:4.13.2' implementation 'de.hdodenhof:circleimageview:3.1.0' @@ -94,12 +96,9 @@ dependencies { implementation 'androidx.navigation:navigation-ui:2.7.7' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' - implementation 'com.google.firebase:firebase-storage:21.0.0' - implementation 'com.google.firebase:firebase-auth:23.0.0' implementation 'com.google.firebase:firebase-firestore:25.0.0' - implementation 'com.google.firebase:firebase-messaging:24.0.0' implementation 'com.google.firebase:firebase-firestore-ktx:25.0.0' implementation 'com.google.android.gms:play-services-auth:21.2.0' @@ -113,7 +112,6 @@ dependencies { implementation platform('androidx.compose:compose-bom:2024.08.00') implementation platform('androidx.compose:compose-bom:2024.08.00') - testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' @@ -131,11 +129,11 @@ dependencies { implementation "androidx.camera:camera-camera2:1.3.4" implementation "androidx.camera:camera-lifecycle:1.3.4" implementation "androidx.camera:camera-view:1.3.4" + //ProfileCirle implementation 'de.hdodenhof:circleimageview:3.1.0' //CropImg -// implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation("com.vanniktech:android-image-cropper:4.6.0") implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.22")) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca69e580..76ab18d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + ) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CarePlanProgressViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_care_plan_progress, parent, false) + return CarePlanProgressViewHolder(view) + } + + override fun onBindViewHolder(holder: CarePlanProgressViewHolder, position: Int) { + holder.bind(progressList[position]) + } + + override fun getItemCount(): Int = progressList.size + + inner class CarePlanProgressViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val progressText: TextView = itemView.findViewById(R.id.progress_text) + + fun bind(progress: String) { + progressText.text = progress + } + } +} diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/PatientListAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/PatientListAdapter.kt index 70300cda..3179feac 100644 --- a/app/src/main/java/deakin/gopher/guardian/adapter/PatientListAdapter.kt +++ b/app/src/main/java/deakin/gopher/guardian/adapter/PatientListAdapter.kt @@ -42,6 +42,7 @@ class PatientListAdapter( } @SuppressLint("SetTextI18n") + // In PatientListAdapter override fun onBindViewHolder( holder: MyViewHolder, position: Int, @@ -51,13 +52,12 @@ class PatientListAdapter( updateStatusIndicator(holder.statusIndicator, model.status) holder.bind(model, isArchivedList) Log.d("PatientListAdapter", "Patient ID: " + model.patientId) + holder.patientItem.setOnClickListener { view: View? -> val sharedPreferences = context.getSharedPreferences("MY_PREF", Context.MODE_PRIVATE) val role = sharedPreferences.getInt("login_role", -1) if (0 == role || -1 == role) { - Log.d("PatientListAdapter", "Before toggle: " + model.status) model.examinePatient() - Log.d("PatientListAdapter", "After toggle: " + model.status) updateStatusIndicator(holder.statusIndicator, model.status) notifyItemChanged(position) val intent = Intent(context, PatientProfileActivity::class.java) @@ -65,14 +65,15 @@ class PatientListAdapter( context.startActivity(intent) updatePatientStatus(model.patientId, model.status, model.needsAssistance) } else if (1 == role) { - // admin - val intent = Intent(context, PatientProfileActivity::class.java) - intent.putExtra("id", model.patientId) + // admin: Open detailed view of the patient + val intent = Intent(context, PatientOverviewActivity::class.java) + intent.putExtra("PATIENT_ID", model.patientId) context.startActivity(intent) } } } + private fun updateStatusIndicator( statusIndicator: ImageView, status: PatientStatus, diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt b/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt index da05c079..ad383ad5 100644 --- a/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt +++ b/app/src/main/java/deakin/gopher/guardian/adapter/PatientOverviewActivity.kt @@ -1,4 +1,80 @@ -package deakin.gopher.guardian.adapter +package deakin.gopher.guardian.view.patient -class PatientOverviewActivity { -} \ No newline at end of file +// Core Android Components: +import android.os.Bundle +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity + +// GraphView: +import com.jjoe64.graphview.GraphView +import com.jjoe64.graphview.series.DataPoint +import com.jjoe64.graphview.series.LineGraphSeries + +import com.google.firebase.database.FirebaseDatabase +import deakin.gopher.guardian.R +import deakin.gopher.guardian.model.Patient + +class PatientOverviewActivity : AppCompatActivity() { + private lateinit var patient: Patient + private lateinit var healthDataTextView: TextView + private lateinit var taskHistoryTextView: TextView + private lateinit var progressChart: GraphView // For visualization + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_patient_overview) + + // Initialize views + healthDataTextView = findViewById(R.id.health_data_text) + taskHistoryTextView = findViewById(R.id.task_history_text) + progressChart = findViewById(R.id.progress_chart) + + val patientId = intent.getStringExtra("PATIENT_ID") + if (patientId != null) { + fetchPatientData(patientId) + } else { + Toast.makeText(this, "Patient ID is missing", Toast.LENGTH_SHORT).show() + } + } + + private fun fetchPatientData(patientId: String) { + val patientRef = FirebaseDatabase.getInstance().getReference("patients").child(patientId) + patientRef.get().addOnSuccessListener { snapshot -> + patient = snapshot.getValue(Patient::class.java)!! + displayData() + }.addOnFailureListener { exception -> + Toast.makeText(this, "Failed to load patient data: ${exception.message}", Toast.LENGTH_SHORT).show() + } + } + + private fun displayData() { + // Display health data + healthDataTextView.text = formatHealthData(patient.healthData) + + // Display task history + taskHistoryTextView.text = patient.taskHistory.joinToString("\n") + + // Load care plan progress into chart + loadProgressChart(patient.carePlanProgress) + } + + private fun formatHealthData(healthData: Map): String { + return healthData.entries.joinToString("\n") { "${it.key}: ${it.value}" } + } + + private fun loadProgressChart(progressData: Map) { + // Explicitly specify the type of entry to avoid inference issues + val dataPoints = progressData.entries.mapIndexed { index, entry -> + val value = (entry.value as? Number)?.toDouble() ?: 0.0 // Safely cast to Double + DataPoint(index.toDouble(), value) // Create a DataPoint object for each progress point + } + + // Create a LineGraphSeries and set it to the GraphView + val series = LineGraphSeries(dataPoints.toTypedArray()) + series.color = resources.getColor(R.color.blue) // Set color for the line graph + + // Set the series to the chart + progressChart.addSeries(series) + } +} diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/PatientProfileAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/PatientProfileAdapter.kt index de8f975f..5bf52b16 100644 --- a/app/src/main/java/deakin/gopher/guardian/adapter/PatientProfileAdapter.kt +++ b/app/src/main/java/deakin/gopher/guardian/adapter/PatientProfileAdapter.kt @@ -33,11 +33,13 @@ class PatientProfileAdapter( 3 -> MedicalDiagnosticsFragment(patientId) 4 -> HealthDataForViewFragment() 5 -> CarePlanSummaryActivityFragment(patientId) + 6 -> TaskHistoryFragment(patientId) //new fragment for task history + 7 -> CarePlanProgressFragment(patientId) //new fragment for care plan progess else -> HealthDataForViewFragment() } } override fun getItemCount(): Int { - return 6 + return 8 //updated to include the new fragments } } diff --git a/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt b/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt index f284f262..23a5a30f 100644 --- a/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt +++ b/app/src/main/java/deakin/gopher/guardian/adapter/TaskHistoryAdapter.kt @@ -1,4 +1,31 @@ package deakin.gopher.guardian.adapter -class TaskHistoryAdapter { -} \ No newline at end of file +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import deakin.gopher.guardian.R + +class TaskHistoryAdapter(private val taskList: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_task_history, parent, false) + return TaskViewHolder(view) + } + + override fun onBindViewHolder(holder: TaskViewHolder, position: Int) { + val task = taskList[position] + holder.taskTextView.text = task + } + + override fun getItemCount(): Int { + return taskList.size + } + + class TaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val taskTextView: TextView = itemView.findViewById(R.id.text_view_task) + } +} diff --git a/app/src/main/java/deakin/gopher/guardian/model/Patient.kt b/app/src/main/java/deakin/gopher/guardian/model/Patient.kt index 69057e71..59f83f7b 100644 --- a/app/src/main/java/deakin/gopher/guardian/model/Patient.kt +++ b/app/src/main/java/deakin/gopher/guardian/model/Patient.kt @@ -49,6 +49,14 @@ class Patient { @JvmField var isArchived: Boolean = false + // New properties added + @JvmField + var healthData: Map = emptyMap() // Health data for the patient + @JvmField + var taskHistory: List = emptyList() // List of tasks associated with the patient + @JvmField + var carePlanProgress: Map = emptyMap() // Progress of the care plan + constructor(patientId: String?, firstName: String, lastName: String) { this.patientId = patientId this.firstName = firstName diff --git a/app/src/main/java/deakin/gopher/guardian/view/general/MainActivity.kt b/app/src/main/java/deakin/gopher/guardian/view/general/MainActivity.kt index 080bc7a3..c8829072 100644 --- a/app/src/main/java/deakin/gopher/guardian/view/general/MainActivity.kt +++ b/app/src/main/java/deakin/gopher/guardian/view/general/MainActivity.kt @@ -4,37 +4,108 @@ import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Button +import android.widget.EditText +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.google.android.gms.tasks.Task import com.google.firebase.messaging.FirebaseMessaging +import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.firestore.Query import deakin.gopher.guardian.R import deakin.gopher.guardian.model.login.SessionManager import deakin.gopher.guardian.services.EmailPasswordAuthService +import deakin.gopher.guardian.adapter.MessageAdapter +import deakin.gopher.guardian.communication.Message // Import Message class + +import java.util.Date class MainActivity : BaseActivity() { + private lateinit var recyclerViewMessages: RecyclerView + private lateinit var messageAdapter: MessageAdapter + private val messageList = mutableListOf() + private lateinit var editTextMessage: EditText + private val db = FirebaseFirestore.getInstance() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + // Existing button setup val getStartedButton = findViewById