Compare commits

..

11 Commits

Author SHA1 Message Date
Pritimay Sarkar
0624a8fb5e Merge branch 'Homocube' into 'CrashIssues'
# Conflicts:
#   app/build.gradle
#   app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt
#   app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt
#   app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt
2023-09-16 05:42:49 +00:00
mohamedkaif356
d5553d9a23 Error resolved 2023-09-15 12:44:54 +05:30
smileomi18@gmail.com
a54c720d8f App version automatic updation addede 2023-09-15 12:32:33 +05:30
smileomi18@gmail.com
f183a1dab3 log deleted 2023-09-14 13:59:24 +05:30
mohamedkaif356
281946ffde Release 2.1.6 2023-09-13 20:42:21 +05:30
mohamedkaif356
7e32a10186 Release 2.1.5 2023-09-13 20:26:26 +05:30
mohamedkaif356
d823821026 App distrubation 2023-09-13 20:25:37 +05:30
smileomi18@gmail.com
61e5fbf4a1 production Issues resolved 2023-09-13 20:06:49 +05:30
smileomi18@gmail.com
e5da37064a production errors 2023-09-13 14:40:46 +05:30
smileomi18@gmail.com
19289a5c33 production errors 2023-09-12 18:02:39 +05:30
smileomi18@gmail.com
da3a89245e production errors 2023-09-12 16:56:06 +05:30
7 changed files with 59 additions and 110 deletions

2
app/.gitignore vendored
View File

@@ -1,3 +1,3 @@
/build /build
/google-services* /google-services.json
/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 10 versionCode 7
versionName "2.1.10" versionName "2.1.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -29,6 +29,5 @@ 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,9 +91,6 @@ 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"
@@ -172,41 +169,33 @@ 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 ->
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 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() {
@@ -282,7 +271,6 @@ class HemoCubeFragment : Fragment() {
}) })
} catch (e: Exception) { } catch (e: Exception) {
showToast("test is going on") showToast("test is going on")
Firebase.crashlytics.recordException(e)
} }
} }
@@ -295,18 +283,14 @@ class HemoCubeFragment : Fragment() {
resultData += fullReadOutput.toString() resultData += fullReadOutput.toString()
when { when {
stringData.contains("ERROR 500") -> stringData.contains("ERROR 500") -> showError500Dialog()
// 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
@@ -409,7 +393,6 @@ class HemoCubeFragment : Fragment() {
override fun onClickNegativeButton() {} override fun onClickNegativeButton() {}
override fun onClickPositiveButton() { override fun onClickPositiveButton() {
listenToHemoCube()
startSampleProcess() startSampleProcess()
} }
}) })
@@ -431,10 +414,7 @@ class HemoCubeFragment : Fragment() {
} else { } else {
result[4].toDoubleOrNull() result[4].toDoubleOrNull()
} }
val pInfo = requireActivity().packageManager.getPackageInfo( val version = BuildConfig.VERSION_NAME
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)
@@ -459,9 +439,7 @@ 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()) {
@@ -478,42 +456,15 @@ 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) {
@@ -559,11 +510,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,7 +92,6 @@ 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/til_blood_group" /> app:layout_constraintTop_toBottomOf="@id/btn_samplestart" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/til_blood_group" android:id="@+id/til_blood_group"