Compare commits
40 Commits
samplebuff
...
Bufferchec
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac2bb91648 | ||
|
|
9db8e962d7 | ||
|
|
497a61c16b | ||
|
|
acd9262dfe | ||
|
|
f8ac0e81ce | ||
|
|
5a7a09817f | ||
|
|
ab09c659b9 | ||
|
|
14c15bb9ab | ||
|
|
0ca4083c16 | ||
|
|
662e2644f2 | ||
|
|
63aeebd4e1 | ||
|
|
315c46c014 | ||
|
|
27bf068df0 | ||
|
|
23d382395f | ||
|
|
31d3458cd1 | ||
|
|
1ec79853de | ||
|
|
744735d7ba | ||
|
|
211429fb8f | ||
|
|
8a56d0eb5f | ||
|
|
ed6cb58b69 | ||
|
|
67d8ffe502 | ||
|
|
dadc24cb88 | ||
|
|
118b17bee1 | ||
|
|
d42f5e31e5 | ||
|
|
f1f45fb958 | ||
|
|
8482de6aeb | ||
|
|
d6ffcba70a | ||
|
|
381b351309 | ||
|
|
c01676cc4f | ||
|
|
a61aab377e | ||
|
|
e1dbfc9d89 | ||
|
|
3671dc9db8 | ||
|
|
1d017f0578 | ||
|
|
e34e7ada52 | ||
|
|
9cd0ee21b6 | ||
|
|
f3598c9699 | ||
|
|
9b38a5dff7 | ||
|
|
a7adb02593 | ||
|
|
5647340b90 | ||
|
|
94894f34a5 |
43
.idea/misc.xml
generated
43
.idea/misc.xml
generated
@@ -1,43 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="DesignSurface">
|
|
||||||
<option name="filePathToZoomLevelMap">
|
|
||||||
<map>
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_auto_graph_24.xml" value="0.1555" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_cancel_24.xml" value="0.1965" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_check_circle_24.xml" value="0.243" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_dot_24.xml" value="0.1785" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_file_download_24.xml" value="0.243" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_home_24.xml" value="0.243" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_new_label_24.xml" value="0.243" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_usb_24.xml" value="0.157" />
|
|
||||||
<entry key="app/src/main/res/drawable/ic_baseline_usb_off_24.xml" value="0.157" />
|
|
||||||
<entry key="app/src/main/res/drawable/progressbar_drawable.xml" value="0.1885" />
|
|
||||||
<entry key="app/src/main/res/drawable/result_background_green.xml" value="0.243" />
|
|
||||||
<entry key="app/src/main/res/drawable/result_background_red.xml" value="0.1785" />
|
|
||||||
<entry key="app/src/main/res/drawable/result_background_tellow.xml" value="0.1785" />
|
|
||||||
<entry key="app/src/main/res/font/inter_bold.xml" value="0.33487179487179486" />
|
|
||||||
<entry key="app/src/main/res/layout/activity_main.xml" value="0.165" />
|
|
||||||
<entry key="app/src/main/res/layout/activity_splash.xml" value="0.24375" />
|
|
||||||
<entry key="app/src/main/res/layout/activity_test_right.xml" value="0.24375" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_graph.xml" value="0.19791666666666666" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_test_right_exp_reference.xml" value="0.25" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_test_right_exp_sample.xml" value="0.24583333333333332" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_test_right_exp_scanner.xml" value="0.24583333333333332" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_test_right_process.xml" value="0.24375" />
|
|
||||||
<entry key="app/src/main/res/layout/fragment_test_right_results.xml" value="0.30512820512820515" />
|
|
||||||
<entry key="app/src/main/res/layout/table_item.xml" value="0.22407407407407406" />
|
|
||||||
<entry key="app/src/main/res/menu/menu.xml" value="0.25" />
|
|
||||||
<entry key="app/src/main/res/menu/my_menu.xml" value="0.25" />
|
|
||||||
<entry key="app/src/main/res/mipmap-anydpi-v26/hpos_icon.xml" value="0.1505" />
|
|
||||||
<entry key="app/src/main/res/mipmap-anydpi-v26/hpos_icon_round.xml" value="0.1505" />
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectType">
|
|
||||||
<option name="id" value="Android" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -18,8 +18,8 @@ android {
|
|||||||
applicationId "in.sminnovations.hpostesting"
|
applicationId "in.sminnovations.hpostesting"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 10
|
versionCode 20
|
||||||
versionName "2.1.10"
|
versionName "2.1.21"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,13 @@
|
|||||||
android:parentActivityName="com.example.hpostesting.presentation.MainActivity"
|
android:parentActivityName="com.example.hpostesting.presentation.MainActivity"
|
||||||
android:theme="@style/Theme.HPOS.NoActionBar"
|
android:theme="@style/Theme.HPOS.NoActionBar"
|
||||||
android:windowSoftInputMode="adjustPan" />
|
android:windowSoftInputMode="adjustPan" />
|
||||||
|
<activity
|
||||||
|
android:name="com.example.hpostesting.presentation.buffercheck.HemocubeBufferCheckActivity"
|
||||||
|
android:exported="false"
|
||||||
|
android:noHistory="true"
|
||||||
|
android:parentActivityName="com.example.hpostesting.presentation.MainActivity"
|
||||||
|
android:theme="@style/Theme.HPOS.NoActionBar"
|
||||||
|
android:windowSoftInputMode="adjustPan" />
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpostesting.presentation.KitScanActivity"
|
android:name="com.example.hpostesting.presentation.KitScanActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
@@ -94,6 +101,7 @@
|
|||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:stateNotNeeded="true"
|
android:stateNotNeeded="true"
|
||||||
tools:replace="android:screenOrientation" />
|
tools:replace="android:screenOrientation" />
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -47,6 +47,20 @@ object Constants {
|
|||||||
"HC-V1-004",
|
"HC-V1-004",
|
||||||
"HC-V1-005",
|
"HC-V1-005",
|
||||||
"HC-V1-006",
|
"HC-V1-006",
|
||||||
|
"HC-V1-007",
|
||||||
|
"HC-V1-008",
|
||||||
|
"HC-V1-009",
|
||||||
|
"HC-V1-010",
|
||||||
|
"HC-V1-011",
|
||||||
|
"HC-V1-012",
|
||||||
|
"HC-V1-013",
|
||||||
|
"HC-V1-014",
|
||||||
|
"HC-V1-015",
|
||||||
|
"HC-V1-016",
|
||||||
|
"HC-V1-017",
|
||||||
|
"HC-V1-018",
|
||||||
|
"HC-V1-019",
|
||||||
|
"HC-V1-020",
|
||||||
)
|
)
|
||||||
|
|
||||||
const val password = "SMI@12345"
|
const val password = "SMI@12345"
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.example.hpostesting.data.model.patient
|
||||||
|
|
||||||
|
data class BufferCheckData(
|
||||||
|
var kitno: String = "",
|
||||||
|
var deviceId: String? = "",
|
||||||
|
var appVersion:String? = "",
|
||||||
|
var deviceSerialNumber: String = "",
|
||||||
|
var deviceType: String = "HEMOCUBE",
|
||||||
|
var resultData: String = "",
|
||||||
|
var led1Buffer: Double? = null,
|
||||||
|
var led2Buffer: Double? = null,
|
||||||
|
var led1Sample: Double? = null,
|
||||||
|
var led2Sample: Double? = null,
|
||||||
|
var led1Average: Double? = null,
|
||||||
|
var led2Average: Double? = null,
|
||||||
|
var deviceRatio: Double? = null,
|
||||||
|
var calculatedRatio: Double? = null,
|
||||||
|
var classificationResult: String = ""
|
||||||
|
)
|
||||||
@@ -9,6 +9,7 @@ data class UserData(
|
|||||||
@PrimaryKey
|
@PrimaryKey
|
||||||
var _id: String = "",
|
var _id: String = "",
|
||||||
var name: String = "",
|
var name: String = "",
|
||||||
|
var incubationTime: String = "",
|
||||||
var birthYear: String = "",
|
var birthYear: String = "",
|
||||||
var userImageURL: String = "",
|
var userImageURL: String = "",
|
||||||
var location: Location? = null,
|
var location: Location? = null,
|
||||||
|
|||||||
@@ -1,24 +1,19 @@
|
|||||||
package com.example.hpostesting.data.repository
|
package com.example.hpostesting.data.repository
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.room.Room
|
|
||||||
import com.example.hpostesting.data.dao.MyDatabase
|
|
||||||
import com.example.hpostesting.data.model.PendingUploads
|
import com.example.hpostesting.data.model.PendingUploads
|
||||||
import com.example.hpostesting.data.model.Response
|
import com.example.hpostesting.data.model.Response
|
||||||
|
import com.example.hpostesting.data.model.patient.BufferCheckData
|
||||||
import com.example.hpostesting.data.model.patient.DeviceData
|
import com.example.hpostesting.data.model.patient.DeviceData
|
||||||
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
||||||
import com.example.hpostesting.data.model.patient.UserData
|
import com.example.hpostesting.data.model.patient.UserData
|
||||||
import com.google.android.datatransport.runtime.dagger.Provides
|
import com.google.firebase.crashlytics.ktx.crashlytics
|
||||||
import com.google.firebase.firestore.FirebaseFirestore
|
import com.google.firebase.firestore.FirebaseFirestore
|
||||||
import com.google.firebase.firestore.ktx.firestore
|
import com.google.firebase.firestore.ktx.firestore
|
||||||
import com.google.firebase.ktx.Firebase
|
import com.google.firebase.ktx.Firebase
|
||||||
import com.google.firebase.storage.ktx.storage
|
import com.google.firebase.storage.ktx.storage
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.tasks.await
|
import kotlinx.coroutines.tasks.await
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.inject.Singleton
|
|
||||||
|
|
||||||
class DatabaseRepository : Repository {
|
class DatabaseRepository : Repository {
|
||||||
|
|
||||||
@@ -40,7 +35,6 @@ class DatabaseRepository : Repository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
suspend fun addTestToDatabase(data: UserData?): Response<String> {
|
suspend fun addTestToDatabase(data: UserData?): Response<String> {
|
||||||
return try {
|
return try {
|
||||||
val userdata = db.collection("patientData").whereEqualTo("_id", data!!._id).get().await()
|
val userdata = db.collection("patientData").whereEqualTo("_id", data!!._id).get().await()
|
||||||
@@ -52,13 +46,20 @@ class DatabaseRepository : Repository {
|
|||||||
db.collection("testData").add(data!!).await()
|
db.collection("testData").add(data!!).await()
|
||||||
Response.Success(data!!._id)
|
Response.Success(data!!._id)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
Response.Error(e)
|
Response.Error(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun addTestToDatabaseforBufferCheck(data: BufferCheckData?): Response<String> {
|
||||||
|
return try {
|
||||||
|
db.collection("buffers").add(data!!).await()
|
||||||
|
Response.Success(data!!.kitno)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
|
Response.Error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun uploadFileToStorage(patientID: String, filePath: String): Response<Boolean> {
|
suspend fun uploadFileToStorage(patientID: String, filePath: String): Response<Boolean> {
|
||||||
try {
|
try {
|
||||||
@@ -67,9 +68,8 @@ class DatabaseRepository : Repository {
|
|||||||
val riversRef = storage.reference.child("$patientID/${file.lastPathSegment}")
|
val riversRef = storage.reference.child("$patientID/${file.lastPathSegment}")
|
||||||
riversRef.putFile(file).await()
|
riversRef.putFile(file).await()
|
||||||
return Response.Success(true)
|
return Response.Success(true)
|
||||||
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
Firebase.crashlytics.recordException(e)
|
||||||
return Response.Error(e)
|
return Response.Error(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,7 +81,7 @@ class DatabaseRepository : Repository {
|
|||||||
|
|
||||||
Response.Success(true)
|
Response.Success(true)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
Firebase.crashlytics.recordException(e)
|
||||||
Response.Error(e)
|
Response.Error(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ class DatabaseRepository : Repository {
|
|||||||
pendingList
|
pendingList
|
||||||
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
Firebase.crashlytics.recordException(e)
|
||||||
pendingList
|
pendingList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,7 +111,7 @@ class DatabaseRepository : Repository {
|
|||||||
|
|
||||||
Response.Success(true)
|
Response.Success(true)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
Firebase.crashlytics.recordException(e)
|
||||||
Response.Error(e)
|
Response.Error(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,6 @@ class DatabaseRepository : Repository {
|
|||||||
return db.collection("devices").get().await().toObjects(DeviceData::class.java)
|
return db.collection("devices").get().await().toObjects(DeviceData::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
suspend fun getDeviceDataById(deviceId: String): DeviceData? {
|
suspend fun getDeviceDataById(deviceId: String): DeviceData? {
|
||||||
val querySnapshot = db.collection("devices").get().await()
|
val querySnapshot = db.collection("devices").get().await()
|
||||||
val allDeviceDataList = querySnapshot.toObjects(DeviceData::class.java)
|
val allDeviceDataList = querySnapshot.toObjects(DeviceData::class.java)
|
||||||
@@ -128,7 +127,4 @@ class DatabaseRepository : Repository {
|
|||||||
// Find the DeviceData object with the specified deviceId
|
// Find the DeviceData object with the specified deviceId
|
||||||
return allDeviceDataList.find { it.deviceId == deviceId }
|
return allDeviceDataList.find { it.deviceId == deviceId }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -108,7 +108,33 @@ class KitScanActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
binding.btnGo.setOnClickListener {
|
binding.btnGo.setOnClickListener {
|
||||||
val serialNumber = binding.nameEditText.text.toString().trim()
|
val serialNumber = binding.nameEditText.text.toString().trim()
|
||||||
if (serialNumber.isNotEmpty() && checkDataNotNull() && isSerialValid(serialNumber)) {
|
if (serialNumber.isNotEmpty() && isSerialValid(serialNumber)) {
|
||||||
|
if (DataHolder.selectedTest == null) {
|
||||||
|
with(sharedPreference.edit()) {
|
||||||
|
putString(
|
||||||
|
Constants.KIT_NUMBER, binding.nameEditText.text.toString()
|
||||||
|
)
|
||||||
|
putInt(Constants.KIT_COUNT, 1)
|
||||||
|
apply()
|
||||||
|
}
|
||||||
|
Toast.makeText(
|
||||||
|
applicationContext,
|
||||||
|
"Kit number is updated, Please Select user before starting test",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
|
||||||
|
val i = Intent(applicationContext, DashboardActivity::class.java)
|
||||||
|
startActivity(i)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "Invalid KIT Number", Toast.LENGTH_LONG).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
if (serialNumber.isNotEmpty() && checkDataNotNull() && isSerialValid(
|
||||||
|
serialNumber
|
||||||
|
)
|
||||||
|
) {
|
||||||
DataHolder.kitSerial = binding.nameEditText.text.toString()
|
DataHolder.kitSerial = binding.nameEditText.text.toString()
|
||||||
DataHolder.selectedTest?.kitSerial = binding.nameEditText.text.toString()
|
DataHolder.selectedTest?.kitSerial = binding.nameEditText.text.toString()
|
||||||
with(sharedPreference.edit()) {
|
with(sharedPreference.edit()) {
|
||||||
@@ -125,8 +151,9 @@ class KitScanActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private fun checkHemoCubeKitData(): Boolean {
|
private fun checkHemoCubeKitData(): Boolean {
|
||||||
return sharedPreference.getString(Constants.KIT_NUMBER, "")
|
return sharedPreference.getString(Constants.KIT_NUMBER, "")
|
||||||
?.isNotBlank() == true && sharedPreference.getInt(Constants.KIT_COUNT, 0) > 0
|
?.isNotBlank() == true && sharedPreference.getInt(
|
||||||
&& sharedPreference.getInt(Constants.KIT_COUNT, 0) < 35
|
Constants.KIT_COUNT, 0
|
||||||
|
) > 0 && sharedPreference.getInt(Constants.KIT_COUNT, 0) < 35
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isSerialValid(s: String): Boolean {
|
private fun isSerialValid(s: String): Boolean {
|
||||||
|
|||||||
@@ -90,18 +90,6 @@ class MainActivity : AppCompatActivity() {
|
|||||||
startActivity(Intent(this, DashboardActivity::class.java))
|
startActivity(Intent(this, DashboardActivity::class.java))
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// val crashButton = Button(this)
|
|
||||||
// crashButton.text = "Test Crash"
|
|
||||||
// crashButton.setOnClickListener {
|
|
||||||
// throw RuntimeException("Test Crash") // Force a crash
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// addContentView(crashButton, ViewGroup.LayoutParams(
|
|
||||||
// ViewGroup.LayoutParams.MATCH_PARENT,
|
|
||||||
// ViewGroup.LayoutParams.WRAP_CONTENT))
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAndUpdateUsbConnection() {
|
private fun checkAndUpdateUsbConnection() {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.example.hpostesting.presentation.adapter
|
package com.example.hpostesting.presentation.adapter
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.AlertDialog
|
||||||
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -10,17 +12,31 @@ import androidx.recyclerview.widget.RecyclerView
|
|||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.example.hpostesting.data.DataHolder
|
import com.example.hpostesting.data.DataHolder
|
||||||
import com.example.hpostesting.data.model.patient.UserData
|
import com.example.hpostesting.data.model.patient.UserData
|
||||||
import com.example.hpostesting.presentation.testRight.TestRightViewModel
|
|
||||||
import com.firebase.ui.firestore.FirestoreRecyclerAdapter
|
import com.firebase.ui.firestore.FirestoreRecyclerAdapter
|
||||||
import com.firebase.ui.firestore.FirestoreRecyclerOptions
|
import com.firebase.ui.firestore.FirestoreRecyclerOptions
|
||||||
|
import com.google.firebase.firestore.ktx.firestore
|
||||||
|
import com.google.firebase.ktx.Firebase
|
||||||
import `in`.sminnovations.hpostesting.R
|
import `in`.sminnovations.hpostesting.R
|
||||||
import `in`.sminnovations.hpostesting.databinding.UserItemViewBinding
|
import `in`.sminnovations.hpostesting.databinding.UserItemViewBinding
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Calendar
|
||||||
|
import java.util.Date
|
||||||
|
import java.util.Locale
|
||||||
|
import android.widget.AutoCompleteTextView
|
||||||
|
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
||||||
|
import com.example.hpostesting.data.model.patient.toHemoCubeTestData
|
||||||
|
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
||||||
|
import com.google.firebase.firestore.FirebaseFirestore
|
||||||
|
|
||||||
class UserListAdapter(
|
class UserListAdapter(
|
||||||
|
|
||||||
|
private val context: Context,
|
||||||
|
private val hemoCubeViewModel: HemoCubeViewModel,
|
||||||
options: FirestoreRecyclerOptions<UserData>,
|
options: FirestoreRecyclerOptions<UserData>,
|
||||||
private val view: View
|
private val view: View,
|
||||||
) :
|
private val batLevel: Int,
|
||||||
FirestoreRecyclerAdapter<UserData, UserListAdapter.OrderItemViewHolder>(options) {
|
private val testDetails: HemoCubeTestData? = DataHolder.selectedTest?.toHemoCubeTestData(),
|
||||||
|
) : FirestoreRecyclerAdapter<UserData, UserListAdapter.OrderItemViewHolder>(options) {
|
||||||
|
|
||||||
class OrderItemViewHolder(val binding: UserItemViewBinding) :
|
class OrderItemViewHolder(val binding: UserItemViewBinding) :
|
||||||
RecyclerView.ViewHolder(binding.root)
|
RecyclerView.ViewHolder(binding.root)
|
||||||
@@ -36,6 +52,21 @@ class UserListAdapter(
|
|||||||
holder.binding.apply {
|
holder.binding.apply {
|
||||||
userName.text = "Name: ${model.name}"
|
userName.text = "Name: ${model.name}"
|
||||||
userId.text = "User ID:${model._id}"
|
userId.text = "User ID:${model._id}"
|
||||||
|
if (model.incubationTime == "") {
|
||||||
|
// btnStartIncubation.visibility = View.VISIBLE
|
||||||
|
} else {
|
||||||
|
userId.text =
|
||||||
|
"User ID:${model._id} \n Time: ${isBetween15And30Minutes(model.incubationTime)} \n Started at: ${
|
||||||
|
SimpleDateFormat("HH:mm:ss").format(
|
||||||
|
SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
||||||
|
).parse(model.incubationTime)!!
|
||||||
|
)
|
||||||
|
}"
|
||||||
|
btnStartIncubation.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Glide.with(view).load(model.userImageURL).into(userImage)
|
Glide.with(view).load(model.userImageURL).into(userImage)
|
||||||
if (model.testStatus!!) {
|
if (model.testStatus!!) {
|
||||||
teststatus.text = "Test concluded"
|
teststatus.text = "Test concluded"
|
||||||
@@ -43,7 +74,116 @@ class UserListAdapter(
|
|||||||
} else {
|
} else {
|
||||||
teststatus.text = "Test is Pending"
|
teststatus.text = "Test is Pending"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
holder.binding.btnBlood.setOnClickListener {
|
||||||
|
val inflater = LayoutInflater.from(context)
|
||||||
|
val dialogView = inflater.inflate(R.layout.dialog_custom, null)
|
||||||
|
|
||||||
|
val builder = AlertDialog.Builder(context)
|
||||||
|
.setView(dialogView)
|
||||||
|
.setTitle("Add Blood Group")
|
||||||
|
|
||||||
|
val etBloodGroup = dialogView.findViewById<AutoCompleteTextView>(R.id.et_blood_group)
|
||||||
|
|
||||||
|
builder.setPositiveButton("OK") { dialog, which ->
|
||||||
|
val bloodGroup = etBloodGroup.text.toString()
|
||||||
|
if (bloodGroup.equals("Select Blood Group") || bloodGroup.isNullOrBlank()) {
|
||||||
|
etBloodGroup.error = "Please enter your blood group"
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"Please enter your blood group",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
} else {
|
||||||
|
// Check if hemoCubeViewModel and testDetails are not null
|
||||||
|
val db: FirebaseFirestore = FirebaseFirestore.getInstance()
|
||||||
|
|
||||||
|
db.collection("patientData")
|
||||||
|
.whereEqualTo("_id", model._id)
|
||||||
|
.get()
|
||||||
|
.addOnSuccessListener { userdata ->
|
||||||
|
try {
|
||||||
|
val document = userdata.documents[0]
|
||||||
|
db.collection("patientData")
|
||||||
|
.document(document.id)
|
||||||
|
.update("bloodGroup", bloodGroup,
|
||||||
|
"incubationTime", SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
||||||
|
).format(Calendar.getInstance().time).toString()
|
||||||
|
)
|
||||||
|
.addOnSuccessListener {
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"Blood group updated successfully",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
.addOnFailureListener { e ->
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"Failed to update blood group: ${e.message}",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
} catch (e: IndexOutOfBoundsException) {
|
||||||
|
// Handle the case where no documents are found for the specified ID
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"No user data found for the specified ID",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.addOnFailureListener { e ->
|
||||||
|
Toast.makeText(
|
||||||
|
context,
|
||||||
|
"Error fetching user data: ${e.message}",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Handle the selected blood group here
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.setNegativeButton("Cancel") { dialog, which ->
|
||||||
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
val alertDialog = builder.create()
|
||||||
|
alertDialog.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
btnStartIncubation.setOnClickListener {
|
||||||
|
// it.visibility = View.GONE
|
||||||
|
// Firebase.firestore.collection("patientData").whereEqualTo("_id", model._id).get()
|
||||||
|
// .addOnSuccessListener { data ->
|
||||||
|
// if (data.documents.isNotEmpty()) {
|
||||||
|
// data.documents.forEach { userData ->
|
||||||
|
// Firebase.firestore.collection("patientData").document(userData.id)
|
||||||
|
// .update(
|
||||||
|
// "incubationTime", SimpleDateFormat(
|
||||||
|
// "yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
||||||
|
// ).format(Calendar.getInstance().time).toString()
|
||||||
|
// ).addOnSuccessListener {
|
||||||
|
// Toast.makeText(
|
||||||
|
// view.context, "Incubation started", Toast.LENGTH_SHORT
|
||||||
|
// ).show()
|
||||||
|
// startListening()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
userCard.setOnClickListener {
|
userCard.setOnClickListener {
|
||||||
|
if (batLevel < 40) {
|
||||||
|
Toast.makeText(
|
||||||
|
view.context,
|
||||||
|
"Battery level is low than 40%, please charge the device to continue testing",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
if (model.testStatus != null) {
|
if (model.testStatus != null) {
|
||||||
if (model.testStatus!!) {
|
if (model.testStatus!!) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
@@ -51,12 +191,55 @@ class UserListAdapter(
|
|||||||
"Test has been already conducted for this user",
|
"Test has been already conducted for this user",
|
||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
|
} else {
|
||||||
|
if (model.incubationTime != "") {
|
||||||
|
if (isBetween15And30Minutes(model.incubationTime) < 15) {
|
||||||
|
Toast.makeText(
|
||||||
|
view.context,
|
||||||
|
"Incubation has not completed 15 minutes",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
} else if (isBetween15And30Minutes(model.incubationTime) > 30) {
|
||||||
|
Toast.makeText(
|
||||||
|
view.context,
|
||||||
|
"Incubation crossed 30 minutes, need to repeat the incubation",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
} else {
|
} else {
|
||||||
DataHolder.selectedTest = model
|
DataHolder.selectedTest = model
|
||||||
view.findNavController().navigate(R.id.action_nav_home_to_mainActivity)
|
view.findNavController()
|
||||||
|
.navigate(R.id.action_nav_home_to_mainActivity)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
view.context,
|
||||||
|
"Incubation not started for this user",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun isBetween15And30Minutes(createdAt: String): Long {
|
||||||
|
val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
||||||
|
val createdAtDate: Date = formatter.parse(createdAt)!!
|
||||||
|
|
||||||
|
val currentTime = Calendar.getInstance().time
|
||||||
|
|
||||||
|
val diffMillis = currentTime.time - createdAtDate.time
|
||||||
|
|
||||||
|
return diffMillis / (60 * 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,343 @@
|
|||||||
|
package com.example.hpostesting.presentation.buffercheck
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.example.hpostesting.data.DataHolder
|
||||||
|
import com.example.hpostesting.data.constant.Constants
|
||||||
|
import com.example.hpostesting.data.constant.HemoCubeCommands
|
||||||
|
import com.example.hpostesting.data.model.patient.BufferCheckData
|
||||||
|
import com.example.hpostesting.data.model.patient.DeviceData
|
||||||
|
import com.example.hpostesting.data.model.patient.toHemoCubeTestData
|
||||||
|
import com.example.hpostesting.presentation.UsbServiceListener
|
||||||
|
import com.example.hpostesting.presentation.dashboard.DashboardActivity
|
||||||
|
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
||||||
|
import com.example.hpostesting.presentation.utils.MyDialogListener
|
||||||
|
import com.example.hpostesting.presentation.utils.UIUtils
|
||||||
|
import com.google.firebase.crashlytics.ktx.crashlytics
|
||||||
|
import com.google.firebase.ktx.Firebase
|
||||||
|
import `in`.sminnovations.hpostesting.R
|
||||||
|
import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding
|
||||||
|
import kotlin.math.log10
|
||||||
|
|
||||||
|
class HemoCubeBufferCheckFragment : Fragment() {
|
||||||
|
|
||||||
|
private lateinit var binding: FragmentHemoCubeReferenceBinding
|
||||||
|
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
||||||
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
|
private var currentDeviceData: DeviceData? = null
|
||||||
|
private var resultData: String = ""
|
||||||
|
private var kitno: String = ""
|
||||||
|
private var isOnline = false
|
||||||
|
private val messages = MutableLiveData<String>()
|
||||||
|
private var isTestOngoing = false
|
||||||
|
private var startListening = MutableLiveData(false)
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?,
|
||||||
|
): View {
|
||||||
|
binding = FragmentHemoCubeReferenceBinding.inflate(inflater, container, false)
|
||||||
|
sharedPreferences =
|
||||||
|
requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
initViews()
|
||||||
|
observeViewModel()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initViews() {
|
||||||
|
|
||||||
|
binding.nameEditText.setText("SMI/SC/")
|
||||||
|
|
||||||
|
binding.btnGo.setOnClickListener {
|
||||||
|
val serialNumber = binding.nameEditText.text.toString().trim()
|
||||||
|
if (serialNumber.isNotEmpty() && isSerialValid(serialNumber)) {
|
||||||
|
kitno = serialNumber
|
||||||
|
listenToHemoCube()
|
||||||
|
startBufferProcess()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(context, "Invalid KIT Number", Toast.LENGTH_LONG).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
binding.tvSubtitle2.visibility = View.GONE
|
||||||
|
binding.etAbhaId.visibility = View.GONE
|
||||||
|
binding.tvTitle.visibility = View.GONE
|
||||||
|
binding.tvTitle2.visibility = View.GONE
|
||||||
|
binding.btnGo.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
binding.btnSubmit.isEnabled = true
|
||||||
|
binding.btnSubmit.isClickable = true
|
||||||
|
}
|
||||||
|
binding.btnSubmit.setOnClickListener {
|
||||||
|
|
||||||
|
}
|
||||||
|
binding.btnSubmit.isEnabled = false
|
||||||
|
binding.btnSubmit.isClickable = false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun observeViewModel() {
|
||||||
|
hemoCubeViewModel.deviceData.observe(viewLifecycleOwner) {
|
||||||
|
currentDeviceData = it
|
||||||
|
}
|
||||||
|
|
||||||
|
hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isNetworkAvailable ->
|
||||||
|
if (isNetworkAvailable) {
|
||||||
|
hemoCubeViewModel.getDeviceData(sharedPreferences.getString(Constants.USER_ID, ""))
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
requireContext(), "No internet connection avaiable", Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
isOnline = isNetworkAvailable
|
||||||
|
}
|
||||||
|
hemoCubeViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
|
||||||
|
if (result == "Success") {
|
||||||
|
showToast("Kit result uploaded successfully")
|
||||||
|
}
|
||||||
|
if (result == "Local") {
|
||||||
|
showToast("Kit result uploading failed, note it down manually")
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.progressBar.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
messages.observe(viewLifecycleOwner) {
|
||||||
|
binding.tvSubtitle4.text = it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun listenToHemoCube() {
|
||||||
|
if (DataHolder.hemoCubeTestData == null) {
|
||||||
|
DataHolder.hemoCubeTestData = DataHolder.selectedTest?.toHemoCubeTestData()
|
||||||
|
}
|
||||||
|
|
||||||
|
val fullReadOutput = StringBuilder()
|
||||||
|
startListening.postValue(true)
|
||||||
|
|
||||||
|
try {
|
||||||
|
(activity as HemocubeBufferCheckActivity).mService.listenToHemoCube(object :
|
||||||
|
UsbServiceListener {
|
||||||
|
override fun onUsbRead(data: ByteArray?) {
|
||||||
|
data?.let {
|
||||||
|
val stringData = String(it)
|
||||||
|
fullReadOutput.append(stringData)
|
||||||
|
handleUsbData(stringData, fullReadOutput)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onUsbError(e: Exception?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (e: Exception) {
|
||||||
|
showToast("test is going on")
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleUsbData(stringData: String, fullReadOutput: StringBuilder) {
|
||||||
|
if (stringData.contains("#")) {
|
||||||
|
messages.postValue(stringData)
|
||||||
|
isTestOngoing = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resultData += fullReadOutput.toString()
|
||||||
|
|
||||||
|
when {
|
||||||
|
stringData.contains("#Buffer Completed") -> showStartSampleDialog()
|
||||||
|
stringData.contains("#Sample Completed") -> {
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
binding.btnSubmit.isEnabled = true
|
||||||
|
binding.btnSubmit.isClickable = true
|
||||||
|
}
|
||||||
|
fetchResult()
|
||||||
|
}
|
||||||
|
|
||||||
|
stringData.contains("RESULT") || resultData.contains("REND") -> {
|
||||||
|
var validString: String
|
||||||
|
val results: List<String>
|
||||||
|
if (stringData.contains("RESULT")) {
|
||||||
|
validString = isValidResult(stringData)
|
||||||
|
if (validString.isEmpty()) {
|
||||||
|
results = resultData.split("\n")
|
||||||
|
validString = parseResult(results)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
results = resultData.split("\n")
|
||||||
|
validString = parseResult(results)
|
||||||
|
}
|
||||||
|
if (validString.isNotEmpty()) {
|
||||||
|
handleValidResult(validString)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showStartSampleDialog() {
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
UIUtils.createAlertDialog(requireContext(),
|
||||||
|
"Start Sample",
|
||||||
|
"Do you want to start sample reading?",
|
||||||
|
getString(R.string.no),
|
||||||
|
"Yes",
|
||||||
|
object : MyDialogListener {
|
||||||
|
override fun onClickNegativeButton() {}
|
||||||
|
|
||||||
|
override fun onClickPositiveButton() {
|
||||||
|
listenToHemoCube()
|
||||||
|
startSampleProcess()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleValidResult(validString: String) {
|
||||||
|
try {
|
||||||
|
val result = validString.split(" ")
|
||||||
|
if (result.size == 8) {
|
||||||
|
val deviceSerialNo = result[2]
|
||||||
|
val led1BufferForDevice = result[3].toDoubleOrNull()
|
||||||
|
val led2BufferForDevice = result[4].toDoubleOrNull()
|
||||||
|
val led1Sample = result[5].toDoubleOrNull()
|
||||||
|
val led2Sample = result[6].toDoubleOrNull()
|
||||||
|
val led1Average = log10(led1BufferForDevice?.div(led1Sample!!) ?: 0.0)
|
||||||
|
val led2Average = log10(led2BufferForDevice?.div(led2Sample!!) ?: 0.0)
|
||||||
|
val deviceRatio = led1Average / led2Average
|
||||||
|
val calculatedRatio = 0.14
|
||||||
|
val classificationResult = findResult(calculatedRatio)
|
||||||
|
messages.postValue(classificationResult)
|
||||||
|
val bufferData = BufferCheckData(
|
||||||
|
kitno = kitno,
|
||||||
|
led1Buffer = led1BufferForDevice,
|
||||||
|
led2Buffer = led2BufferForDevice,
|
||||||
|
led1Average = led1Average,
|
||||||
|
led2Average = led2Average,
|
||||||
|
led1Sample = led1Sample,
|
||||||
|
led2Sample = led2Sample,
|
||||||
|
deviceRatio = deviceRatio,
|
||||||
|
calculatedRatio = calculatedRatio,
|
||||||
|
classificationResult = classificationResult,
|
||||||
|
deviceSerialNumber = deviceSerialNo
|
||||||
|
)
|
||||||
|
hemoCubeViewModel.uploadHemoCubeResultToDatabaseforbuffercheckN(bufferData)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Toast.makeText(
|
||||||
|
requireContext(), "Error while processing device data", Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findResult(calculatedRatio: Double?): String {
|
||||||
|
try {
|
||||||
|
if (calculatedRatio != null) {
|
||||||
|
if (calculatedRatio < 0.085) return "Kit Failed"
|
||||||
|
if (calculatedRatio in 0.085..0.155) return "Kit Passed"
|
||||||
|
if (calculatedRatio in 0.155..0.175) return "Kit Failed"
|
||||||
|
if (calculatedRatio in 0.175..0.22) return "Kit Failed"
|
||||||
|
if (calculatedRatio in 0.22..0.25) return "Kit Failed"
|
||||||
|
if (calculatedRatio in 0.25..0.35) return "Kit Failed"
|
||||||
|
if (calculatedRatio > 0.35) return "Kit Failed"
|
||||||
|
} else {
|
||||||
|
return "NULL"
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
showToast("error while performing classification")
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
|
return "ERROR"
|
||||||
|
}
|
||||||
|
return "NULL"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showToast(message: String) {
|
||||||
|
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startBufferProcess() {
|
||||||
|
|
||||||
|
(activity as HemocubeBufferCheckActivity).mService.sendAndListenToHemoCube(HemoCubeCommands.startBuffer,
|
||||||
|
object : UsbServiceListener {
|
||||||
|
override fun onUsbRead(data: ByteArray?) {}
|
||||||
|
|
||||||
|
override fun onUsbError(e: Exception?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startSampleProcess() {
|
||||||
|
|
||||||
|
(activity as HemocubeBufferCheckActivity).mService.sendAndListenToHemoCube(HemoCubeCommands.startSample,
|
||||||
|
object : UsbServiceListener {
|
||||||
|
override fun onUsbRead(data: ByteArray?) {}
|
||||||
|
|
||||||
|
override fun onUsbError(e: Exception?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fetchResult() {
|
||||||
|
|
||||||
|
(activity as HemocubeBufferCheckActivity).mService.sendAndListenToHemoCube(HemoCubeCommands.getSample,
|
||||||
|
object : UsbServiceListener {
|
||||||
|
override fun onUsbRead(data: ByteArray?) {}
|
||||||
|
|
||||||
|
override fun onUsbError(e: Exception?) {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun calculateRatio(ratio: Double): Double {
|
||||||
|
val coefficient1 = currentDeviceData?.coefficients?.get(0) ?: 0.0
|
||||||
|
val coefficient2 = currentDeviceData?.coefficients?.get(1) ?: 1.0
|
||||||
|
return coefficient1 * ratio + coefficient2
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun parseResult(frames: List<String>): String {
|
||||||
|
val lines = mutableListOf<String>()
|
||||||
|
for (frame in frames.reversed()) {
|
||||||
|
if (frame.contains("REND") || frame.contains("RESULT")) lines += frame
|
||||||
|
if (frame.contains("RESULT")) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val line = lines.reversed().joinToString("").trim()
|
||||||
|
if (line.contains("RESULT") && line.split(" ").size == 8) {
|
||||||
|
return line
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isSerialValid(s: String): Boolean {
|
||||||
|
if (s.length != 17) {
|
||||||
|
binding.nameEditText.error = getString(R.string.invalid_kit)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun isValidResult(line: String): String {
|
||||||
|
return if (line.contains("RESULT") && line.split(" ").size == 8) {
|
||||||
|
line
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
package com.example.hpostesting.presentation.buffercheck
|
||||||
|
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.content.ServiceConnection
|
||||||
|
import android.hardware.usb.UsbDevice
|
||||||
|
import android.hardware.usb.UsbDeviceConnection
|
||||||
|
import android.hardware.usb.UsbManager
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.IBinder
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.Menu
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.activity.viewModels
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.view.get
|
||||||
|
import com.example.hpostesting.data.DataHolder
|
||||||
|
import com.example.hpostesting.data.constant.Constants
|
||||||
|
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
||||||
|
import com.example.hpostesting.presentation.testRight.UsbService
|
||||||
|
import com.hoho.android.usbserial.driver.UsbSerialDriver
|
||||||
|
import com.hoho.android.usbserial.driver.UsbSerialProber
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import `in`.sminnovations.hpostesting.R
|
||||||
|
import `in`.sminnovations.hpostesting.databinding.ActivityHemocubeBinding
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
open class HemocubeBufferCheckActivity : AppCompatActivity() {
|
||||||
|
private lateinit var binding: ActivityHemocubeBinding
|
||||||
|
private val viewModel by viewModels<HemoCubeViewModel>()
|
||||||
|
private var myMenu: Menu? = null
|
||||||
|
|
||||||
|
private lateinit var mDriver: UsbSerialDriver
|
||||||
|
private var mConnection: UsbDeviceConnection? = null
|
||||||
|
lateinit var mService: UsbService
|
||||||
|
|
||||||
|
private val TAG = "HemoCube"
|
||||||
|
|
||||||
|
private val broadcastReceiver = object : BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
|
||||||
|
synchronized(this) {
|
||||||
|
val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
|
||||||
|
|
||||||
|
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
|
||||||
|
device?.apply {
|
||||||
|
connectUsb(true)
|
||||||
|
DataHolder.usbConnected.postValue(true)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DataHolder.usbConnected.postValue(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val connection = object : ServiceConnection {
|
||||||
|
override fun onServiceConnected(className: ComponentName, service: IBinder) {
|
||||||
|
val binder = service as UsbService.UsbServiceBinder
|
||||||
|
mService = binder.getService()
|
||||||
|
viewModel.isServiceConnected = true
|
||||||
|
mConnection.let { mService.connect(mDriver, mConnection!!) }
|
||||||
|
moveToNext()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onServiceDisconnected(arg0: ComponentName) {
|
||||||
|
viewModel.isServiceConnected = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
binding = ActivityHemocubeBinding.inflate(layoutInflater)
|
||||||
|
setContentView(binding.root)
|
||||||
|
setSupportActionBar(binding.myToolbar)
|
||||||
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
|
setupListener()
|
||||||
|
connectUsb(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupListener() {
|
||||||
|
DataHolder.usbConnected.observe(this) {
|
||||||
|
Log.d("USB OBSERVE", "HemoCube called -> $it")
|
||||||
|
if (it) {
|
||||||
|
myMenu?.get(0)?.icon =
|
||||||
|
ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_24)
|
||||||
|
} else {
|
||||||
|
myMenu?.get(0)?.icon =
|
||||||
|
ContextCompat.getDrawable(this, R.drawable.ic_baseline_usb_off_24)
|
||||||
|
Toast.makeText(this, "Device is Disconnected", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun connectUsb(permissionGranted: Boolean) {
|
||||||
|
Log.d(TAG, "connectUsb() called, permission variable = $permissionGranted")
|
||||||
|
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
|
||||||
|
val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
|
||||||
|
|
||||||
|
if (availableDrivers.isEmpty()) {
|
||||||
|
Toast.makeText(this, "No device found", Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
mDriver = availableDrivers[0]
|
||||||
|
mConnection = manager.openDevice(mDriver.device)
|
||||||
|
|
||||||
|
if (mConnection == null) {
|
||||||
|
requestUserPermission(manager, mDriver.device)
|
||||||
|
} else {
|
||||||
|
setupService()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun requestUserPermission(manager: UsbManager, device: UsbDevice) {
|
||||||
|
val mPendingIntent: PendingIntent = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
||||||
|
PendingIntent.getBroadcast(
|
||||||
|
this, 0, Intent(Constants.HOMOCUBE_USB_PERMISSION), PendingIntent.FLAG_MUTABLE
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
PendingIntent.getBroadcast(
|
||||||
|
this,
|
||||||
|
0,
|
||||||
|
Intent(Constants.HOMOCUBE_USB_PERMISSION),
|
||||||
|
PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val filter = IntentFilter(Constants.HOMOCUBE_USB_PERMISSION)
|
||||||
|
registerReceiver(broadcastReceiver, filter)
|
||||||
|
manager.requestPermission(device, mPendingIntent)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupService() {
|
||||||
|
val intent = Intent(this, UsbService::class.java)
|
||||||
|
bindService(intent, connection, Context.BIND_AUTO_CREATE)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun moveToNext() {
|
||||||
|
if (supportFragmentManager.isDestroyed) return
|
||||||
|
|
||||||
|
supportFragmentManager.beginTransaction().replace(binding.fghemocube.id, HemoCubeBufferCheckFragment())
|
||||||
|
.commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||||
|
menuInflater.inflate(R.menu.my_menu, menu)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
if (viewModel.isServiceConnected) {
|
||||||
|
mService.disconnect()
|
||||||
|
unbindService(connection)
|
||||||
|
viewModel.isServiceConnected = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,10 @@ import androidx.navigation.ui.navigateUp
|
|||||||
import androidx.navigation.ui.setupActionBarWithNavController
|
import androidx.navigation.ui.setupActionBarWithNavController
|
||||||
import androidx.navigation.ui.setupWithNavController
|
import androidx.navigation.ui.setupWithNavController
|
||||||
import com.google.android.material.navigation.NavigationView
|
import com.google.android.material.navigation.NavigationView
|
||||||
|
import com.google.firebase.appdistribution.FirebaseAppDistribution
|
||||||
|
import com.google.firebase.appdistribution.FirebaseAppDistributionException
|
||||||
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||||
|
import com.google.firebase.crashlytics.ktx.crashlytics
|
||||||
//import com.google.firebase.appdistribution.FirebaseAppDistribution
|
//import com.google.firebase.appdistribution.FirebaseAppDistribution
|
||||||
//import com.google.firebase.appdistribution.FirebaseAppDistributionException
|
//import com.google.firebase.appdistribution.FirebaseAppDistributionException
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
@@ -58,28 +62,34 @@ class DashboardActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
// Copy and paste this into any part of your app - for example, in your main
|
|
||||||
// activity's onResume method.
|
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
|
||||||
// val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
|
firebaseAppDistribution.updateIfNewReleaseAvailable()
|
||||||
// firebaseAppDistribution.updateIfNewReleaseAvailable()
|
.addOnProgressListener { updateProgress ->
|
||||||
// .addOnProgressListener { updateProgress ->
|
Toast.makeText(
|
||||||
// Toast.makeText(this, "Updating", Toast.LENGTH_SHORT).show()
|
this,
|
||||||
// }
|
"${updateProgress.updateStatus}. ${updateProgress.apkBytesDownloaded / 1048576} /${updateProgress.apkFileTotalBytes / 1048576} MB",
|
||||||
// .addOnFailureListener { e ->
|
Toast.LENGTH_SHORT
|
||||||
// // (Optional) Handle errors.
|
).show()
|
||||||
// if (e is FirebaseAppDistributionException) {
|
}
|
||||||
// when (e.errorCode) {
|
.addOnFailureListener { e ->
|
||||||
// FirebaseAppDistributionException.Status.NOT_IMPLEMENTED -> {
|
// (Optional) Handle errors.
|
||||||
// // SDK did nothing. This is expected when building for Play.
|
if (e is FirebaseAppDistributionException) {
|
||||||
// }
|
when (e.errorCode) {
|
||||||
//
|
FirebaseAppDistributionException.Status.NOT_IMPLEMENTED -> {
|
||||||
// else -> {
|
// SDK did nothing. This is expected when building for Play.
|
||||||
// // Handle other errors.
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
// Handle other errors.
|
||||||
|
Toast.makeText(this, "AppDistribution error, status: ${e.errorCode}", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FirebaseCrashlytics.getInstance().recordException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.addOnSuccessListener {
|
||||||
|
Toast.makeText(this, "App Update: Success!", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package com.example.hpostesting.presentation.dashboard
|
package com.example.hpostesting.presentation.dashboard
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import com.example.hpostesting.presentation.buffercheck.HemocubeBufferCheckActivity
|
||||||
//import com.example.hpostesting.presentation.dashboard.ui.gallery.GalleryViewModel
|
|
||||||
import `in`.sminnovations.hpostesting.databinding.FragmentGalleryBinding
|
import `in`.sminnovations.hpostesting.databinding.FragmentGalleryBinding
|
||||||
|
|
||||||
class GalleryFragment : Fragment() {
|
class GalleryFragment : Fragment() {
|
||||||
@@ -32,6 +32,9 @@ class GalleryFragment : Fragment() {
|
|||||||
// galleryViewModel.text.observe(viewLifecycleOwner) {
|
// galleryViewModel.text.observe(viewLifecycleOwner) {
|
||||||
//// textView.text = it
|
//// textView.text = it
|
||||||
// }
|
// }
|
||||||
|
binding.btnSubmit.setOnClickListener {
|
||||||
|
startActivity(Intent(requireContext(), HemocubeBufferCheckActivity::class.java))
|
||||||
|
}
|
||||||
return root
|
return root
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ package com.example.hpostesting.presentation.dashboard
|
|||||||
|
|
||||||
import android.app.AlertDialog
|
import android.app.AlertDialog
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Context.BATTERY_SERVICE
|
||||||
import android.content.DialogInterface
|
import android.content.DialogInterface
|
||||||
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
|
import android.os.BatteryManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
@@ -16,16 +19,20 @@ import com.example.hpostesting.data.DataHolder
|
|||||||
import com.example.hpostesting.data.constant.Constants
|
import com.example.hpostesting.data.constant.Constants
|
||||||
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
||||||
import com.example.hpostesting.data.model.patient.UserData
|
import com.example.hpostesting.data.model.patient.UserData
|
||||||
|
import com.example.hpostesting.presentation.KitScanActivity
|
||||||
import com.example.hpostesting.presentation.adapter.UserListAdapter
|
import com.example.hpostesting.presentation.adapter.UserListAdapter
|
||||||
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
||||||
import com.example.hpostesting.presentation.testRight.TestRightViewModel
|
import com.example.hpostesting.presentation.testRight.TestRightViewModel
|
||||||
import com.firebase.ui.firestore.FirestoreRecyclerOptions
|
import com.firebase.ui.firestore.FirestoreRecyclerOptions
|
||||||
|
import com.google.firebase.crashlytics.ktx.crashlytics
|
||||||
import com.google.firebase.firestore.Query
|
import com.google.firebase.firestore.Query
|
||||||
import com.google.firebase.firestore.ktx.firestore
|
import com.google.firebase.firestore.ktx.firestore
|
||||||
import com.google.firebase.ktx.Firebase
|
import com.google.firebase.ktx.Firebase
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import `in`.sminnovations.hpostesting.R
|
import `in`.sminnovations.hpostesting.R
|
||||||
import `in`.sminnovations.hpostesting.databinding.FragmentHomeBinding
|
import `in`.sminnovations.hpostesting.databinding.FragmentHomeBinding
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
@@ -35,6 +42,9 @@ class HomeFragment : Fragment() {
|
|||||||
private val viewModel: TestRightViewModel by activityViewModels()
|
private val viewModel: TestRightViewModel by activityViewModels()
|
||||||
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
||||||
private lateinit var rvAdapter: UserListAdapter
|
private lateinit var rvAdapter: UserListAdapter
|
||||||
|
private var batLevel: Int = 0 // Initialize with a default value, or obtain the actual battery level
|
||||||
|
|
||||||
|
|
||||||
private lateinit var sharedPreference: SharedPreferences
|
private lateinit var sharedPreference: SharedPreferences
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||||
@@ -48,17 +58,16 @@ class HomeFragment : Fragment() {
|
|||||||
return super.onCreateView(inflater, container, savedInstanceState)
|
return super.onCreateView(inflater, container, savedInstanceState)
|
||||||
}
|
}
|
||||||
|
|
||||||
sharedPreference = requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
|
sharedPreference =
|
||||||
|
requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE)
|
||||||
DataHolder.selectedTest = null
|
DataHolder.selectedTest = null
|
||||||
|
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
viewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
viewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
||||||
if (userData.isNotEmpty()) {
|
|
||||||
|
|
||||||
}
|
|
||||||
deleteIncompleteRegistrations(userData)
|
deleteIncompleteRegistrations(userData)
|
||||||
}
|
}
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
||||||
@@ -77,13 +86,36 @@ class HomeFragment : Fragment() {
|
|||||||
setUserId()
|
setUserId()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hemoCubeViewModel.fireBaseBulkUpload.observe(viewLifecycleOwner) { result ->
|
||||||
|
if (result == "Success") {
|
||||||
|
Toast.makeText(
|
||||||
|
requireContext(),
|
||||||
|
"Test Results Uploaded Successfully",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
if (result == "Error") {
|
||||||
|
Toast.makeText(requireContext(), "Test Results Upload Failed", Toast.LENGTH_SHORT)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
binding.btnLogout.setOnClickListener {
|
binding.btnLogout.setOnClickListener {
|
||||||
logoutUser(requireContext())
|
logoutUser(requireContext())
|
||||||
}
|
}
|
||||||
binding.uploadData.setOnClickListener {
|
binding.uploadData.setOnClickListener {
|
||||||
showUploadDialog(requireContext())
|
showUploadDialog(requireContext())
|
||||||
}
|
}
|
||||||
|
binding.btnNewKit.setOnClickListener {
|
||||||
|
with(sharedPreference.edit()) {
|
||||||
|
putString(Constants.KIT_NUMBER, "")
|
||||||
|
putInt(Constants.KIT_COUNT, 0)
|
||||||
|
apply()
|
||||||
}
|
}
|
||||||
|
startActivity(Intent(requireContext(), KitScanActivity::class.java))
|
||||||
|
requireActivity().finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun setUserId() {
|
private fun setUserId() {
|
||||||
binding.btnSubmit.setOnClickListener {
|
binding.btnSubmit.setOnClickListener {
|
||||||
val userId = binding.userId.text.toString()
|
val userId = binding.userId.text.toString()
|
||||||
@@ -98,8 +130,16 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadUserData() {
|
private fun loadUserData() {
|
||||||
val query = Firebase.firestore.collection("patientData").whereEqualTo("testStatus", false).orderBy("createdAt", Query.Direction.DESCENDING)
|
try {
|
||||||
|
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
|
||||||
|
val currentDate = Date()
|
||||||
|
val formattedDate = dateFormat.format(currentDate)
|
||||||
|
val query = Firebase.firestore.collection("patientData")
|
||||||
|
.whereGreaterThanOrEqualTo("createdAt", formattedDate)
|
||||||
|
.orderBy("createdAt", Query.Direction.DESCENDING)
|
||||||
|
// val query = Firebase.firestore.collection("patientData").whereEqualTo("testStatus", false)
|
||||||
query.get().addOnSuccessListener {
|
query.get().addOnSuccessListener {
|
||||||
if (it.documents.isEmpty()) {
|
if (it.documents.isEmpty()) {
|
||||||
binding.pendingTest.visibility = View.VISIBLE
|
binding.pendingTest.visibility = View.VISIBLE
|
||||||
@@ -110,16 +150,29 @@ class HomeFragment : Fragment() {
|
|||||||
val recyclerViewOptions =
|
val recyclerViewOptions =
|
||||||
FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java)
|
FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java)
|
||||||
.build()
|
.build()
|
||||||
rvAdapter = UserListAdapter(recyclerViewOptions, binding.root)
|
|
||||||
|
val bm = requireContext().getSystemService(BATTERY_SERVICE) as BatteryManager
|
||||||
|
val batLevel: Int = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
|
||||||
|
|
||||||
|
rvAdapter = view?.let {
|
||||||
|
UserListAdapter(requireContext(), hemoCubeViewModel, recyclerViewOptions,
|
||||||
|
it, batLevel)
|
||||||
|
}!!
|
||||||
binding.rvOrder.adapter = rvAdapter
|
binding.rvOrder.adapter = rvAdapter
|
||||||
|
|
||||||
rvAdapter.startListening()
|
rvAdapter.startListening()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun saveUserId(userId: String) {
|
private fun saveUserId(userId: String) {
|
||||||
with(sharedPreference.edit()) {
|
with(sharedPreference.edit()) {
|
||||||
putString(Constants.USER_ID, userId)
|
putString(Constants.USER_ID, userId)
|
||||||
apply()
|
apply()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun logoutUser(context: Context) {
|
private fun logoutUser(context: Context) {
|
||||||
val builder = AlertDialog.Builder(context)
|
val builder = AlertDialog.Builder(context)
|
||||||
builder.setTitle("Log Out")
|
builder.setTitle("Log Out")
|
||||||
@@ -136,8 +189,9 @@ class HomeFragment : Fragment() {
|
|||||||
val dialog = builder.create()
|
val dialog = builder.create()
|
||||||
dialog.show()
|
dialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getData(search: String?, field: String) {
|
private fun getData(search: String?, field: String) {
|
||||||
val capitalizedSearch = search?.replaceFirstChar {
|
search?.replaceFirstChar {
|
||||||
if (search.lowercase()
|
if (search.lowercase()
|
||||||
.startsWith(it.lowercase())
|
.startsWith(it.lowercase())
|
||||||
) it.titlecase(Locale.getDefault()) else it.toString()
|
) it.titlecase(Locale.getDefault()) else it.toString()
|
||||||
@@ -148,10 +202,16 @@ class HomeFragment : Fragment() {
|
|||||||
val recyclerViewOptions =
|
val recyclerViewOptions =
|
||||||
FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java)
|
FirestoreRecyclerOptions.Builder<UserData>().setQuery(query, UserData::class.java)
|
||||||
.build()
|
.build()
|
||||||
rvAdapter = UserListAdapter(recyclerViewOptions, binding.root)
|
val bm = requireContext().getSystemService(BATTERY_SERVICE) as BatteryManager
|
||||||
|
batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
|
||||||
|
|
||||||
|
rvAdapter = view?.let {
|
||||||
|
UserListAdapter(requireContext(), hemoCubeViewModel, recyclerViewOptions, it, batLevel)
|
||||||
|
}!!
|
||||||
binding.rvOrder.adapter = rvAdapter
|
binding.rvOrder.adapter = rvAdapter
|
||||||
rvAdapter.startListening()
|
rvAdapter.startListening()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setSearch() {
|
private fun setSearch() {
|
||||||
binding.searchProduct.setOnQueryTextListener(object :
|
binding.searchProduct.setOnQueryTextListener(object :
|
||||||
androidx.appcompat.widget.SearchView.OnQueryTextListener {
|
androidx.appcompat.widget.SearchView.OnQueryTextListener {
|
||||||
@@ -172,6 +232,7 @@ class HomeFragment : Fragment() {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onQueryTextChange(query: String?): Boolean {
|
override fun onQueryTextChange(query: String?): Boolean {
|
||||||
return if (!query.isNullOrEmpty()) {
|
return if (!query.isNullOrEmpty()) {
|
||||||
val field = when {
|
val field = when {
|
||||||
@@ -189,6 +250,7 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkForLocalDBData() {
|
private fun checkForLocalDBData() {
|
||||||
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
val uploadDataVisibility = if (userDataList.isEmpty()) View.GONE else View.VISIBLE
|
val uploadDataVisibility = if (userDataList.isEmpty()) View.GONE else View.VISIBLE
|
||||||
@@ -200,6 +262,7 @@ class HomeFragment : Fragment() {
|
|||||||
binding.uploadData.visibility = uploadDataVisibility
|
binding.uploadData.visibility = uploadDataVisibility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showUploadDialog(context: Context) {
|
private fun showUploadDialog(context: Context) {
|
||||||
val builder = AlertDialog.Builder(context)
|
val builder = AlertDialog.Builder(context)
|
||||||
builder.setTitle(R.string.upload_db_registration_title)
|
builder.setTitle(R.string.upload_db_registration_title)
|
||||||
@@ -228,9 +291,7 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
requireContext(),
|
requireContext(), R.string.upload_success_message, Toast.LENGTH_SHORT
|
||||||
R.string.upload_success_message,
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,11 +305,6 @@ class HomeFragment : Fragment() {
|
|||||||
hemoCubeViewModel.bulkAddResultTestToDb(userData)
|
hemoCubeViewModel.bulkAddResultTestToDb(userData)
|
||||||
}
|
}
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
Toast.makeText(
|
|
||||||
requireContext(),
|
|
||||||
R.string.upload_success_message,
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -29,7 +30,6 @@ import com.google.firebase.ktx.Firebase
|
|||||||
import `in`.sminnovations.hpostesting.R
|
import `in`.sminnovations.hpostesting.R
|
||||||
import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding
|
import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.tasks.await
|
import kotlinx.coroutines.tasks.await
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -40,6 +40,7 @@ class HemoCubeFragment : Fragment() {
|
|||||||
private lateinit var binding: FragmentHemoCubeReferenceBinding
|
private lateinit var binding: FragmentHemoCubeReferenceBinding
|
||||||
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
||||||
private lateinit var sharedPreferences: SharedPreferences
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
|
val testDetails = DataHolder.selectedTest?.toHemoCubeTestData()
|
||||||
private var isOnline = false
|
private var isOnline = false
|
||||||
private var currentDeviceData: DeviceData? = null
|
private var currentDeviceData: DeviceData? = null
|
||||||
private var resultData: String = ""
|
private var resultData: String = ""
|
||||||
@@ -63,89 +64,96 @@ class HemoCubeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun initViews() {
|
private fun initViews() {
|
||||||
binding.btnSubmit.setOnClickListener {
|
// binding.btnSubmit.setOnClickListener {
|
||||||
val bloodGroupText = binding.etBloodGroup.text.toString()
|
// val bloodGroupText = binding.etBloodGroup.text.toString()
|
||||||
if (bloodGroupText.isEmpty()) {
|
// if (bloodGroupText.isEmpty()) {
|
||||||
binding.etBloodGroup.error = "Please enter your blood group"
|
// binding.etBloodGroup.error = "Please enter your blood group"
|
||||||
} else {
|
// } else {
|
||||||
fetchResult()
|
// activity?.runOnUiThread {
|
||||||
}
|
// binding.progressBar.visibility = View.VISIBLE
|
||||||
}
|
// }
|
||||||
if (isTestOngoing) {
|
// hemoCubeViewModel.uploadHemoCubeResultToDatabase(
|
||||||
binding.btnKit.visibility = View.GONE
|
// isOnline, true, sharedPreferences.getString(Constants.KIT_NUMBER, "")
|
||||||
binding.btnKit.isEnabled = false
|
// )
|
||||||
binding.btnKit.isClickable = false
|
// }
|
||||||
|
// }
|
||||||
}
|
// if (isTestOngoing) {
|
||||||
|
// binding.btnKit.visibility = View.GONE
|
||||||
|
// binding.btnKit.isEnabled = false
|
||||||
|
// binding.btnKit.isClickable = false
|
||||||
|
//
|
||||||
|
// }
|
||||||
binding.btnSubmit.isEnabled = false
|
binding.btnSubmit.isEnabled = false
|
||||||
binding.btnSubmit.isClickable = false
|
binding.btnSubmit.isClickable = false
|
||||||
|
|
||||||
|
|
||||||
binding.btnKit.setOnClickListener {
|
binding.tvName.text = "Name: ${testDetails?.name}\n ID: ${testDetails?._id}"
|
||||||
if (isTestOngoing) {
|
Log.e("nametext",binding.tvName.text.toString())
|
||||||
val title = "WARNING"
|
|
||||||
val message =
|
|
||||||
"There is a on going test, do you want to stop it. if Yes please disconnect the device and connect it again, once you reached to kitDetails Screen"
|
|
||||||
val negativeText = getString(R.string.no)
|
|
||||||
val positiveText = "Yes"
|
|
||||||
|
|
||||||
UIUtils.createAlertDialog(requireContext(),
|
|
||||||
title,
|
|
||||||
message,
|
|
||||||
negativeText,
|
|
||||||
positiveText,
|
|
||||||
object : MyDialogListener {
|
|
||||||
override fun onClickNegativeButton() {
|
|
||||||
|
|
||||||
|
// binding.btnKit.setOnClickListener {
|
||||||
|
// if (isTestOngoing) {
|
||||||
|
// val title = "WARNING"
|
||||||
|
// val message = "There is a on going test, do you want to stop it"
|
||||||
|
// val negativeText = getString(R.string.no)
|
||||||
|
// val positiveText = "Yes"
|
||||||
|
//
|
||||||
|
// UIUtils.createAlertDialog(requireContext(),
|
||||||
|
// title,
|
||||||
|
// message,
|
||||||
|
// negativeText,
|
||||||
|
// positiveText,
|
||||||
|
// object : MyDialogListener {
|
||||||
|
// override fun onClickNegativeButton() {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// override fun onClickPositiveButton() {
|
||||||
|
// resetKitCount()
|
||||||
|
// val intent = Intent(context, KitScanActivity::class.java)
|
||||||
|
// startActivity(intent)
|
||||||
|
// (activity as HemocubeActivity).finish()
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// } else {
|
||||||
|
// resetKitCount()
|
||||||
|
// val intent = Intent(context, KitScanActivity::class.java)
|
||||||
|
// startActivity(intent)
|
||||||
|
// (activity as HemocubeActivity).finish()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onClickPositiveButton() {
|
// private suspend fun checkBloodGroup() {
|
||||||
resetKitCount()
|
// binding.apply {
|
||||||
val intent = Intent(context, KitScanActivity::class.java)
|
// val bloodGroup = etBloodGroup.text.toString()
|
||||||
startActivity(intent)
|
// if (bloodGroup.isEmpty()) {
|
||||||
(activity as HemocubeActivity).finish()
|
// etBloodGroup.error = "Please enter your blood group"
|
||||||
}
|
// } else {
|
||||||
})
|
// val db: FirebaseFirestore = Firebase.firestore
|
||||||
} else {
|
// val userdata = db.collection("patientData")
|
||||||
resetKitCount()
|
// .whereEqualTo("_id", hemoCubeViewModel.testDetails?._id).get().await()
|
||||||
val intent = Intent(context, KitScanActivity::class.java)
|
// if (userdata.documents.isNotEmpty()) {
|
||||||
startActivity(intent)
|
// db.collection("patientData").document(userdata.documents[0].id)
|
||||||
(activity as HemocubeActivity).finish()
|
// .update("bloodGroup", bloodGroup)
|
||||||
}
|
// withContext(Dispatchers.Main) {
|
||||||
}
|
// val i = Intent(
|
||||||
}
|
// requireContext().applicationContext, DashboardActivity::class.java
|
||||||
|
// )
|
||||||
private suspend fun checkBloodGroup() {
|
// startActivity(i)
|
||||||
binding.apply {
|
// (activity as HemocubeActivity).finish()
|
||||||
val bloodGroup = etBloodGroup.text.toString()
|
// }
|
||||||
if (bloodGroup.isEmpty()) {
|
// }
|
||||||
etBloodGroup.error = "Please enter your blood group"
|
// }
|
||||||
} else {
|
// }
|
||||||
val db: FirebaseFirestore = Firebase.firestore
|
// }
|
||||||
val userdata = db.collection("patientData")
|
|
||||||
.whereEqualTo("_id", hemoCubeViewModel.testDetails?._id).get().await()
|
|
||||||
if (userdata.documents.isNotEmpty()) {
|
|
||||||
db.collection("patientData").document(userdata.documents[0].id)
|
|
||||||
.update("bloodGroup", bloodGroup)
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
val i = Intent(
|
|
||||||
requireContext().applicationContext, DashboardActivity::class.java
|
|
||||||
)
|
|
||||||
startActivity(i)
|
|
||||||
(activity as HemocubeActivity).finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun observeViewModel() {
|
private fun observeViewModel() {
|
||||||
hemoCubeViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
|
hemoCubeViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
|
||||||
if (result == "Success") {
|
if (result == "Success") {
|
||||||
showToast("Test Results Uploaded Successfully")
|
showToast("Test Results Uploaded Successfully")
|
||||||
lifecycleScope.launch {
|
// lifecycleScope.launch {
|
||||||
checkBloodGroup()
|
// checkBloodGroup()
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
if (result == "Local") {
|
if (result == "Local") {
|
||||||
showToast("Internet not available, test details stored locally")
|
showToast("Internet not available, test details stored locally")
|
||||||
@@ -168,7 +176,7 @@ class HemoCubeFragment : Fragment() {
|
|||||||
val coefficient1 = coefficients[0]
|
val coefficient1 = coefficients[0]
|
||||||
val coefficient2 = coefficients[1]
|
val coefficient2 = coefficients[1]
|
||||||
val result = coefficient1 * coefficient2
|
val result = coefficient1 * coefficient2
|
||||||
showToast("coefficients: $coefficient1, $coefficient2")
|
// showToast("coefficients: $coefficient1, $coefficient2")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isOnline = isNetworkAvailable
|
isOnline = isNetworkAvailable
|
||||||
@@ -290,6 +298,7 @@ class HemoCubeFragment : Fragment() {
|
|||||||
binding.btnSubmit.isEnabled = true
|
binding.btnSubmit.isEnabled = true
|
||||||
binding.btnSubmit.isClickable = true
|
binding.btnSubmit.isClickable = true
|
||||||
}
|
}
|
||||||
|
fetchResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
stringData.contains("RESULT") || resultData.contains("REND") -> {
|
stringData.contains("RESULT") || resultData.contains("REND") -> {
|
||||||
@@ -428,6 +437,8 @@ class HemoCubeFragment : Fragment() {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
DataHolder.hemoCubeTestData?.apply {
|
DataHolder.hemoCubeTestData?.apply {
|
||||||
|
|
||||||
|
|
||||||
deviceId = deviceSerialNo
|
deviceId = deviceSerialNo
|
||||||
led1Buffer = led1BufferForDevice
|
led1Buffer = led1BufferForDevice
|
||||||
led2Buffer = led2BufferForDevice
|
led2Buffer = led2BufferForDevice
|
||||||
@@ -441,19 +452,13 @@ class HemoCubeFragment : Fragment() {
|
|||||||
this.classificationResult = findResult(calculatedRatio)
|
this.classificationResult = findResult(calculatedRatio)
|
||||||
hemoCubeViewModel.messages.postValue(this.classificationResult)
|
hemoCubeViewModel.messages.postValue(this.classificationResult)
|
||||||
this.resultData = fullReadOutput
|
this.resultData = fullReadOutput
|
||||||
if (!isBufferValueAvailable()) {
|
if (!isUsingExistingBuffer) {
|
||||||
with(sharedPreferences.edit()) {
|
with(sharedPreferences.edit()) {
|
||||||
putString(Constants.BUFFER_VALUE_1, led1Buffer.toString())
|
putString(Constants.BUFFER_VALUE_1, led1Buffer.toString())
|
||||||
putString(Constants.BUFFER_VALUE_2, led2Buffer.toString())
|
putString(Constants.BUFFER_VALUE_2, led2Buffer.toString())
|
||||||
apply()
|
apply()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
activity?.runOnUiThread {
|
|
||||||
binding.progressBar.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
hemoCubeViewModel.uploadHemoCubeResultToDatabase(
|
|
||||||
isOnline, true, sharedPreferences.getString(Constants.KIT_NUMBER, "")
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
@@ -469,9 +474,9 @@ class HemoCubeFragment : Fragment() {
|
|||||||
private fun findResult(calculatedRatio: Double?): String {
|
private fun findResult(calculatedRatio: Double?): String {
|
||||||
try {
|
try {
|
||||||
if (calculatedRatio != null) {
|
if (calculatedRatio != null) {
|
||||||
if (calculatedRatio < 0.085)
|
if (calculatedRatio < 0.05)
|
||||||
return "Inconclusive. Very low Absorbance - Repeat test with Higher Blood Volume"
|
return "Inconclusive. Very low Absorbance - Repeat test with Higher Blood Volume"
|
||||||
if (calculatedRatio in 0.085..0.155)
|
if (calculatedRatio in 0.05..0.155)
|
||||||
return "Normal"
|
return "Normal"
|
||||||
if (calculatedRatio in 0.155..0.175)
|
if (calculatedRatio in 0.155..0.175)
|
||||||
return "Negative Borderline. Repeat Test"
|
return "Negative Borderline. Repeat Test"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.example.hpostesting.data.NetworkStatusLiveData
|
|||||||
import com.example.hpostesting.data.constant.Constants
|
import com.example.hpostesting.data.constant.Constants
|
||||||
import com.example.hpostesting.data.dao.HemoCubeDao
|
import com.example.hpostesting.data.dao.HemoCubeDao
|
||||||
import com.example.hpostesting.data.model.Response
|
import com.example.hpostesting.data.model.Response
|
||||||
|
import com.example.hpostesting.data.model.patient.BufferCheckData
|
||||||
import com.example.hpostesting.data.model.patient.DeviceData
|
import com.example.hpostesting.data.model.patient.DeviceData
|
||||||
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
import com.example.hpostesting.data.model.patient.HemoCubeTestData
|
||||||
import com.example.hpostesting.data.model.patient.toHemoCubeTestData
|
import com.example.hpostesting.data.model.patient.toHemoCubeTestData
|
||||||
@@ -44,6 +45,7 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
val networkStatusLiveData: LiveData<Boolean>
|
val networkStatusLiveData: LiveData<Boolean>
|
||||||
get() = _networkStatusLiveData
|
get() = _networkStatusLiveData
|
||||||
val fireBaseUpload = MutableLiveData<String>()
|
val fireBaseUpload = MutableLiveData<String>()
|
||||||
|
val fireBaseBulkUpload = MutableLiveData<String>()
|
||||||
fun uploadHemoCubeResultToDatabase(isOnline: Boolean, testStatus: Boolean, kitSerial: String?) =
|
fun uploadHemoCubeResultToDatabase(isOnline: Boolean, testStatus: Boolean, kitSerial: String?) =
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
if (kitSerial != null) {
|
if (kitSerial != null) {
|
||||||
@@ -68,6 +70,18 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fun uploadHemoCubeResultToDatabaseforbuffercheckN(bufferCheckData: BufferCheckData) =
|
||||||
|
viewModelScope.launch {
|
||||||
|
addResultTestToDbforbuffercheck(bufferCheckData)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun getDeviceData(deviceId: String?) = viewModelScope.launch {
|
fun getDeviceData(deviceId: String?) = viewModelScope.launch {
|
||||||
deviceData.postValue(deviceId?.let { repository.getDeviceDataById(it) })
|
deviceData.postValue(deviceId?.let { repository.getDeviceDataById(it) })
|
||||||
}
|
}
|
||||||
@@ -125,6 +139,29 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun addResultTestToDbforbuffercheck(bufferCheckData: BufferCheckData) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
try {
|
||||||
|
|
||||||
|
when (val response = repository.addTestToDatabaseforBufferCheck(bufferCheckData)) {
|
||||||
|
is Response.Success -> {
|
||||||
|
Log.i("Testdb", "Data uploaded to Firestore successfully")
|
||||||
|
fireBaseUpload.postValue("Success")
|
||||||
|
}
|
||||||
|
|
||||||
|
is Response.Error -> {
|
||||||
|
Log.e("Testdb", "Error uploading data to Firestore: $response")
|
||||||
|
fireBaseUpload.postValue("Error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e("Testdb", "Exception during data upload: ${e.message}")
|
||||||
|
fireBaseUpload.postValue("Error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun bulkAddResultTestToDb(userData: HemoCubeTestData) {
|
fun bulkAddResultTestToDb(userData: HemoCubeTestData) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
userData.reportUploadTime = SimpleDateFormat(
|
userData.reportUploadTime = SimpleDateFormat(
|
||||||
@@ -132,11 +169,13 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
).format(Calendar.getInstance().time)
|
).format(Calendar.getInstance().time)
|
||||||
when (repository.addTestToDatabase(userData)) {
|
when (repository.addTestToDatabase(userData)) {
|
||||||
is Response.Success -> {
|
is Response.Success -> {
|
||||||
fireBaseUpload.postValue("Success")
|
fireBaseBulkUpload.postValue("Success")
|
||||||
deleteById(userData._id)
|
deleteById(userData._id)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {}
|
else -> {
|
||||||
|
fireBaseBulkUpload.postValue("Error")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
app/src/main/res/drawable/ic_add.xml
Normal file
5
app/src/main/res/drawable/ic_add.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#000000" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@color/black" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
|
||||||
|
</vector>
|
||||||
24
app/src/main/res/layout/dialog_custom.xml
Normal file
24
app/src/main/res/layout/dialog_custom.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/til_blood_group"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<AutoCompleteTextView
|
||||||
|
android:id="@+id/et_blood_group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/select_blood_group"
|
||||||
|
android:inputType="none"
|
||||||
|
android:labelFor="@id/til_blood_group"
|
||||||
|
app:simpleItems="@array/blood_group" />
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
</LinearLayout>
|
||||||
@@ -4,19 +4,21 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".presentation.dashboard.GalleryFragment">
|
tools:context="com.example.hpostesting.presentation.dashboard.GalleryFragment">
|
||||||
|
|
||||||
<TextView
|
<Button
|
||||||
android:id="@+id/text_gallery"
|
android:id="@+id/btn_submit"
|
||||||
style="@style/title1"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="24dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:textAlignment="center"
|
android:layout_marginTop="24dp"
|
||||||
android:textSize="20sp"
|
android:clickable="false"
|
||||||
android:text="@string/to_be_launched_in_next_version_of_the_app"
|
android:text="@string/check_buffer"
|
||||||
|
android:textColor="@color/white"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -27,22 +27,32 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:text="@string/step4"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_title" />
|
app:layout_constraintTop_toBottomOf="@id/tv_title" />
|
||||||
|
|
||||||
|
<!-- <TextView-->
|
||||||
|
<!-- android:id="@+id/tv_subtitle3"-->
|
||||||
|
<!-- style="@style/title2"-->
|
||||||
|
<!-- android:layout_width="0dp"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:layout_marginHorizontal="24dp"-->
|
||||||
|
<!-- android:layout_marginTop="16dp"-->
|
||||||
|
<!-- android:text="@string/step5"-->
|
||||||
|
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
||||||
|
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
||||||
|
<!-- app:layout_constraintTop_toBottomOf="@id/tv_subtitle2" />-->
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_subtitle3"
|
android:visibility="gone"
|
||||||
|
android:id="@+id/tv_name"
|
||||||
style="@style/title2"
|
style="@style/title2"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="24dp"
|
android:layout_marginHorizontal="24dp"
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:text="@string/step5"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_subtitle2" />
|
tools:ignore="MissingConstraints" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_subtitle4"
|
android:id="@+id/tv_subtitle4"
|
||||||
@@ -53,46 +63,90 @@
|
|||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textColor="@color/red"
|
android:textColor="@color/red"
|
||||||
android:textSize="22sp"
|
android:textSize="18sp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_subtitle3" />
|
app:layout_constraintTop_toBottomOf="@id/et_abha_id" />
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <Button-->
|
||||||
|
<!-- android:visibility="gone"-->
|
||||||
|
<!-- android:id="@+id/btn_samplestart"-->
|
||||||
|
<!-- android:layout_width="wrap_content"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:layout_marginHorizontal="16dp"-->
|
||||||
|
<!-- android:layout_marginTop="24dp"-->
|
||||||
|
<!-- android:clickable="false"-->
|
||||||
|
<!-- android:text="@string/Start_Sample"-->
|
||||||
|
<!-- android:textColor="@color/white"-->
|
||||||
|
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
||||||
|
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
||||||
|
<!-- app:layout_constraintTop_toBottomOf="@id/til_blood_group" />-->
|
||||||
|
|
||||||
|
|
||||||
<!-- <Button-->
|
<!-- <Button-->
|
||||||
<!-- android:visibility="gone"-->
|
<!-- android:id="@+id/btn_placebuffer"-->
|
||||||
<!-- android:id="@+id/btn_samplestart"-->
|
<!-- android:layout_width="wrap_content"-->
|
||||||
<!-- android:layout_width="wrap_content"-->
|
<!-- android:layout_height="wrap_content"-->
|
||||||
<!-- android:layout_height="wrap_content"-->
|
<!-- android:layout_marginHorizontal="16dp"-->
|
||||||
<!-- android:layout_marginHorizontal="16dp"-->
|
<!-- android:layout_marginTop="24dp"-->
|
||||||
<!-- android:layout_marginTop="24dp"-->
|
<!-- android:clickable="false"-->
|
||||||
<!-- android:clickable="false"-->
|
<!-- android:text="@string/place_buffer"-->
|
||||||
<!-- android:text="@string/Start_Sample"-->
|
<!-- android:textColor="@color/white"-->
|
||||||
<!-- android:textColor="@color/white"-->
|
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
||||||
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
||||||
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
<!-- app:layout_constraintTop_toBottomOf="@id/btn_submit" />-->
|
||||||
<!-- app:layout_constraintTop_toBottomOf="@id/til_blood_group" />-->
|
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title2"
|
||||||
|
style="@style/title1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="48dp"
|
||||||
|
android:text="@string/enter_kit_serial_number_manually"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
tools:ignore="MissingConstraints" />
|
||||||
|
|
||||||
<!-- <Button-->
|
|
||||||
<!-- android:id="@+id/btn_placebuffer"-->
|
|
||||||
<!-- android:layout_width="wrap_content"-->
|
|
||||||
<!-- android:layout_height="wrap_content"-->
|
|
||||||
<!-- android:layout_marginHorizontal="16dp"-->
|
|
||||||
<!-- android:layout_marginTop="24dp"-->
|
|
||||||
<!-- android:clickable="false"-->
|
|
||||||
<!-- android:text="@string/place_buffer"-->
|
|
||||||
<!-- android:textColor="@color/white"-->
|
|
||||||
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
|
||||||
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
|
||||||
<!-- app:layout_constraintTop_toBottomOf="@id/btn_submit" />-->
|
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/et_abha_id"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="24dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/btn_go"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_title2">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/name_edit_text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxLength="17"
|
||||||
|
android:inputType="text"
|
||||||
|
android:hint="@string/serial_number" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/btn_go"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="24dp"
|
||||||
|
android:text="@string/go"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/et_abha_id"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="1.0"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/et_abha_id"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/et_abha_id" />
|
||||||
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
android:visibility="gone"
|
||||||
android:id="@+id/btn_submit"
|
android:id="@+id/btn_submit"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@@ -103,51 +157,51 @@
|
|||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/til_blood_group" />
|
app:layout_constraintTop_toBottomOf="@id/tv_subtitle4" />
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<!-- <com.google.android.material.textfield.TextInputLayout-->
|
||||||
android:id="@+id/til_blood_group"
|
<!-- android:id="@+id/til_blood_group"-->
|
||||||
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
<!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"-->
|
||||||
android:layout_width="match_parent"
|
<!-- android:layout_width="match_parent"-->
|
||||||
android:layout_height="wrap_content"
|
<!-- android:layout_height="wrap_content"-->
|
||||||
android:layout_marginHorizontal="24dp"
|
<!-- android:layout_marginHorizontal="24dp"-->
|
||||||
android:layout_marginTop="16dp"
|
<!-- android:layout_marginTop="16dp"-->
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_subtitle4">
|
<!-- app:layout_constraintTop_toBottomOf="@id/tv_subtitle4">-->
|
||||||
|
|
||||||
<AutoCompleteTextView
|
<!-- <AutoCompleteTextView-->
|
||||||
android:id="@+id/et_blood_group"
|
<!-- android:id="@+id/et_blood_group"-->
|
||||||
android:layout_width="match_parent"
|
<!-- android:layout_width="match_parent"-->
|
||||||
android:layout_height="wrap_content"
|
<!-- android:layout_height="wrap_content"-->
|
||||||
android:hint="@string/select_blood_group"
|
<!-- android:hint="@string/select_blood_group"-->
|
||||||
android:inputType="none"
|
<!-- android:inputType="none"-->
|
||||||
android:labelFor="@id/til_blood_group"
|
<!-- android:labelFor="@id/til_blood_group"-->
|
||||||
app:simpleItems="@array/blood_group" />
|
<!-- app:simpleItems="@array/blood_group" />-->
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
<!-- </com.google.android.material.textfield.TextInputLayout>-->
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_kit"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="10dp"
|
|
||||||
android:text="@string/new_kit"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<!-- <Button-->
|
<!-- <Button-->
|
||||||
<!-- android:id="@+id/btn_buffer"-->
|
<!-- android:id="@+id/btn_kit"-->
|
||||||
<!-- android:layout_width="wrap_content"-->
|
<!-- android:layout_width="wrap_content"-->
|
||||||
<!-- android:layout_height="wrap_content"-->
|
<!-- android:layout_height="wrap_content"-->
|
||||||
<!-- android:text="@string/new_buffer"-->
|
|
||||||
<!-- android:textColor="@color/white"-->
|
|
||||||
<!-- android:layout_margin="10dp"-->
|
<!-- android:layout_margin="10dp"-->
|
||||||
|
<!-- android:text="@string/new_kit"-->
|
||||||
|
<!-- android:textColor="@color/white"-->
|
||||||
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
|
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
|
||||||
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
<!-- app:layout_constraintEnd_toEndOf="parent"-->
|
||||||
<!-- app:layout_constraintEnd_toStartOf="@id/btn_kit"/>-->
|
<!-- app:layout_constraintStart_toStartOf="parent" />-->
|
||||||
|
|
||||||
|
<!-- <Button-->
|
||||||
|
<!-- android:id="@+id/btn_buffer"-->
|
||||||
|
<!-- android:layout_width="wrap_content"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- android:text="@string/new_buffer"-->
|
||||||
|
<!-- android:textColor="@color/white"-->
|
||||||
|
<!-- android:layout_margin="10dp"-->
|
||||||
|
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
|
||||||
|
<!-- app:layout_constraintStart_toStartOf="parent"-->
|
||||||
|
<!-- app:layout_constraintEnd_toStartOf="@id/btn_kit"/>-->
|
||||||
|
|
||||||
<!-- <Button-->
|
<!-- <Button-->
|
||||||
<!-- android:id="@+id/btn_read"-->
|
<!-- android:id="@+id/btn_read"-->
|
||||||
@@ -175,7 +229,6 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</layout>
|
||||||
|
|
||||||
</layout>
|
|
||||||
@@ -194,6 +194,27 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@+id/radioGroup"
|
app:layout_constraintTop_toBottomOf="@+id/radioGroup"
|
||||||
tools:listitem="@layout/user_item_view"/>
|
tools:listitem="@layout/user_item_view"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/label"
|
||||||
|
style="@style/title1_1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/new_kit"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/btnNewKit"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
|
android:id="@+id/btnNewKit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:backgroundTint="@color/primary"
|
||||||
|
android:contentDescription="@string/new_kit"
|
||||||
|
android:src="@drawable/ic_add"
|
||||||
|
app:elevation="1dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,24 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/userId"
|
app:layout_constraintTop_toBottomOf="@id/userId"
|
||||||
tools:text="Test Status: Completed"/>
|
tools:text="Test Status: Completed"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_startIncubation"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:text="@string/start_incubation"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/btn_blood"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/btn_blood" />
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_blood"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:text="@string/blood_group"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/btn_startIncubation"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/teststatus" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -192,5 +192,7 @@
|
|||||||
<string name="test_completed">Test Completed</string>
|
<string name="test_completed">Test Completed</string>
|
||||||
<string name="select_blood_group">Select Blood Group</string>
|
<string name="select_blood_group">Select Blood Group</string>
|
||||||
<string name="all_registered_user_are_tested_successfully">All registered user are tested successfully</string>
|
<string name="all_registered_user_are_tested_successfully">All registered user are tested successfully</string>
|
||||||
|
<string name="start_incubation">Incubate</string>
|
||||||
|
<string name="check_buffer">Check Buffer</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user