Updates in results page, calculation methods & more. (working)

This commit is contained in:
vsuryakumar
2023-01-30 13:52:50 +05:30
parent 4e42977fef
commit d5c1c33e41
11 changed files with 443 additions and 234 deletions

17
.idea/deploymentTargetDropDown.xml generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="192.168.0.135:5555" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-01-30T07:49:19.748240Z" />
</component>
</project>

6
.idea/misc.xml generated
View File

@@ -3,14 +3,18 @@
<component name="DesignSurface"> <component name="DesignSurface">
<option name="filePathToZoomLevelMap"> <option name="filePathToZoomLevelMap">
<map> <map>
<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_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_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_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_new_label_24.xml" value="0.243" />
<entry key="app/src/main/res/drawable/progressbar_drawable.xml" value="0.1885" /> <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_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/font/inter_bold.xml" value="0.33487179487179486" />
<entry key="app/src/main/res/layout/activity_main.xml" value="0.25" /> <entry key="app/src/main/res/layout/activity_main.xml" value="0.32026519775390627" />
<entry key="app/src/main/res/layout/activity_splash.xml" value="0.24375" /> <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/activity_test_right.xml" value="0.24375" />
<entry key="app/src/main/res/layout/fragment_test_right_exp_reference.xml" value="0.2972222222222222" /> <entry key="app/src/main/res/layout/fragment_test_right_exp_reference.xml" value="0.2972222222222222" />

View File

@@ -1,11 +1,19 @@
package com.example.refactoredapp.data package com.example.refactoredapp.data
import android.os.Environment import com.example.refactoredapp.data.model.TestRightDeviceConstants
import com.example.refactoredapp.R
object DataHolder { object DataHolder {
var isStoragePermissionGranted = false var isStoragePermissionGranted = false
var isAppFolderCreated = false var isAppFolderCreated = false
var appFolderPath = "" var appFolderPath = ""
// var isReferenceTaken = false var isReferenceTaken = false
var sampleReadCounter = 0
var deviceConstant: TestRightDeviceConstants? = null
/* Contains wavelength -> pixel no.*/
val wavelengthToPixelArray = ArrayList<Double>()
/* (For reference/baseline) Contains pixel no. -> Intensity of light falling on that pixel */
val intensityReferenceArray = ArrayList<Double>()
} }

View File

