Compare commits

..

12 Commits

Author SHA1 Message Date
smileomi18@gmail.com
5966af95eb added separate buttons for place buffer and sample in new branch, and also buffer made compulsory for every test 2023-09-21 11:02:36 +05:30
Pritimay Sarkar
095f9fb027 sorting user list in decending order
- create index
2023-09-18 14:40:58 +05:30
Pritimay Sarkar
1fb938bd0d release 2.1.10 2023-09-18 11:11:05 +05:30
Pritimay Sarkar
865922e90e disable app distribution for stoping its alert 2023-09-18 11:08:06 +05:30
Pritimay Sarkar
e71496e423 remove start buffer and sample button from prod build
- add firebase exception log
2023-09-18 10:57:02 +05:30
Pritimay Sarkar
472b50562b ignore keys 2023-09-18 02:33:27 +05:30
Pritimay Sarkar
81e8567b49 remove BuildConfig 2023-09-18 02:26:22 +05:30
Pritimay Sarkar
3f8b931684 Merge branch 'classification' into Homocube 2023-09-18 02:19:47 +05:30
Pritimay Sarkar
270cee7a9c show classification in screen message before db save 2023-09-18 02:01:23 +05:30
Pritimay Sarkar
515ab24ce6 add result classification
- add result classification
	- add sample start command for positive confirmation
	- remove toast on result screen
2023-09-17 23:46:30 +05:30
Pritimay Sarkar
e455cacf69 Merge branch 'CrashIssues' into 'Homocube'
production errors

See merge request sminnovations/hpos!4
2023-09-16 05:43:27 +00:00
Mariya Varghese
45613b2709 production errors 2023-09-16 05:43:27 +00:00
7 changed files with 110 additions and 59 deletions

2
app/.gitignore vendored
View File

@@ -1,3 +1,3 @@
/build /build
/google-services.json /google-services*
/idea /idea

View File

@@ -18,8 +18,8 @@ android {
applicationId "in.sminnovations.hpostesting" applicationId "in.sminnovations.hpostesting"
minSdk 21 minSdk 21
targetSdk 34 targetSdk 34
versionCode 7 versionCode 10
versionName "2.1.7" versionName "2.1.10"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -29,5 +29,6 @@ data class HemoCubeTestData(
var led1Average: Double? = null, var led1Average: Double? = null,
var led2Average: Double? = null, var led2Average: Double? = null,
var deviceRatio: Double? = null, var deviceRatio: Double? = null,
var calculatedRatio: Double? = null var calculatedRatio: Double? = null,
var classificationResult: String = ""
) )

View File

@@ -11,8 +11,8 @@ 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.FirebaseAppDistribution
import com.google.firebase.appdistribution.FirebaseAppDistributionException //import com.google.firebase.appdistribution.FirebaseAppDistributionException
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.ActivityDashboardBinding import `in`.sminnovations.hpostesting.databinding.ActivityDashboardBinding
@@ -60,25 +60,25 @@ class DashboardActivity : AppCompatActivity() {
super.onResume() super.onResume()
// Copy and paste this into any part of your app - for example, in your main // Copy and paste this into any part of your app - for example, in your main
// activity's onResume method. // activity's onResume method.
val firebaseAppDistribution = FirebaseAppDistribution.getInstance() // val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
firebaseAppDistribution.updateIfNewReleaseAvailable() // firebaseAppDistribution.updateIfNewReleaseAvailable()
.addOnProgressListener { updateProgress -> // .addOnProgressListener { updateProgress ->
Toast.makeText(this, "Updating", Toast.LENGTH_SHORT).show() // Toast.makeText(this, "Updating", Toast.LENGTH_SHORT).show()
} // }
.addOnFailureListener { e -> // .addOnFailureListener { e ->
// (Optional) Handle errors. // // (Optional) Handle errors.
if (e is FirebaseAppDistributionException) { // if (e is FirebaseAppDistributionException) {
when (e.errorCode) { // when (e.errorCode) {
FirebaseAppDistributionException.Status.NOT_IMPLEMENTED -> { // FirebaseAppDistributionException.Status.NOT_IMPLEMENTED -> {
// SDK did nothing. This is expected when building for Play. // // SDK did nothing. This is expected when building for Play.
} // }
//
else -> { // else -> {
// Handle other errors. // // Handle other errors.
} // }
} // }
} // }
} // }
} }

View File

@@ -22,10 +22,10 @@ import com.example.hpostesting.presentation.UsbServiceListener
import com.example.hpostesting.presentation.dashboard.DashboardActivity import com.example.hpostesting.presentation.dashboard.DashboardActivity
import com.example.hpostesting.presentation.utils.MyDialogListener import com.example.hpostesting.presentation.utils.MyDialogListener
import com.example.hpostesting.presentation.utils.UIUtils import com.example.hpostesting.presentation.utils.UIUtils
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 `in`.sminnovations.hpostesting.BuildConfig
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
@@ -47,7 +47,7 @@ class HemoCubeFragment : Fragment() {
private var isTestOngoing = false private var isTestOngoing = false
private var startListening = MutableLiveData<Boolean>(false) private var startListening = MutableLiveData<Boolean>(false)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?,
): View { ): View {
binding = FragmentHemoCubeReferenceBinding.inflate(inflater, container, false) binding = FragmentHemoCubeReferenceBinding.inflate(inflater, container, false)
sharedPreferences = sharedPreferences =
@@ -91,6 +91,9 @@ class HemoCubeFragment : Fragment() {
it.visibility = View.GONE it.visibility = View.GONE
} }
binding.btnKit.setOnClickListener { binding.btnKit.setOnClickListener {
if (isTestOngoing) { if (isTestOngoing) {
val title = "WARNING" val title = "WARNING"
@@ -169,41 +172,49 @@ class HemoCubeFragment : Fragment() {
hemoCubeViewModel.deviceData.observe(viewLifecycleOwner) { hemoCubeViewModel.deviceData.observe(viewLifecycleOwner) {
currentDeviceData = it currentDeviceData = it
// showToast(calculateRatio(0.17).toString())
} }
hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isNetworkAvailable -> hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isNetworkAvailable ->
isOnline = isNetworkAvailable apply {
DataHolder.hemoCubeTestData?.let {
currentDeviceData?.coefficients?.let { coefficients ->
val coefficient1 = coefficients[0]
val coefficient2 = coefficients[1]
val result = coefficient1 * coefficient2
showToast("coefficients: $coefficient1, $coefficient2")
}
}
isOnline = isNetworkAvailable
}
} }
hemoCubeViewModel.messages.observe(viewLifecycleOwner) { hemoCubeViewModel.messages.observe(viewLifecycleOwner) {
binding.tvSubtitle4.text = it binding.tvSubtitle4.text = it
} }
startListening.observe(viewLifecycleOwner) { // startListening.observe(viewLifecycleOwner) {
if (it) { // if (it) {
lifecycleScope.launch { // lifecycleScope.launch {
delay(1000) // delay(1000)
if (binding.tvSubtitle4.text.toString().isEmpty()) { // if (binding.tvSubtitle4.text.toString().isEmpty()) {
(activity as HemocubeActivity).reconnectDevice() // (activity as HemocubeActivity).reconnectDevice()
if (isBufferValueAvailable()) { // if (isBufferValueAvailable()) {
showBufferAlertDialog() // showBufferAlertDialog()
} else { // } else {
listenToHemoCube() // listenToHemoCube()
startBufferProcess() // startBufferProcess()
} // }
} // }
} // }
} // }
} // }
} }
private fun checkAndStartProcess() { private fun checkAndStartProcess() {
// if (isBufferValueAvailable()) { // if (isBufferValueAvailable()) {
// showBufferAlertDialog() // showBufferAlertDialog()
// } else { // } else {
listenToHemoCube() listenToHemoCube()
startBufferProcess() startBufferProcess()
// } // }
} }
@@ -271,6 +282,7 @@ class HemoCubeFragment : Fragment() {
}) })
} catch (e: Exception) { } catch (e: Exception) {
showToast("test is going on") showToast("test is going on")
Firebase.crashlytics.recordException(e)
} }
} }
@@ -283,14 +295,18 @@ class HemoCubeFragment : Fragment() {
resultData += fullReadOutput.toString() resultData += fullReadOutput.toString()
when { when {
stringData.contains("ERROR 500") -> showError500Dialog() stringData.contains("ERROR 500") ->
// showError500Dialog()
checkAndStartProcess()
stringData.contains("ERROR 501") -> showError501Dialog() stringData.contains("ERROR 501") -> showError501Dialog()
stringData.contains("#Buffer Completed") -> stringData.contains("#Buffer Completed") ->
// showStartSampleDialog()
activity?.runOnUiThread { activity?.runOnUiThread {
binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.visibility = View.VISIBLE
binding.btnSamplestart.isClickable = true binding.btnSamplestart.isClickable = true
} }
stringData.contains("#Sample Completed") -> { stringData.contains("#Sample Completed") -> {
activity?.runOnUiThread { activity?.runOnUiThread {
binding.btnSubmit.isEnabled = true binding.btnSubmit.isEnabled = true
@@ -393,6 +409,7 @@ class HemoCubeFragment : Fragment() {
override fun onClickNegativeButton() {} override fun onClickNegativeButton() {}
override fun onClickPositiveButton() { override fun onClickPositiveButton() {
listenToHemoCube()
startSampleProcess() startSampleProcess()
} }
}) })
@@ -414,7 +431,10 @@ class HemoCubeFragment : Fragment() {
} else { } else {
result[4].toDoubleOrNull() result[4].toDoubleOrNull()
} }
val version = BuildConfig.VERSION_NAME val pInfo = requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
)
val version = pInfo.versionName
val led1Sample = result[5].toDoubleOrNull() val led1Sample = result[5].toDoubleOrNull()
val led2Sample = result[6].toDoubleOrNull() val led2Sample = result[6].toDoubleOrNull()
val led1Average = log10(led1BufferForDevice?.div(led1Sample!!) ?: 0.0) val led1Average = log10(led1BufferForDevice?.div(led1Sample!!) ?: 0.0)
@@ -439,7 +459,9 @@ class HemoCubeFragment : Fragment() {
this.led1Average = led1Average this.led1Average = led1Average
this.led2Average = led2Average this.led2Average = led2Average
this.deviceRatio = deviceRatio this.deviceRatio = deviceRatio
// this.calculatedRatio = calculateRatio(deviceRatio) this.calculatedRatio = calculateRatio(deviceRatio)
this.classificationResult = findResult(calculatedRatio)
hemoCubeViewModel.messages.postValue(this.classificationResult)
this.resultData = fullReadOutput this.resultData = fullReadOutput
if (!isBufferValueAvailable()) { if (!isBufferValueAvailable()) {
with(sharedPreferences.edit()) { with(sharedPreferences.edit()) {
@@ -456,15 +478,42 @@ class HemoCubeFragment : Fragment() {
) )
} }
} }
} catch (e: Exception) {
} catch (_: Exception) {
Toast.makeText( Toast.makeText(
requireContext(), requireContext(),
"Error while processing device data", "Error while processing device data",
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
Firebase.crashlytics.recordException(e)
} }
}
private fun findResult(calculatedRatio: Double?): String {
try {
if (calculatedRatio != null) {
if (calculatedRatio < 0.085)
return "Inconclusive. Very low Absorbance - Repeat test with Higher Blood Volume"
if (calculatedRatio in 0.085..0.155)
return "Normal"
if (calculatedRatio in 0.155..0.175)
return "Negative Borderline. Repeat Test"
if (calculatedRatio in 0.175..0.22)
return "Sickle Cell Trait"
if (calculatedRatio in 0.22..0.25)
return "Positive for Sickle Cell. HPLC for Confirmation"
if (calculatedRatio in 0.25..0.35)
return "Sickle Cell Disease"
if (calculatedRatio > 0.35)
return "Inconclusive. Repeat with test with lower volume of blood"
} else {
return "NULL"
}
} catch (e: Exception) {
showToast("error while performing classification")
Firebase.crashlytics.recordException(e)
return "ERROR"
}
return "NULL"
} }
private fun showToast(message: String) { private fun showToast(message: String) {
@@ -510,11 +559,11 @@ class HemoCubeFragment : Fragment() {
}) })
} }
// private fun calculateRatio(ratio: Double): Double { private fun calculateRatio(ratio: Double): Double {
// val coefficient1 = currentDeviceData?.coefficients?.get(0) ?: 0.0 val coefficient1 = currentDeviceData?.coefficients?.get(0) ?: 0.0
// val coefficient2 = currentDeviceData?.coefficients?.get(1) ?: 0.0 val coefficient2 = currentDeviceData?.coefficients?.get(1) ?: 0.0
// return coefficient1 * ratio + coefficient2 return coefficient1 * ratio + coefficient2
// } }
private fun parseResult(frames: List<String>): String { private fun parseResult(frames: List<String>): String {
val lines = mutableListOf<String>() val lines = mutableListOf<String>()

View File

@@ -92,6 +92,7 @@ class HemoCubeViewModel @Inject constructor(
testDetails?.led2Average = DataHolder.hemoCubeTestData?.led2Average testDetails?.led2Average = DataHolder.hemoCubeTestData?.led2Average
testDetails?.deviceRatio = DataHolder.hemoCubeTestData?.deviceRatio testDetails?.deviceRatio = DataHolder.hemoCubeTestData?.deviceRatio
testDetails?.calculatedRatio = DataHolder.hemoCubeTestData?.calculatedRatio testDetails?.calculatedRatio = DataHolder.hemoCubeTestData?.calculatedRatio
testDetails?.classificationResult = DataHolder.hemoCubeTestData?.classificationResult!!
} }
private fun addResultTestToDb() { private fun addResultTestToDb() {

View File

@@ -103,7 +103,7 @@
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_samplestart" /> app:layout_constraintTop_toBottomOf="@id/til_blood_group" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/til_blood_group" android:id="@+id/til_blood_group"