@@ -11,7 +11,8 @@ import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.refactoredapp.data.Constants import com.example.refactoredapp.data.constant.Constants
import com.example.refactoredapp.data.DataHolder
import com.example.refactoredapp.databinding.ActivityTestRightBinding import com.example.refactoredapp.databinding.ActivityTestRightBinding
import com.example.refactoredapp.util.MyViewModelFactory import com.example.refactoredapp.util.MyViewModelFactory
import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialDriver
@@ -64,7 +65,10 @@ class TestRightActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityTestRightBinding.inflate(layoutInflater) binding = ActivityTestRightBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
viewModel = ViewModelProvider(this, MyViewModelFactory(this.applicationContext))[TestRightViewModel::class.java] viewModel = ViewModelProvider(
this,
MyViewModelFactory(this.applicationContext)
)[TestRightViewModel::class.java]
// Connected or not connected icon with livetime status using live data // Connected or not connected icon with livetime status using live data
@@ -73,12 +77,13 @@ class TestRightActivity : AppCompatActivity() {
} }
private fun testing() { // private fun testing() {
supportFragmentManager.beginTransaction() // supportFragmentManager.beginTransaction()
.replace(binding.flMain.id, TestRightExpSample()).commit() // .replace(binding.flMain.id, TestRightExpSample()).commit()
} // }
private fun connectUsb(permissionGranted: Boolean) { private fun connectUsb(permissionGranted: Boolean) {
Log.d(TAG, "connectUsb() called, permission variable = $permissionGranted")
val manager = getSystemService(Context.USB_SERVICE) as UsbManager val manager = getSystemService(Context.USB_SERVICE) as UsbManager
val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager) val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
@@ -88,7 +93,7 @@ class TestRightActivity : AppCompatActivity() {
mDriver = availableDrivers[0] mDriver = availableDrivers[0]
mConnection = manager.openDevice(mDriver.device) mConnection = manager.openDevice(mDriver.device)
if (mConnection == null){ if (mConnection == null) {
requestUserPermission(manager, mDriver.device) requestUserPermission(manager, mDriver.device)
} else { } else {
setupService() setupService()
@@ -100,14 +105,24 @@ class TestRightActivity : AppCompatActivity() {
* Request user permission. The response will be received in the BroadcastReceiver * Request user permission. The response will be received in the BroadcastReceiver
*/ */
private fun requestUserPermission(manager: UsbManager, device: UsbDevice) { private fun requestUserPermission(manager: UsbManager, device: UsbDevice) {
Log.d(TAG, String.format("requestUserPermissions", device.vendorId, device.productId)) // Log.d(TAG, "requestUserPermissions() called -> vendor id = ${device.vendorId} & product id = ${device.productId}")
val mPendingIntent = PendingIntent.getBroadcast( val mPendingIntent: PendingIntent
this, if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
0, mPendingIntent = PendingIntent.getBroadcast(
Intent(Constants.ACTION_USB_PERMISSION), this,
0 0,
) Intent(Constants.ACTION_USB_PERMISSION),
PendingIntent.FLAG_MUTABLE
)
} else {
mPendingIntent = PendingIntent.getBroadcast(
this,
0,
Intent(Constants.ACTION_USB_PERMISSION),
PendingIntent.FLAG_ONE_SHOT
)
}
val filter = IntentFilter(Constants.ACTION_USB_PERMISSION) val filter = IntentFilter(Constants.ACTION_USB_PERMISSION)
registerReceiver(broadcastReceiver, filter) registerReceiver(broadcastReceiver, filter)
@@ -120,16 +135,22 @@ class TestRightActivity : AppCompatActivity() {
bindService(intent, connection, Context.BIND_AUTO_CREATE) bindService(intent, connection, Context.BIND_AUTO_CREATE)
} }
private fun moveToNext(){ private fun moveToNext() {
if (supportFragmentManager.isDestroyed) if (supportFragmentManager.isDestroyed)
return return
if (!viewModel.isReferenceDone) if (DataHolder.sampleReadCounter > Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE){
DataHolder.sampleReadCounter = 0
DataHolder.isReferenceTaken = false
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.replace(binding.flMain.id, TestRightExpReference()).commit() .replace(binding.flMain.id, TestRightExpReference()).commit()
else }else if (!DataHolder.isReferenceTaken) {
supportFragmentManager.beginTransaction()
.replace(binding.flMain.id, TestRightExpReference()).commit()
} else {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.replace(binding.flMain.id, TestRightExpSample()).commit() .replace(binding.flMain.id, TestRightExpSample()).commit()
}
} }
override fun onDestroy() { override fun onDestroy() {

View File

@@ -5,12 +5,14 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MotionEvent
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.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.example.refactoredapp.R import com.example.refactoredapp.R
import com.example.refactoredapp.data.Constants import com.example.refactoredapp.data.DataHolder
import com.example.refactoredapp.data.constant.Constants
import com.example.refactoredapp.data.constant.TestRightCommands import com.example.refactoredapp.data.constant.TestRightCommands
import com.example.refactoredapp.databinding.FragmentTestRightExpReferenceBinding import com.example.refactoredapp.databinding.FragmentTestRightExpReferenceBinding
import com.example.refactoredapp.presentation.UsbServiceListener import com.example.refactoredapp.presentation.UsbServiceListener
@@ -25,8 +27,6 @@ class TestRightExpReference : Fragment() {
private val TAG = "TestRightExpReference" private val TAG = "TestRightExpReference"
private val fullReadOutput = StringBuilder()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@@ -40,41 +40,25 @@ class TestRightExpReference : Fragment() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupListeners() setupListeners()
if (viewModel.isReferenceDone && viewModel.sampleReadCounter <= Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE) // if (DataHolder.isReferenceTaken)
moveToSamplePage() // moveToSamplePage()
// //
if (viewModel.deviceConstant == null) { // DataHolder.sampleReadCounter <= Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE
sendCmdToFetchDeviceConstant()
if (DataHolder.deviceConstant == null) {
viewModel.progressBar.postValue(true)
Handler(Looper.getMainLooper()).postDelayed({ sendCmdToFetchDeviceConstant() }, 1000)
} }
} }
private fun testing(commands: TestRightCommands) {
viewModel.progressBar.postValue(true)
val fullReadOutput = StringBuilder()
(activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printInRange,
object : UsbServiceListener {
override fun onUsbRead(data: ByteArray?) {
data?.let {
val stringData = String(it)
fullReadOutput.append(stringData)
Log.d(TAG, fullReadOutput.toString())
if (stringData.contains("OK", true)) { // override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()") // if (viewModel.progressBar.value != null){
viewModel.mapIntensityValues(fullReadOutput.toString(), true) // return viewModel.progressBar.value!!
viewModel.isReferenceDone = true // } else {
viewModel.progressBar.postValue(false) // return false
moveToSamplePage() // }
} // }
}
}
override fun onUsbError(e: Exception?) {
Log.e(TAG, "onUsbIoError() called in writeUsbFetchDeviceConstant() -> $e")
viewModel.progressBar.postValue(false)
}
})
}
private fun setupListeners() { private fun setupListeners() {
binding.btnSetReference.setOnClickListener { binding.btnSetReference.setOnClickListener {
@@ -91,30 +75,24 @@ class TestRightExpReference : Fragment() {
override fun onClickBtnTwo() { override fun onClickBtnTwo() {
// Todo: Only for testing // Todo: Only for testing
// testing(TestRightCommands.led2Set50) viewModel.progressBar.postValue(true)
// testing(TestRightCommands.autoset)
// testing(TestRightCommands.run)
// requireActivity().runOnUiThread {
testing(TestRightCommands.run)
// }
} }
}) })
} }
viewModel.progressBar.observe(viewLifecycleOwner) { viewModel.progressBar.observe(viewLifecycleOwner) {
// Log.d(TAG, "SURYA OBSERVER Activated outcome = $it")
if (it) { if (it) {
binding.progressBar.visibility = View.VISIBLE binding.progressBar.visibility = View.VISIBLE
binding.clParent.alpha = 0.5f
binding.btnSetReference.isEnabled = false
} else { } else {
binding.progressBar.visibility = View.GONE binding.progressBar.visibility = View.GONE
binding.clParent.alpha = 1f
binding.btnSetReference.isEnabled = true
} }
} }
// binding.btnRead.setOnClickListener {
//// Log.d(TAG, "clicked on text")
//// val mService = (activity as TestRightActivity).mService
//// mService.read()
// Log.d(TAG, "FULL STRING IS -> $fullReadOutput")
// }
} }
/** /**
@@ -130,22 +108,33 @@ class TestRightExpReference : Fragment() {
// } // }
} }
// private fun sendCmdToFetchDeviceConstant(recursive: Boolean) {
private fun sendCmdToFetchDeviceConstant() { private fun sendCmdToFetchDeviceConstant() {
Log.d(TAG, "sendCmdToFetchDeviceConstant() called")
viewModel.progressBar.postValue(true) viewModel.progressBar.postValue(true)
val fullReadOutput = StringBuilder() val fullReadOutput = StringBuilder()
(activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.read, (activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.read,
object : UsbServiceListener { object : UsbServiceListener {
override fun onUsbRead(data: ByteArray?) { override fun onUsbRead(data: ByteArray?) {
data?.let { data?.let {
val stringData = String(it) val stringData = String(it)
fullReadOutput.append(stringData) fullReadOutput.append(stringData)
Log.d(TAG, "fullReadOutput = $fullReadOutput")
if (stringData.contains("OK", true)) { if (stringData.contains("OK", true)) {
Log.d(TAG, "onUsbRead() called in sendCmdToFetchDeviceConstant()") Log.d(
TAG,
"onUsbRead() called in sendCmdToFetchDeviceConstant() found OK"
)
viewModel.mapDeviceConstants(fullReadOutput.toString()) viewModel.mapDeviceConstants(fullReadOutput.toString())
viewModel.mapPixelNumberToWavelength()
viewModel.progressBar.postValue(false) viewModel.progressBar.postValue(false)
} }
// else if (recursive && stringData.contains("FINE", true)){
// Log.d(TAG, "results = FINE and calling again")
// viewModel.progressBar.postValue(false)
// sendCmdToFetchDeviceConstant(false)
// }
} }
} }
@@ -277,12 +266,12 @@ class TestRightExpReference : Fragment() {
data?.let { data?.let {
val stringData = String(it) val stringData = String(it)
fullReadOutput.append(stringData) fullReadOutput.append(stringData)
Log.d(TAG, stringData) // Log.d(TAG, stringData)
if (stringData.contains("OK", true)) { if (stringData.contains("OK", true)) {
Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()") Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()")
viewModel.mapIntensityValues(fullReadOutput.toString(), true) viewModel.mapIntensityValues(fullReadOutput.toString(), true)
viewModel.isReferenceDone = true DataHolder.isReferenceTaken = true
// viewModel.progressBar.postValue(false) // viewModel.progressBar.postValue(false)
Handler(Looper.getMainLooper()).postDelayed( Handler(Looper.getMainLooper()).postDelayed(
@@ -308,6 +297,65 @@ class TestRightExpReference : Fragment() {
.commit() .commit()
} }
// private fun testWriteConnection() {
// Log.d(TAG, "testWriteConnection() called")
// viewModel.progressBar.postValue(true)
//
// val fullReadOutput = StringBuilder()
// (activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.testByEnter,
// object : UsbServiceListener {
// override fun onUsbRead(data: ByteArray?) {
// data?.let {
// val stringData = String(it)
// fullReadOutput.append(stringData)
// Log.d(TAG, "fullReadOutput = $fullReadOutput")
//
// Handler(Looper.getMainLooper()).postDelayed(
// Runnable {
// sendCmdToFetchDeviceConstant()
// },
// 2000
// )
// }
// }
//
// override fun onUsbError(e: Exception?) {
// Log.e(TAG, "onUsbIoError() called in writeUsbFetchDeviceConstant() -> $e")
// viewModel.progressBar.postValue(false)
// }
// })
// }
// private fun testing(commands: TestRightCommands) {
// viewModel.progressBar.postValue(true)
// val fullReadOutput = StringBuilder()
// (activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printInRange,
// object : UsbServiceListener {
// override fun onUsbRead(data: ByteArray?) {
// data?.let {
// val stringData = String(it)
// fullReadOutput.append(stringData)
// Log.d(TAG, fullReadOutput.toString())
//
//
// if (stringData.contains("OK", true)) {
// Log.d(TAG, "onUsbRead() called in sendCmdToFetchLightIntensities()")
// viewModel.mapIntensityValues(fullReadOutput.toString(), true)
// DataHolder.isReferenceTaken = true
// viewModel.progressBar.postValue(false)
// moveToSamplePage()
// }
// }
// }
//
// override fun onUsbError(e: Exception?) {
// Log.e(TAG, "onUsbIoError() called in writeUsbFetchDeviceConstant() -> $e")
// viewModel.progressBar.postValue(false)
// }
// })
// }
// private fun startReadingReference() { // private fun startReadingReference() {
// val mService = (activity as TestRightActivity).mService // val mService = (activity as TestRightActivity).mService
// mService.eventDrivenWrite(TestRightCommands.print_all) // mService.eventDrivenWrite(TestRightCommands.print_all)

View File

@@ -1,5 +1,6 @@
package com.example.refactoredapp.presentation.testRight package com.example.refactoredapp.presentation.testRight
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -9,7 +10,10 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.example.refactoredapp.R import com.example.refactoredapp.R
import com.example.refactoredapp.data.DataHolder import com.example.refactoredapp.data.DataHolder
import com.example.refactoredapp.data.constant.Constants
import com.example.refactoredapp.data.model.TestRightResultType
import com.example.refactoredapp.databinding.FragmentTestRightResultsBinding import com.example.refactoredapp.databinding.FragmentTestRightResultsBinding
import com.example.refactoredapp.presentation.MainActivity
import com.example.refactoredapp.util.MyUtils import com.example.refactoredapp.util.MyUtils
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@@ -32,40 +36,92 @@ class TestRightResults : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupListeners()
updateResults() updateResults()
saveCsv() saveCsv()
saveLog()
}
private fun setupListeners() {
binding.ivHome.setOnClickListener {
val i = Intent(requireContext().applicationContext, MainActivity::class.java)
startActivity(i)
}
binding.ivNext.setOnClickListener {
if (DataHolder.sampleReadCounter > Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE) {
DataHolder.sampleReadCounter = 0
DataHolder.isReferenceTaken = false
parentFragmentManager.beginTransaction()
.replace(R.id.fl_main, TestRightExpReference())
.commit()
} else {
parentFragmentManager.beginTransaction().replace(R.id.fl_main, TestRightExpSample())
.commit()
}
}
}
private fun saveLog() {
Log.d(TAG, "saveLog() called")
val sdfDate = SimpleDateFormat("ddMMyyyy HHmmss")
val fileName: String = "log_" + sdfDate.format(Date()) + ".txt"
if (!DataHolder.isAppFolderCreated) {
val folderPath = MyUtils().createAppFolder(requireContext().applicationContext)
if (folderPath != null) {
DataHolder.isAppFolderCreated = true
DataHolder.appFolderPath = folderPath
viewModel.saveLog(DataHolder.appFolderPath, fileName)
}
} else {
viewModel.saveLog(DataHolder.appFolderPath, fileName)
}
} }
private fun saveCsv() { private fun saveCsv() {
Log.d(TAG, "saveCsv() called") Log.d(TAG, "saveCsv() called")
viewModel.calculateDataForCSV() // viewModel.mapWavelengthToAbsorbance()
// val fileName = "surya.csv" // val fileName = "surya.csv"
val sdfDate = SimpleDateFormat("ddMMyyyy HHmmss") val sdfDate = SimpleDateFormat("ddMMyyyy HHmmss")
val fileName: String = sdfDate.format(Date()) + ".csv" val fileName: String = sdfDate.format(Date()) + ".csv"
if (!DataHolder.isAppFolderCreated){ if (!DataHolder.isAppFolderCreated) {
val folderPath = MyUtils().createAppFolder(requireContext().applicationContext) val folderPath = MyUtils().createAppFolder(requireContext().applicationContext)
if (folderPath != null){ if (folderPath != null) {
DataHolder.isAppFolderCreated = true DataHolder.isAppFolderCreated = true
DataHolder.appFolderPath = folderPath DataHolder.appFolderPath = folderPath
viewModel.saveRawData(DataHolder.appFolderPath, fileName) viewModel.saveCsv(DataHolder.appFolderPath, fileName)
} }
} else { } else {
viewModel.saveRawData(DataHolder.appFolderPath, fileName) viewModel.saveCsv(DataHolder.appFolderPath, fileName)
} }
} }
private fun updateResults() { private fun updateResults() {
binding.tvName.text = getString(R.string.name_in_textview, viewModel.patientDetails.name) binding.tvName.text = getString(R.string.name_in_textview, viewModel.patientDetails.name)
binding.tvAge.text = getString(R.string.age_in_textview, viewModel.patientDetails.age.toString()) binding.tvAge.text =
binding.tvGender.text = getString(R.string.gender_in_textview, viewModel.patientDetails.gender) getString(R.string.age_in_textview, viewModel.patientDetails.age.toString())
binding.tvGender.text =
getString(R.string.gender_in_textview, viewModel.patientDetails.gender)
binding.tvResultValue.text = viewModel.patientDetails.results.toString() // binding.tvResultValue.text = viewModel.patientDetails.results.toString()
if (viewModel.patientDetails.results == "Negative"){ when (viewModel.patientDetails.results) {
// Setting color TestRightResultType.NORMAL -> {
binding.resultNormal.visibility = View.VISIBLE
}
TestRightResultType.SICKLECELLDISEASE -> {
binding.resultDisease.visibility = View.VISIBLE
}
TestRightResultType.SICKLECELLTRAIT -> {
binding.resultTrait.visibility = View.VISIBLE
}
else -> {
binding.resultUndefined.visibility = View.VISIBLE
}
} }
// Log.d(TAG, "\n\n\n\nFor intensity Reference array size = ${viewModel.intensityReferenceArray.size}") // Log.d(TAG, "\n\n\n\nFor intensity Reference array size = ${viewModel.intensityReferenceArray.size}")
@@ -80,6 +136,5 @@ class TestRightResults : Fragment() {
// Log.d(TAG,"") // Log.d(TAG,"")
} }
} }

View File

@@ -3,10 +3,15 @@ package com.example.refactoredapp.presentation.testRight
import android.util.Log import android.util.Log
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.example.refactoredapp.data.Constants import com.example.refactoredapp.data.constant.Constants
import com.example.refactoredapp.data.DataHolder
import com.example.refactoredapp.data.model.PatientData import com.example.refactoredapp.data.model.PatientData
import com.example.refactoredapp.data.model.TestRightCalculationData
import com.example.refactoredapp.data.model.TestRightDeviceConstants import com.example.refactoredapp.data.model.TestRightDeviceConstants
import com.example.refactoredapp.domain.ResultCalculationWithMaxImpl
import com.example.refactoredapp.domain.SaveRawData import com.example.refactoredapp.domain.SaveRawData
import com.example.refactoredapp.domain.TestRightResultCalculation
import java.lang.Exception
import kotlin.math.log10 import kotlin.math.log10
import kotlin.math.pow import kotlin.math.pow
@@ -14,37 +19,44 @@ class TestRightViewModel : ViewModel() {
private val TAG = "TestRightViewModel" private val TAG = "TestRightViewModel"
var isReferenceDone = false // var isReferenceDone = false
var isServiceConnected = false var isServiceConnected = false
val progressBar = MutableLiveData(false) val progressBar = MutableLiveData(false)
val isUsbConnected = MutableLiveData(false) val isUsbConnected = MutableLiveData(false)
lateinit var patientDetails: PatientData lateinit var patientDetails: PatientData
var sampleReadCounter = 0 // var sampleReadCounter = 0
// var deviceConstant: TestRightDeviceConstants? = null
private lateinit var calculationData: TestRightCalculationData
// /* Contains wavelength -> pixel no.*/
// val wavelengthToPixelArray = ArrayList<Double>()
//
// /* (For reference/baseline) Contains pixel no. -> Intensity of light falling on that pixel */
// private val intensityReferenceArray = ArrayList<Double>()
var deviceConstant: TestRightDeviceConstants? = null
/* Contains wavelength -> pixel no.*/
val wavelengthToPixelArray = ArrayList<ArrayList<Double>>()
/* (For reference/baseline) Contains pixel no. -> Intensity of light falling on that pixel */
val intensityReferenceArray = ArrayList<ArrayList<Double>>()
/* (For exp sample) Contains pixel no. -> Intensity of light falling on that pixel */ /* (For exp sample) Contains pixel no. -> Intensity of light falling on that pixel */
val intensitySampleArray = ArrayList<ArrayList<Double>>() private val intensitySampleArray = ArrayList<Double>()
val wavelengthToAbsorbance = ArrayList<ArrayList<Double>>() val wavelengthToAbsorbance = ArrayList<ArrayList<Double>>()
fun mapDeviceConstants(string: String) { fun mapDeviceConstants(string: String) {
Log.d(TAG, "mapDeviceConstants() called")
// viewModelScope.launch { // viewModelScope.launch {
if (string.isNotEmpty()) { if (string.isNotEmpty()) {
val listOfStrings = string.split(",") val listOfStrings = string.split(",")
if (listOfStrings.size >= 4) { if (listOfStrings.size >= 4) {
deviceConstant = TestRightDeviceConstants( DataHolder.deviceConstant = TestRightDeviceConstants(
listOfStrings[0].trim(), listOfStrings[0].trim(),
listOfStrings[1].trim(), listOfStrings[1].trim(),
listOfStrings[2].trim(), listOfStrings[2].trim(),
listOfStrings[3].trim() listOfStrings[3].trim()
) )
mapPixelNumberToWavelength()
} else { } else {
// Todo: Throws error // Todo: Throws error
} }
@@ -56,18 +68,19 @@ class TestRightViewModel : ViewModel() {
fun mapPixelNumberToWavelength() { fun mapPixelNumberToWavelength() {
// viewModelScope.launch { // viewModelScope.launch {
if (deviceConstant != null) { DataHolder.wavelengthToPixelArray.clear()
if (DataHolder.deviceConstant != null) {
for (x in 1..Constants.TEST_RIGHT_TOTAL_PIXEL) { for (x in 1..Constants.TEST_RIGHT_TOTAL_PIXEL) {
val index = x - 1
val wavelength: Double = val wavelength: Double =
(deviceConstant!!.a.toDouble() * (x.toDouble().pow((3).toDouble()))) + (DataHolder.deviceConstant!!.a.toDouble() * (index.toDouble()
(deviceConstant!!.b.toDouble() * (x.toDouble().pow((2).toDouble()))) + .pow((3).toDouble()))) +
(deviceConstant!!.c.toDouble() * x) + (DataHolder.deviceConstant!!.b.toDouble() * (index.toDouble()
(deviceConstant!!.d.toDouble()) .pow((2).toDouble()))) +
(DataHolder.deviceConstant!!.c.toDouble() * index) +
(DataHolder.deviceConstant!!.d.toDouble())
val temp = ArrayList<Double>(2) DataHolder.wavelengthToPixelArray.add(wavelength)
temp.add(wavelength)
temp.add(x.toDouble())
wavelengthToPixelArray.add(temp)
} }
} else { } else {
// Todo: Throws error // Todo: Throws error
@@ -77,6 +90,10 @@ class TestRightViewModel : ViewModel() {
fun mapIntensityValues(fullString: String, isReference: Boolean) { fun mapIntensityValues(fullString: String, isReference: Boolean) {
// viewModelScope.launch { // viewModelScope.launch {
if (isReference) DataHolder.intensityReferenceArray.clear()
else intensitySampleArray.clear()
val listOfString = fullString.split("\n") val listOfString = fullString.split("\n")
// Log.d(TAG, "inside mapIntensityValues() -> isReference = $isReference") // Log.d(TAG, "inside mapIntensityValues() -> isReference = $isReference")
@@ -90,19 +107,20 @@ class TestRightViewModel : ViewModel() {
/* Removing trailing spaces and "Buf" from the string then taking lhs & rhs of ':' */ /* Removing trailing spaces and "Buf" from the string then taking lhs & rhs of ':' */
val numbers = line.trim() val numbers = line.trim()
.substring(3).split(":") .substring(3).split(":")
Log.d(TAG, line)
if (numbers.size >= 2) { if (numbers.size >= 2) {
val temp = ArrayList<Double>(2) // val temp = ArrayList<Double>(2)
temp.add(numbers[0].toDouble()) // temp.add(numbers[0].toDouble())
temp.add(numbers[1].toDouble()) // temp.add(numbers[1].toDouble())
// if(!isReference){ // if(!isReference){
// Log.d(TAG, "temp[0] = ${temp[0]} & temp[1] = ${temp[1]}") // Log.d(TAG, "temp[0] = ${temp[0]} & temp[1] = ${temp[1]}")
// } // }
if (isReference) if (isReference)
intensityReferenceArray.add(temp) DataHolder.intensityReferenceArray.add(numbers[1].toDouble())
else else
intensitySampleArray.add(temp) intensitySampleArray.add(numbers[1].toDouble())
} else { } else {
// Todo: Error handling // Todo: Error handling
} }
@@ -111,128 +129,101 @@ class TestRightViewModel : ViewModel() {
// } // }
} }
// fun mapWavelengthToAbsorbance(){
// var indexInReference = intensityReferenceArray.size - 1
// var indexInSample = intensitySampleArray.size - 1
// for (each in wavelengthToPixelArray){
// val wavelength = each[0]
// val invertedPixel = (Constants.TEST_RIGHT_TOTAL_PIXEL + 1) - each[1]
//
// var Io = 0.0
// if (intensityReferenceArray[indexInReference][0].toInt() == invertedPixel.toInt()){
// Io = intensityReferenceArray[indexInReference][1]
// }
//
// var I = 0.0
// if (intensitySampleArray[indexInSample][0].toInt() == invertedPixel.toInt()){
// I = intensitySampleArray[indexInSample][1]
// }
//
// val absorbance = log10(Io/I)
//
// val temp = ArrayList<Double>(2)
// temp.add(wavelength)
// temp.add(absorbance)
// wavelengthToAbsorbance.add(temp)
//
// indexInReference--
// indexInSample--
// }
// }
fun calculateDataForCSV(){ fun mapWavelengthToAbsorbance() {
var indexInReference = intensityReferenceArray.size - 1 if (DataHolder.intensityReferenceArray.size != intensitySampleArray.size || DataHolder.wavelengthToPixelArray.size != intensitySampleArray.size || DataHolder.wavelengthToPixelArray.size != DataHolder.intensityReferenceArray.size) {
var indexInSample = intensitySampleArray.size - 1 throw Exception("Inconsistency in the data, size of arrays are not same. \nintensityReferenceArray.size = ${DataHolder.intensityReferenceArray.size} ; intensitySampleArray.size = ${intensitySampleArray.size} ; wavelengthToPixelArray.size = ${DataHolder.wavelengthToPixelArray.size}")
for (each in wavelengthToPixelArray){ }
val wavelength = each[0]
val invertedPixel = (Constants.TEST_RIGHT_TOTAL_PIXEL + 1) - each[1]
var Io = 0.0 wavelengthToAbsorbance.clear()
if (intensityReferenceArray[indexInReference][0].toInt() == invertedPixel.toInt()){ // Index pointing to last of the array
Io = intensityReferenceArray[indexInReference][1] // var indexInIntensityArrays = intensityReferenceArray.size - 1
} // for ((index,wavelength) in wavelengthToPixelArray.withIndex()) {
for (index in 0 until DataHolder.wavelengthToPixelArray.size) {
var I = 0.0
if (intensitySampleArray[indexInSample][0].toInt() == invertedPixel.toInt()){
I = intensitySampleArray[indexInSample][1]
}
val absorbance = log10(Io/I) // Todo: handle indexInIntensityArrays <0
val invertedPixelIndex = (Constants.TEST_RIGHT_TOTAL_PIXEL) - (index + 1)
val i0 = DataHolder.intensityReferenceArray[invertedPixelIndex]
// if (intensityReferenceArray[indexInIntensityArrays][0].toInt() == invertedPixelIndex.toInt()) {
// Io = intensityReferenceArray[indexInIntensityArrays][1]
// } else {
// // Not needed - As you are calculating index and also checking the size of all 3 array before
// throw Exception("Inconsistency in the data, pixel not found in intensity reference array \n pixel in intensityReferenceArray = ${intensityReferenceArray[indexInIntensityArrays][0]} & inverted pixel value = ${invertedPixelIndex.toInt()}")
// }
val i1 = intensitySampleArray[invertedPixelIndex]
// if (intensitySampleArray[indexInIntensityArrays][0].toInt() == invertedPixelIndex.toInt()) {
// I = intensitySampleArray[indexInIntensityArrays][1]
// } else {
// // Not needed - As you are calculating index and also checking the size of all 3 array before
// throw Exception("Inconsistency in the data, pixel not found in intensity sample array \n pixel in intensitySampleArray = ${intensitySampleArray[indexInIntensityArrays][0]} & inverted pixel value = ${invertedPixelIndex.toInt()}")
// }
// if (I==0.0 || Io == 0.0){
// throw Exception("error in data calculation I = $I & Io = $Io")
// }
val absorbance = log10(i0 / i1)
val wavelength = DataHolder.wavelengthToPixelArray[index]
val temp = ArrayList<Double>(2) val temp = ArrayList<Double>(2)
temp.add(wavelength) temp.add(wavelength)
temp.add(absorbance) temp.add(absorbance)
wavelengthToAbsorbance.add(temp) wavelengthToAbsorbance.add(temp)
indexInReference-- // indexInIntensityArrays--
indexInSample--
} }
} }
fun saveRawData(folderPath: String, filename: String) {
SaveRawData().saveCsv(folderPath, filename, wavelengthToAbsorbance)
}
fun calculateResults() { fun calculateResults() {
Log.d(TAG, "DEBUGGINGGGGG--------------------------------------------------------------------------------") DataHolder.sampleReadCounter++
sampleReadCounter++
var pixelNoWithWave_427 = 0; // patientDetails.results = ResultCalculationZeroImpl().getResults(wavelengthToPixelArray, intensityReferenceArray, intensitySampleArray)
var pixelNoWithWave_555 = 0;
Log.d(TAG, "wavelengthToPixelArray size = ${wavelengthToPixelArray.size}")
// println("wavelengthToPixelArray size = ${wavelengthToPixelArray.size}")
for (each in wavelengthToPixelArray){
var diff = each[0] - 427
if (pixelNoWithWave_427 == 0 && diff >= 0 && diff < 1){
pixelNoWithWave_427 = each[1].toInt()
}
diff = each[0] - 555
if (pixelNoWithWave_555 == 0 && diff >= 0 && diff < 1){
pixelNoWithWave_555 = each[1].toInt()
}
if (pixelNoWithWave_427 != 0 && pixelNoWithWave_555 != 0) {
break
}
}
Log.d(TAG, "pixelOfInterest_427 = ${pixelNoWithWave_427}")
Log.d(TAG, "pixelOfInterest_555 = ${pixelNoWithWave_555}")
// println("pixelOfInterest_427 = ${pixelNoWithWave_427}")
// println("pixelOfInterest_555 = ${pixelNoWithWave_555}")
val invertedPixel_427 = (Constants.TEST_RIGHT_TOTAL_PIXEL + 1) - pixelNoWithWave_427
val invertedPixel_555 = (Constants.TEST_RIGHT_TOTAL_PIXEL + 1) - pixelNoWithWave_555
var io_427 = 0.0
var io_555 = 0.0
for (each in intensityReferenceArray){
if (each[0].toInt() == invertedPixel_427){
io_427 = each[1]
}
if (each[0].toInt() == invertedPixel_555){
io_555 = each[1]
}
}
Log.d(TAG, "I0 values are I0_427 = $io_427 , IO_555 = $io_555")
// println("I0 values are I0_427 = $io_427 , IO_555 = $io_555")
var i_427 = 0.0
var i_555 = 0.0
for (each in intensitySampleArray){
if (each[0].toInt() == invertedPixel_427){
i_427 = each[1]
}
if (each[0].toInt() == invertedPixel_555){
i_555 = each[1]
}
}
Log.d(TAG, "I values are I_427 = $i_427 , I_555 = $i_555")
// println("I values are I_427 = $i_427 , I_555 = $i_555")
val absorbanceAtPixelWithWave_427 = log10(io_427/i_427)
val absorbanceAtPixelWithWave_555 = log10(io_555/i_555)
Log.d(TAG, "absorbance values are for 427 = $absorbanceAtPixelWithWave_427 , for 555 = $absorbanceAtPixelWithWave_555")
// println("absorbance values are for 427 = $absorbanceAtPixelWithWave_427 , for 555 = $absorbanceAtPixelWithWave_555")
var value = 0.0;
if (absorbanceAtPixelWithWave_427 != 0.0 && absorbanceAtPixelWithWave_555 != 0.0) {
value = absorbanceAtPixelWithWave_555 / absorbanceAtPixelWithWave_427
}
Log.d(TAG, "value = $value")
// println("value = $value")
var results: String = ""
if (value < 0.24 || value == 0.0) {
results = "Normal"
} else if (value >= 0.24 && value < 0.30) {
results = "Sickle Cell Trait"
} else if (value >= 0.30) {
results = "Sickle-Cell Disease"
}
Log.d(TAG, "Results = $results")
// println("Results = $results")
patientDetails.results = results
val resultCalculation: TestRightResultCalculation = ResultCalculationWithMaxImpl()
calculationData = resultCalculation.getResults(wavelengthToAbsorbance)
// patientDetails.results = resultCalculation.getResults(wavelengthToAbsorbance)
patientDetails.results = calculationData.result
} }
fun saveCsv(folderPath: String, filename: String) {
SaveRawData().saveCsv(folderPath, filename, wavelengthToAbsorbance)
}
fun saveLog(appFolderPath: String, fileName: String) {
SaveRawData().saveLog(appFolderPath, fileName, calculationData)
}
} }

View File

@@ -6,7 +6,7 @@ import android.hardware.usb.UsbDeviceConnection
import android.os.Binder import android.os.Binder
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import com.example.refactoredapp.data.Constants import com.example.refactoredapp.data.constant.Constants
import com.example.refactoredapp.data.constant.TestRightCommands import com.example.refactoredapp.data.constant.TestRightCommands
import com.example.refactoredapp.presentation.UsbServiceListener import com.example.refactoredapp.presentation.UsbServiceListener
import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialDriver

View File

@@ -5,6 +5,7 @@
tools:context=".presentation.testRight.TestRightExpReference"> tools:context=".presentation.testRight.TestRightExpReference">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@@ -91,14 +91,15 @@
app:layout_constraintTop_toBottomOf="@id/line" /> app:layout_constraintTop_toBottomOf="@id/line" />
<TextView <TextView
android:id="@+id/tv_result_value" android:id="@+id/result_normal"
style="@style/title3" style="@style/title3"
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:background="@drawable/result_background_green" android:background="@drawable/result_background_green"
android:drawablePadding="4dp" android:drawablePadding="4dp"
android:text="@string/negative" android:text="@string/normal"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_baseline_check_circle_24" app:drawableStartCompat="@drawable/ic_baseline_check_circle_24"
app:layout_constraintBottom_toBottomOf="@+id/tv_result" app:layout_constraintBottom_toBottomOf="@+id/tv_result"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -106,37 +107,89 @@
app:layout_constraintStart_toEndOf="@+id/tv_result" app:layout_constraintStart_toEndOf="@+id/tv_result"
app:layout_constraintTop_toTopOf="@+id/tv_result" /> app:layout_constraintTop_toTopOf="@+id/tv_result" />
<TextView
android:id="@+id/result_disease"
style="@style/title3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:background="@drawable/result_background_red"
android:drawablePadding="4dp"
android:visibility="gone"
android:text="@string/sickle_cell_disease"
app:drawableStartCompat="@drawable/ic_baseline_cancel_24"
app:layout_constraintBottom_toBottomOf="@+id/tv_result"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@+id/tv_result"
app:layout_constraintTop_toTopOf="@+id/tv_result" />
<TextView
android:id="@+id/result_trait"
style="@style/title3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:background="@drawable/result_background_red"
android:drawablePadding="4dp"
android:visibility="gone"
android:text="@string/sickle_cell_trait"
app:drawableStartCompat="@drawable/ic_baseline_cancel_24"
app:layout_constraintBottom_toBottomOf="@+id/tv_result"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@+id/tv_result"
app:layout_constraintTop_toTopOf="@+id/tv_result" />
<TextView
android:id="@+id/result_undefined"
style="@style/title3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:background="@drawable/result_background_yellow"
android:drawablePadding="4dp"
android:visibility="gone"
android:text="@string/undefined"
app:drawableStartCompat="@drawable/ic_baseline_circle_24"
app:layout_constraintBottom_toBottomOf="@+id/tv_result"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@+id/tv_result"
app:layout_constraintTop_toTopOf="@+id/tv_result" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<ImageView <!-- <ImageView-->
android:id="@+id/iv_download" <!-- android:id="@+id/iv_download"-->
android:layout_width="wrap_content" <!-- android:layout_width="wrap_content"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginTop="42dp" <!-- android:layout_marginTop="42dp"-->
android:layout_marginStart="24dp" <!-- android:layout_marginStart="24dp"-->
android:src="@drawable/ic_baseline_file_download_24" <!-- android:src="@drawable/ic_baseline_file_download_24"-->
app:layout_constraintStart_toStartOf="@id/cv_sample_details" <!-- app:layout_constraintStart_toStartOf="@id/cv_sample_details"-->
app:layout_constraintTop_toBottomOf="@id/cv_sample_details" /> <!-- app:layout_constraintTop_toBottomOf="@id/cv_sample_details" />-->
<TextView <!-- <TextView-->
style="@style/title3" <!-- style="@style/title3"-->
android:layout_width="wrap_content" <!-- android:layout_width="wrap_content"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:text="@string/download_report" <!-- android:text="@string/download_report"-->
android:textAlignment="center" <!-- android:textAlignment="center"-->
android:textColor="@color/gray" <!-- android:textColor="@color/gray"-->
app:layout_constraintEnd_toEndOf="@id/iv_download" <!-- app:layout_constraintEnd_toEndOf="@id/iv_download"-->
app:layout_constraintStart_toStartOf="@id/iv_download" <!-- app:layout_constraintStart_toStartOf="@id/iv_download"-->
app:layout_constraintTop_toBottomOf="@id/iv_download" /> <!-- app:layout_constraintTop_toBottomOf="@id/iv_download" />-->
<ImageView <ImageView
android:id="@+id/iv_home" android:id="@+id/iv_home"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="42dp" android:layout_marginTop="42dp"
android:layout_marginEnd="16dp"
android:src="@drawable/ic_baseline_home_24" android:src="@drawable/ic_baseline_home_24"
app:layout_constraintStart_toEndOf="@id/iv_download" app:layout_constraintStart_toStartOf="@id/cv_sample_details"
app:layout_constraintEnd_toStartOf="@id/iv_next" app:layout_constraintEnd_toStartOf="@id/iv_next"
app:layout_constraintTop_toBottomOf="@id/cv_sample_details" /> app:layout_constraintTop_toBottomOf="@id/cv_sample_details" />
@@ -158,7 +211,9 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="42dp" android:layout_marginTop="42dp"
android:layout_marginEnd="24dp" android:layout_marginEnd="24dp"
android:layout_marginStart="16dp"
android:src="@drawable/ic_baseline_new_label_24" android:src="@drawable/ic_baseline_new_label_24"
app:layout_constraintStart_toEndOf="@id/iv_home"
app:layout_constraintEnd_toEndOf="@id/cv_sample_details" app:layout_constraintEnd_toEndOf="@id/cv_sample_details"
app:layout_constraintTop_toBottomOf="@id/cv_sample_details" /> app:layout_constraintTop_toBottomOf="@id/cv_sample_details" />

View File

@@ -1,5 +1,5 @@
<resources> <resources>
<string name="app_name">Refactored App</string> <string name="app_name">HPOS</string>
<string-array name="instrument"> <string-array name="instrument">
<item>TestRight</item> <item>TestRight</item>
@@ -58,5 +58,14 @@
<string name="home">Home</string> <string name="home">Home</string>
<string name="new_test">New Test</string> <string name="new_test">New Test</string>
<string name="start_now">Start Now</string> <string name="start_now">Start Now</string>
<string name="hemo_cube">Hemo Cube</string>
<string name="hb">Hb</string>
<string name="normal">Normal\ \ </string>
<string name="sickle_cell_disease">Sickle Cell Disease\ \ </string>
<string name="sickle_cell_trait">Sickle Cell Trait\ \ </string>
<string name="undefined">Undefined\ \ </string>
<string name="sicklecell_nconfirmatory">Sicklecell\nConfirmatory</string>
<string name="sicklecell_screening">Sicklecell Screening</string>
<string name="thalassemia">Thalassemia</string>
</resources> </resources>