diff --git a/app/build.gradle b/app/build.gradle index 205e291..581a71f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { applicationId "in.sminnovations.hpostesting.iocl" minSdk 21 targetSdk 34 - versionCode 125 - versionName "2.1.125" + versionCode 127 + versionName "2.1.127" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -76,6 +76,7 @@ dependencies { implementation platform('com.google.firebase:firebase-bom:32.1.0') implementation("com.google.firebase:firebase-perf-ktx") implementation("com.google.firebase:firebase-crashlytics-ktx") + implementation("com.google.firebase:firebase-config-ktx") implementation("com.google.firebase:firebase-analytics-ktx") implementation 'com.google.firebase:firebase-firestore-ktx' implementation 'com.google.firebase:firebase-auth-ktx' diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index bff4a34..0750472 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 125, - "versionName": "2.1.125", + "versionCode": 127, + "versionName": "2.1.127", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt index 9447ff0..e97fd05 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt @@ -16,7 +16,7 @@ package com.example.hpostesting.data.constant object Constants { const val CENTER_NAME ="" const val DISTRICT ="" - const val FLAGS_ENABLED = false//testing flag disable then pass buffer and sample checks + const val BUFFER_FLAGS_ENABLED = true//testing flag disable then pass buffer and sample checks const val ABS_FLAGS_ENABLED = false const val IP_ADDRESS="ip_address" const val QUICK_CAPTURE="quick_capture" @@ -1622,6 +1622,11 @@ object Constants { const val min10mmLed2 = 0.05 const val max10mmLed2 = 0.41 + const val bufferMinLed1 = 21000.00 + const val bufferMaxLed1 = 23000.00 + const val bufferMinLed2 = 17000.00 + const val bufferMaxLed2 = 19000.00 + // val STATICID = listOf( // "FACTORY", diff --git a/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt b/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt index 5e7b4ac..70de794 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/TestStatus.kt @@ -26,10 +26,12 @@ enum class TestStatus(val code: Double) { TEMPERATURE_CHECK(4.7), CUVETTE_ABSENT(4.8), CUVETTE_PRESENT(4.9), + CUVETTE_ABSENTR(5.1), + CUVETTE_PRESENTR(5.2), CUVETTE_ABSENTS(7.7), CUVETTE_PRESENTS(7.8), - BUFFER_STARTED(5.1), - BUFFER_COMPLETED(5.2), + BUFFER_STARTED(5.4), + BUFFER_COMPLETED(5.5), BUFFER_PRINT_STARTED(6.0), BUFFER_PRINT_COMPLETED(7.0), SAMPLE_STARTED(8.0), diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt index 1155d4d..054c766 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/DashboardActivity.kt @@ -46,6 +46,10 @@ 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.ktx.Firebase +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfigSettings import dagger.hilt.android.AndroidEntryPoint import `in`.sminnovations.hpostesting.BuildConfig import `in`.sminnovations.hpostesting.R @@ -64,7 +68,7 @@ open interface IDataCollector: NatsMessageCallback { @AndroidEntryPoint class DashboardActivity : AppCompatActivity(), IDataCollector { - + private val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig val TAG = "DashboardActivity" private var isRegistered = false private lateinit var appBarConfiguration: AppBarConfiguration @@ -91,7 +95,6 @@ class DashboardActivity : AppCompatActivity(), IDataCollector { @SuppressLint("SetWorldReadable") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityDashboardBinding.inflate(layoutInflater) sharedPreferences = this.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) setContentView(binding.root) @@ -114,6 +117,90 @@ class DashboardActivity : AppCompatActivity(), IDataCollector { nats.sub("server.hpos.${deviceId}.ping") nats.pub("server.hpos.${deviceId}.ping", "THIS IS A TEST MSG") + val configSettings = remoteConfigSettings { + minimumFetchIntervalInSeconds = 3600 + } + remoteConfig.setConfigSettingsAsync(configSettings) + remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) + + remoteConfig.fetchAndActivate() + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + val normalMin2mm = remoteConfig.getDouble("normalMin2mm") + val normalMax2mm = remoteConfig.getDouble("normalMax2mm") + val negativeBorderlineMin2mm = remoteConfig.getDouble("negativeBorderlineMin2mm") + val negativeBorderlineMax2mm = remoteConfig.getDouble("negativeBorderlineMax2mm") + val positiveForSickleCellMin2mm = remoteConfig.getDouble("positiveForSickleCellMin2mm") + val positiveForSickleCellMax2mm = remoteConfig.getDouble("positiveForSickleCellMax2mm") + val sickleCellTraitMin2mm = remoteConfig.getDouble("sickleCellTraitMin2mm") + val sickleCellTraitMax2mm = remoteConfig.getDouble("sickleCellTraitMax2mm") + val sickleCellDiseaseMin2mm = remoteConfig.getDouble("sickleCellDiseaseMin2mm") + val sickleCellDiseaseMax2mm = remoteConfig.getDouble("sickleCellDiseaseMax2mm") + val positiveBoderLine2mm1 = remoteConfig.getDouble("positiveBoderLine2mm1") + val positiveBoderLine2mm2 = remoteConfig.getDouble("positiveBoderLine2mm2") + val negativeBoderLine2mm1 = remoteConfig.getDouble("negativeBoderLine2mm1") + val negativeBoderLine2mm2 = remoteConfig.getDouble("negativeBoderLine2mm2") + + val normalMin10mm = remoteConfig.getDouble("normalMin10mm") + val normalMax10mm = remoteConfig.getDouble("normalMax10mm") + val negativeBorderlineMin10mm = remoteConfig.getDouble("negativeBorderlineMin10mm") + val negativeBorderlineMax10mm = remoteConfig.getDouble("negativeBorderlineMax10mm") + val positiveForSickleCellMin10mm = remoteConfig.getDouble("positiveForSickleCellMin10mm") + val positiveForSickleCellMax10mm = remoteConfig.getDouble("positiveForSickleCellMax10mm") + val sickleCellTraitMin10mm = remoteConfig.getDouble("sickleCellTraitMin10mm") + val sickleCellTraitMax10mm = remoteConfig.getDouble("sickleCellTraitMax10mm") + val sickleCellDiseaseMin10mm = remoteConfig.getDouble("sickleCellDiseaseMin10mm") + val sickleCellDiseaseMax10mm = remoteConfig.getDouble("sickleCellDiseaseMax10mm") + val positiveBoderLine10mm1 = remoteConfig.getDouble("positiveBoderLine10mm1") + val positiveBoderLine10mm2 = remoteConfig.getDouble("positiveBoderLine10mm2") + val negativeBoderLine10mm1 = remoteConfig.getDouble("negativeBoderLine10mm1") + val negativeBoderLine10mm2 = remoteConfig.getDouble("negativeBoderLine10mm2") + + val bufferMinLed1 = remoteConfig.getDouble("bufferMinLed1") + val bufferMaxLed1 = remoteConfig.getDouble("bufferMaxLed1") + val bufferMinLed2 = remoteConfig.getDouble("bufferMinLed2") + val bufferMaxLed2 = remoteConfig.getDouble("bufferMaxLed2") + with(sharedPreferences.edit()) { + putString("bufferMinLed1", bufferMinLed1.toString()) + putString("bufferMaxLed1", bufferMaxLed1.toString()) + putString("bufferMinLed2", bufferMinLed2.toString()) + putString("bufferMaxLed2", bufferMaxLed2.toString())//buffer + putString("normalMin2mm", normalMin2mm.toString())//2mm + putString("normalMax2mm", normalMax2mm.toString()) + putString("negativeBorderlineMin2mm", negativeBorderlineMin2mm.toString()) + putString("negativeBorderlineMax2mm", negativeBorderlineMax2mm.toString()) + putString("positiveForSickleCellMin2mm", positiveForSickleCellMin2mm.toString()) + putString("positiveForSickleCellMax2mm", positiveForSickleCellMax2mm.toString()) + putString("sickleCellTraitMin2mm", sickleCellTraitMin2mm.toString()) + putString("sickleCellTraitMax2mm", sickleCellTraitMax2mm.toString()) + putString("sickleCellDiseaseMin2mm", sickleCellDiseaseMin2mm.toString()) + putString("sickleCellDiseaseMax2mm", sickleCellDiseaseMax2mm.toString()) + putString("positiveBoderLine2mm1", positiveBoderLine2mm1.toString()) + putString("positiveBoderLine2mm2", positiveBoderLine2mm2.toString()) + putString("negativeBoderLine2mm1", negativeBoderLine2mm1.toString()) + putString("negativeBoderLine2mm2", negativeBoderLine2mm2.toString())//2mm + putString("normalMin10mm", normalMin10mm.toString())//10mm + putString("normalMax10mm", normalMax10mm.toString()) + putString("negativeBorderlineMin10mm", negativeBorderlineMin10mm.toString()) + putString("negativeBorderlineMax10mm", negativeBorderlineMax10mm.toString()) + putString("positiveForSickleCellMin10mm", positiveForSickleCellMin10mm.toString()) + putString("positiveForSickleCellMax10mm", positiveForSickleCellMax10mm.toString()) + putString("sickleCellTraitMin10mm", sickleCellTraitMin10mm.toString()) + putString("sickleCellTraitMax10mm", sickleCellTraitMax10mm.toString()) + putString("sickleCellDiseaseMin10mm", sickleCellDiseaseMin10mm.toString()) + putString("sickleCellDiseaseMax10mm", sickleCellDiseaseMax10mm.toString()) + putString("positiveBoderLine10mm1", positiveBoderLine10mm1.toString()) + putString("positiveBoderLine10mm2", positiveBoderLine10mm2.toString()) + putString("negativeBoderLine10mm1", negativeBoderLine10mm1.toString()) + putString("negativeBoderLine10mm2", negativeBoderLine10mm2.toString())//10mm + apply() + } + Log.d(TAG, "Config params updated") + } else { + Log.d(TAG, "Config params Fetch failed") + } + } + hemocubeViewModel.deviceUpdate.observe(this) { Log.d("DashboardLogs",it.toString()) @@ -127,8 +214,8 @@ class DashboardActivity : AppCompatActivity(), IDataCollector { input.copyTo(output) } } - } + hemocubeViewModel.deviceUpdateheader.observe(this){ val apkFile = File(getExternalFilesDir("Downloads"), "update.apk") val expectedChecksum = it.get("Checksum") // Provide your expected checksum here diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index 3cd221f..c96b9a4 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -235,6 +235,7 @@ class HomeFragment : Fragment() { // putInt(Constants.KIT_COUNT, 0) // apply() // } + DataHolder.selectedTest = null val intent = Intent(requireContext(), KitScanActivity::class.java) intent.putExtra("fromWhere","Home") startActivity(intent) @@ -784,7 +785,7 @@ class HomeFragment : Fragment() { binding.btnSubmit.setOnClickListener { val userId = binding.userId.text.toString() val bloodGroup = binding.etBloodGroup.text - if (userId.length >= 10 && !bloodGroup.equals("Select Blood Group") || !bloodGroup.isNullOrBlank()) { + if (userId.length >= 5 && (!bloodGroup.equals("Select Blood Group") || !bloodGroup.isNullOrBlank())) { hemoCubeViewModel.addUser( HemoCubeTestData( _id = userId, @@ -794,6 +795,8 @@ class HomeFragment : Fragment() { ).format(Calendar.getInstance().time).toString() ) ) + Toast.makeText(requireContext(), "Successfully added- $userId", Toast.LENGTH_SHORT).show() + binding.userId.setText("") // val userData = UserData(_id = userId) // DataHolder.selectedTest = userData // findNavController().navigate(R.id.action_nav_home_to_mainActivity) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 24fb9d4..206b8c2 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -52,11 +52,43 @@ import kotlin.random.Random @Suppress("MemberVisibilityCanBePrivate") class HemoCubeFragment : Fragment() { + private var positiveBoderLine10mm1=Constants.positiveBoderLine10mm1 + private var positiveBoderLine10mm2=Constants.positiveBoderLine10mm2 + private var negativeBoderLine10mm1=Constants.negativeBoderLine10mm1 + private var negativeBoderLine10mm2=Constants.negativeBoderLine10mm2 + private var normalMin10mm=Constants.normalMin10mm + private var normalMax10mm=Constants.normalMax10mm + private var negativeBorderlineMin10mm=Constants.negativeBorderlineMin10mm + private var negativeBorderlineMax10mm=Constants.negativeBorderlineMax10mm + private var sickleCellTraitMin10mm=Constants.sickleCellTraitMin10mm + private var sickleCellTraitMax10mm=Constants.sickleCellTraitMax10mm + private var positiveForSickleCellMin10mm=Constants.positiveForSickleCellMin10mm + private var positiveForSickleCellMax10mm=Constants.positiveForSickleCellMax10mm + private var sickleCellDiseaseMin10mm=Constants.sickleCellDiseaseMin10mm + private var sickleCellDiseaseMax10mm=Constants.sickleCellDiseaseMax10mm + + private var positiveBoderLine2mm1=Constants.positiveBoderLine2mm1 + private var positiveBoderLine2mm2=Constants.positiveBoderLine2mm2 + private var negativeBoderLine2mm1=Constants.negativeBoderLine2mm1 + private var negativeBoderLine2mm2=Constants.negativeBoderLine2mm2 + private var normalMin2mm=Constants.normalMin2mm + private var normalMax2mm=Constants.normalMax2mm + private var negativeBorderlineMin2mm=Constants.negativeBorderlineMin2mm + private var negativeBorderlineMax2mm=Constants.negativeBorderlineMax2mm + private var sickleCellTraitMin2mm=Constants.sickleCellTraitMin2mm + private var sickleCellTraitMax2mm=Constants.sickleCellTraitMax2mm + private var positiveForSickleCellMin2mm=Constants.positiveForSickleCellMin2mm + private var positiveForSickleCellMax2mm=Constants.positiveForSickleCellMax2mm + private var sickleCellDiseaseMin2mm=Constants.sickleCellDiseaseMin2mm + private var sickleCellDiseaseMax2mm=Constants.sickleCellDiseaseMax2mm + private var temperature="" private var cuvetteSize = "10mm" private var checkCuvette = false + private var checkRefreshCuvette = false private var checkCuvetteSam = false private var sampleClick = false + private var refreshClick = false private lateinit var binding: FragmentHemoCubeReferenceBinding private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels() private lateinit var sharedPreferences: SharedPreferences @@ -100,6 +132,36 @@ class HemoCubeFragment : Fragment() { requireContext().getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) cuvetteSize = sharedPreferences.getString(Constants.CUVETTE_SIZE,"10mm").toString() + positiveBoderLine10mm1 = sharedPreferences.getString("positiveBoderLine10mm1", Constants.positiveBoderLine10mm1.toString())?.toDoubleOrNull() ?: Constants.positiveBoderLine10mm1 + positiveBoderLine10mm2 = sharedPreferences.getString("positiveBoderLine10mm2", Constants.positiveBoderLine10mm2.toString())?.toDoubleOrNull() ?: Constants.positiveBoderLine10mm2 + negativeBoderLine10mm1 = sharedPreferences.getString("negativeBoderLine10mm1", Constants.negativeBoderLine10mm1.toString())?.toDoubleOrNull() ?: Constants.negativeBoderLine10mm1 + negativeBoderLine10mm2 = sharedPreferences.getString("negativeBoderLine10mm2", Constants.negativeBoderLine10mm2.toString())?.toDoubleOrNull() ?: Constants.negativeBoderLine10mm2 + normalMin10mm = sharedPreferences.getString("normalMin10mm", Constants.normalMin10mm.toString())?.toDoubleOrNull() ?: Constants.normalMin10mm + normalMax10mm = sharedPreferences.getString("normalMax10mm", Constants.normalMax10mm.toString())?.toDoubleOrNull() ?: Constants.normalMax10mm + negativeBorderlineMin10mm = sharedPreferences.getString("negativeBorderlineMin10mm", Constants.negativeBorderlineMin10mm.toString())?.toDoubleOrNull() ?: Constants.negativeBorderlineMin10mm + negativeBorderlineMax10mm = sharedPreferences.getString("negativeBorderlineMax10mm", Constants.negativeBorderlineMax10mm.toString())?.toDoubleOrNull() ?: Constants.negativeBorderlineMax10mm + sickleCellTraitMin10mm = sharedPreferences.getString("sickleCellTraitMin10mm", Constants.sickleCellTraitMin10mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellTraitMin10mm + sickleCellTraitMax10mm = sharedPreferences.getString("sickleCellTraitMax10mm", Constants.sickleCellTraitMax10mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellTraitMax10mm + positiveForSickleCellMin10mm = sharedPreferences.getString("positiveForSickleCellMin10mm", Constants.positiveForSickleCellMin10mm.toString())?.toDoubleOrNull() ?: Constants.positiveForSickleCellMin10mm + positiveForSickleCellMax10mm = sharedPreferences.getString("positiveForSickleCellMax10mm", Constants.positiveForSickleCellMax10mm.toString())?.toDoubleOrNull() ?: Constants.positiveForSickleCellMax10mm + sickleCellDiseaseMin10mm = sharedPreferences.getString("sickleCellDiseaseMin10mm", Constants.sickleCellDiseaseMin10mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellDiseaseMin10mm + sickleCellDiseaseMax10mm = sharedPreferences.getString("sickleCellDiseaseMax10mm", Constants.sickleCellDiseaseMax10mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellDiseaseMax10mm + + positiveBoderLine2mm1 = sharedPreferences.getString("positiveBoderLine2mm1", Constants.positiveBoderLine2mm1.toString())?.toDoubleOrNull() ?: Constants.positiveBoderLine2mm1 + positiveBoderLine2mm2 = sharedPreferences.getString("positiveBoderLine2mm2", Constants.positiveBoderLine2mm2.toString())?.toDoubleOrNull() ?: Constants.positiveBoderLine2mm2 + negativeBoderLine2mm1 = sharedPreferences.getString("negativeBoderLine2mm1", Constants.negativeBoderLine2mm1.toString())?.toDoubleOrNull() ?: Constants.negativeBoderLine2mm1 + negativeBoderLine2mm2 = sharedPreferences.getString("negativeBoderLine2mm2", Constants.negativeBoderLine2mm2.toString())?.toDoubleOrNull() ?: Constants.negativeBoderLine2mm2 + normalMin2mm = sharedPreferences.getString("normalMin2mm", Constants.normalMin2mm.toString())?.toDoubleOrNull() ?: Constants.normalMin2mm + normalMax2mm = sharedPreferences.getString("normalMax2mm", Constants.normalMax2mm.toString())?.toDoubleOrNull() ?: Constants.normalMax2mm + negativeBorderlineMin2mm = sharedPreferences.getString("negativeBorderlineMin2mm", Constants.negativeBorderlineMin2mm.toString())?.toDoubleOrNull() ?: Constants.negativeBorderlineMin2mm + negativeBorderlineMax2mm = sharedPreferences.getString("negativeBorderlineMax2mm", Constants.negativeBorderlineMax2mm.toString())?.toDoubleOrNull() ?: Constants.negativeBorderlineMax2mm + sickleCellTraitMin2mm = sharedPreferences.getString("sickleCellTraitMin2mm", Constants.sickleCellTraitMin2mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellTraitMin2mm + sickleCellTraitMax2mm = sharedPreferences.getString("sickleCellTraitMax2mm", Constants.sickleCellTraitMax2mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellTraitMax2mm + positiveForSickleCellMin2mm = sharedPreferences.getString("positiveForSickleCellMin2mm", Constants.positiveForSickleCellMin2mm.toString())?.toDoubleOrNull() ?: Constants.positiveForSickleCellMin2mm + positiveForSickleCellMax2mm = sharedPreferences.getString("positiveForSickleCellMax2mm", Constants.positiveForSickleCellMax2mm.toString())?.toDoubleOrNull() ?: Constants.positiveForSickleCellMax2mm + sickleCellDiseaseMin2mm = sharedPreferences.getString("sickleCellDiseaseMin2mm", Constants.sickleCellDiseaseMin2mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellDiseaseMin2mm + sickleCellDiseaseMax2mm = sharedPreferences.getString("sickleCellDiseaseMax2mm", Constants.sickleCellDiseaseMax2mm.toString())?.toDoubleOrNull() ?: Constants.sickleCellDiseaseMax2mm + testState = TestState( testDetails = DataHolder.selectedTest?.toHemoCubeTestData(), ) @@ -151,14 +213,18 @@ class HemoCubeFragment : Fragment() { if (isBufferValueAvailable()){ hemoCubeViewModel.messages.postValue("Ready to test") isUsingExistingBuffer = true - binding.btnPlacebuffer.apply { - setBackgroundColor(Color.GREEN) // Set button background color to green - text = "Refresh Buffer" // Change button text to "Buffer Exists" - } + binding.btnPlaceRefreshbuffer.visibility = View.VISIBLE + binding.btnPlacebuffer.visibility = View.GONE +// binding.btnPlacebuffer.apply { +// setBackgroundColor(Color.GREEN) // Set button background color to green +// text = "Refresh Buffer" // Change button text to "Buffer Exists" +// } binding.btnSamplestart.isClickable = true binding.btnSamplestart.isEnabled = true }else{ hemoCubeViewModel.messages.postValue("Fresh Kit - Please take Buffer Blank reading") + binding.btnPlacebuffer.visibility = View.VISIBLE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.apply { setBackgroundColor(Color.RED) // Set button background color to green text = "Fresh Buffer" // Change button text to "Buffer Exists" @@ -189,6 +255,22 @@ class HemoCubeFragment : Fragment() { Log.d("HemoCubeFragment","Retry Check Cuvette") checkCuvettePresence() } + binding.btnPlaceRefreshbuffer.setOnClickListener { + activity?.runOnUiThread { + Log.d("HemoCubeFragment","Test Process started, reBuffer started") + binding.testing.visibility = View.VISIBLE + } + refreshClick = true + if(checkRefreshCuvette){ + startBufferProcess() + activity?.runOnUiThread { + binding.tvSubtitle4.visibility = View.VISIBLE + } + }else{ + checkCuvettePresence() + } + + } binding.btnPlacebuffer.setOnClickListener { activity?.runOnUiThread { Log.d("HemoCubeFragment","Test Process started, Buffer started") @@ -496,7 +578,13 @@ class HemoCubeFragment : Fragment() { //EPROM ADC Loaded //checkCuvettePresence() activity?.runOnUiThread { - binding.btnPlacebuffer.visibility = View.VISIBLE + if(isBufferValueAvailable()){ + binding.btnPlaceRefreshbuffer.visibility = View.VISIBLE + binding.btnPlacebuffer.visibility = View.GONE + }else{ + binding.btnPlaceRefreshbuffer.visibility = View.GONE + binding.btnPlacebuffer.visibility = View.VISIBLE + } binding.btnSamplestart.visibility = View.VISIBLE } getTemp() @@ -513,6 +601,7 @@ class HemoCubeFragment : Fragment() { checkCuvetteSam = true binding.testing.visibility = View.GONE binding.btnRetryCheckCuvette.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE } @@ -525,7 +614,26 @@ class HemoCubeFragment : Fragment() { } showRetryButtonForCuvette() } - + resultData.contains("#CIN") && refreshClick && this.testStatusCode < TestStatus.CUVETTE_PRESENTR.code -> { + hemoCubeViewModel.messages.postValue(getString(R.string.cuvette_present)) + this.testStatusCode = TestStatus.CUVETTE_PRESENTR.code + activity?.runOnUiThread { + checkRefreshCuvette = true + binding.testing.visibility = View.GONE + binding.btnRetryCheckCuvette.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.VISIBLE + binding.btnPlacebuffer.visibility = View.GONE + binding.btnSamplestart.visibility = View.VISIBLE + } + } + resultData.contains("#AIN") && refreshClick && this.testStatusCode <= TestStatus.CUVETTE_ABSENTR.code -> { + hemoCubeViewModel.messages.postValue(getString(R.string.cuvette_absent)) + this.testStatusCode = TestStatus.CUVETTE_ABSENTR.code + activity?.runOnUiThread { + binding.testing.visibility = View.GONE + } + showRetryButtonForCuvette() + } resultData.contains("#CIN") && this.testStatusCode < TestStatus.CUVETTE_PRESENT.code -> { hemoCubeViewModel.messages.postValue(getString(R.string.cuvette_present)) this.testStatusCode = TestStatus.CUVETTE_PRESENT.code @@ -550,6 +658,7 @@ class HemoCubeFragment : Fragment() { this.testStatusCode = TestStatus.BUFFER_STARTED.code activity?.runOnUiThread { binding.btnPlacebuffer.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnSamplestart.isClickable = false binding.btnSamplestart.isEnabled = false } @@ -558,14 +667,14 @@ class HemoCubeFragment : Fragment() { resultData.contains("#BC") && this.testStatusCode < TestStatus.BUFFER_COMPLETED.code -> { activity?.runOnUiThread { resultData = "" - if(Constants.FLAGS_ENABLED){ + if(Constants.BUFFER_FLAGS_ENABLED){ fetchResult() }else{ Log.d("resultDataBC",resultData) activity?.runOnUiThread { binding.testing.visibility = View.GONE binding.tvSubtitle4.text = getString(R.string.buffer_completed) -// binding.btnSamplestart.visibility = View.VISIBLE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.isClickable = true @@ -792,11 +901,12 @@ class HemoCubeFragment : Fragment() { val lb1Value = lb1Match!!.groupValues[1].toFloat() val lb2Value = lb2Match!!.groupValues[1].toFloat() - val led1Min = 21000.00 - val led1Max = 23000.00 + // val led1Min = sharedPreferences.getString("bufferMinLed1", "21000.00")?.toDouble() + val led1Min = sharedPreferences.getString("bufferMinLed1", Constants.bufferMinLed1.toString())?.toDoubleOrNull() ?: Constants.bufferMinLed1 + val led1Max = sharedPreferences.getString("bufferMaxLed1", Constants.bufferMaxLed1.toString())?.toDoubleOrNull() ?: Constants.bufferMaxLed1 - val led2Min = 17000.00 - val led2Max = 19000.00 + val led2Min = sharedPreferences.getString("bufferMinLed2", Constants.bufferMinLed2.toString())?.toDoubleOrNull() ?: Constants.bufferMinLed2 + val led2Max = sharedPreferences.getString("bufferMaxLed2", Constants.bufferMaxLed2.toString())?.toDoubleOrNull() ?: Constants.bufferMaxLed2 val isLb1InRange = lb1Value in led1Min..led1Max val isLb2InRange = lb2Value in led2Min..led2Max @@ -815,6 +925,7 @@ class HemoCubeFragment : Fragment() { // binding.btnPlacebuffer.visibility = View.GONE binding.btnRetryCheckCuvette.visibility = View.VISIBLE binding.btnPlacebuffer.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.GONE } } @@ -1006,6 +1117,7 @@ class HemoCubeFragment : Fragment() { this.testStatusCode = TestStatus.BUFFER_PRINT_COMPLETED.code binding.testing.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.isClickable = true binding.btnSamplestart.isEnabled = true @@ -1028,6 +1140,7 @@ class HemoCubeFragment : Fragment() { hemoCubeViewModel.messages.postValue("Negative Absorbance - Repeat test with reading Buffer first and sample second") this.testStatusCode = TestStatus.BUFFER_PRINT_COMPLETED.code binding.testing.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.isClickable = true @@ -1041,6 +1154,7 @@ class HemoCubeFragment : Fragment() { hemoCubeViewModel.messages.postValue("Absorbance out-of-Range - Repeat test with adequate blood volume and Incubation time") this.testStatusCode = TestStatus.BUFFER_PRINT_COMPLETED.code binding.testing.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.isClickable = true @@ -1054,6 +1168,7 @@ class HemoCubeFragment : Fragment() { hemoCubeViewModel.messages.postValue("Absorbance out-of-Range - Repeat test with adequate blood volume and Incubation time") this.testStatusCode = TestStatus.BUFFER_PRINT_COMPLETED.code binding.testing.visibility = View.GONE + binding.btnPlaceRefreshbuffer.visibility = View.GONE binding.btnPlacebuffer.visibility = View.GONE binding.btnSamplestart.visibility = View.VISIBLE binding.btnSamplestart.isClickable = true @@ -1299,39 +1414,39 @@ class HemoCubeFragment : Fragment() { if (deviceRatio != null && borderlineMetric != null) { if(cuvetteSize == "10mm"){ if (deviceRatioClass == "Negative Borderline") { - if (borderlineMetric < Constants.negativeBoderLine10mm1){//1.34 + if (borderlineMetric < negativeBoderLine10mm1){//1.34 return "Sickle Cell Trait" - }else if(borderlineMetric > Constants.negativeBoderLine10mm2){ + }else if(borderlineMetric > negativeBoderLine10mm2){ return "Normal" - }else if(borderlineMetric > Constants.negativeBoderLine10mm1 && borderlineMetric < Constants.negativeBoderLine10mm2){ + }else if(borderlineMetric > negativeBoderLine10mm1 && borderlineMetric < negativeBoderLine10mm2){ return "Negative borderline. Confirm with HPLC" } } if (deviceRatioClass == "Positive for Sickle Cell. HPLC for Confirmation") { - if (borderlineMetric < Constants.positiveBoderLine10mm1){//1.34 + if (borderlineMetric < positiveBoderLine10mm1){//1.34 return "Sickle Cell Disease" - }else if(borderlineMetric > Constants.positiveBoderLine10mm2){ + }else if(borderlineMetric > positiveBoderLine10mm2){ return "Sickle Cell Trait" - }else if(borderlineMetric > Constants.positiveBoderLine10mm1 && borderlineMetric < Constants.positiveBoderLine10mm2){ + }else if(borderlineMetric > positiveBoderLine10mm1 && borderlineMetric < positiveBoderLine10mm2){ return "Positive for Sickle Cell. Confirm with HPLC" } } }else if(cuvetteSize == "2mm"){ if (deviceRatioClass == "Negative Borderline") { - if (borderlineMetric < Constants.negativeBoderLine2mm1){//1.34 + if (borderlineMetric < negativeBoderLine2mm1){//1.34 return "Sickle Cell Trait" - }else if(borderlineMetric > Constants.negativeBoderLine2mm2){ + }else if(borderlineMetric > negativeBoderLine2mm2){ return "Normal" - }else if(borderlineMetric > Constants.negativeBoderLine2mm1 && borderlineMetric < Constants.negativeBoderLine2mm2){ + }else if(borderlineMetric > negativeBoderLine2mm1 && borderlineMetric < negativeBoderLine2mm2){ return "Negative borderline. Confirm with HPLC" } } if (deviceRatioClass == "Positive for Sickle Cell. HPLC for Confirmation") { - if (borderlineMetric < Constants.positiveBoderLine2mm1){//1.34 + if (borderlineMetric < positiveBoderLine2mm1){//1.34 return "Sickle Cell Disease" - }else if(borderlineMetric > Constants.positiveBoderLine2mm2){ + }else if(borderlineMetric > positiveBoderLine2mm2){ return "Sickle Cell Trait" - }else if(borderlineMetric > Constants.positiveBoderLine2mm1 && borderlineMetric < Constants.positiveBoderLine2mm2){ + }else if(borderlineMetric > positiveBoderLine2mm1 && borderlineMetric < positiveBoderLine2mm2){ return "Positive for Sickle Cell. Confirm with HPLC" } } @@ -1374,37 +1489,37 @@ class HemoCubeFragment : Fragment() { try { if (ratio != null) { if(cuvetteSize == "10mm"){ - if (ratio in Constants.normalMin10mm..Constants.normalMax10mm) { + if (ratio in normalMin10mm..normalMax10mm) { // setSubtitleTextColor(R.color.green_2) return "Normal" } - if (ratio in Constants.negativeBorderlineMin10mm..Constants.negativeBorderlineMax10mm){ + if (ratio in negativeBorderlineMin10mm..negativeBorderlineMax10mm){ return "Negative Borderline" } - if (ratio in Constants.sickleCellTraitMin10mm..Constants.sickleCellTraitMax10mm){ + if (ratio in sickleCellTraitMin10mm..sickleCellTraitMax10mm){ return "Sickle Cell Trait" } - if (ratio in Constants.positiveForSickleCellMin10mm..Constants.positiveForSickleCellMax10mm){//0.36 + if (ratio in positiveForSickleCellMin10mm..positiveForSickleCellMax10mm){//0.36 return "Positive for Sickle Cell. HPLC for Confirmation" } - if (ratio in Constants.sickleCellDiseaseMin10mm..Constants.sickleCellDiseaseMax10mm){ + if (ratio in sickleCellDiseaseMin10mm..sickleCellDiseaseMax10mm){ return "Sickle Cell Disease" } }else if(cuvetteSize == "2mm"){ - if (ratio in Constants.normalMin2mm..Constants.normalMax2mm) { + if (ratio in normalMin2mm..normalMax2mm) { // setSubtitleTextColor(R.color.green_2) return "Normal" } - if (ratio in Constants.negativeBorderlineMin2mm..Constants.negativeBorderlineMax2mm){ + if (ratio in negativeBorderlineMin2mm..negativeBorderlineMax2mm){ return "Negative Borderline" } - if (ratio in Constants.sickleCellTraitMin2mm..Constants.sickleCellTraitMax2mm){ + if (ratio in sickleCellTraitMin2mm..sickleCellTraitMax2mm){ return "Sickle Cell Trait" } - if (ratio in Constants.positiveForSickleCellMin2mm..Constants.positiveForSickleCellMax2mm){//0.36 + if (ratio in positiveForSickleCellMin2mm..positiveForSickleCellMax2mm){//0.36 return "Positive for Sickle Cell. HPLC for Confirmation" } - if (ratio in Constants.sickleCellDiseaseMin2mm..Constants.sickleCellDiseaseMax2mm){ + if (ratio in sickleCellDiseaseMin2mm..sickleCellDiseaseMax2mm){ return "Sickle Cell Disease" } } diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt index e43453f..a344e82 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemocubeActivity.kt @@ -21,6 +21,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.ServiceConnection +import android.content.SharedPreferences import android.hardware.usb.UsbDevice import android.hardware.usb.UsbDeviceConnection import android.hardware.usb.UsbManager @@ -39,6 +40,10 @@ import com.example.hpostesting.data.constant.DataHolder import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.util.UsbService +import com.google.firebase.ktx.Firebase +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfigSettings import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialProber import dagger.hilt.android.AndroidEntryPoint @@ -47,10 +52,11 @@ import `in`.sminnovations.hpostesting.databinding.ActivityHemocubeBinding @AndroidEntryPoint open class HemocubeActivity : AppCompatActivity() { + private val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig private lateinit var binding: ActivityHemocubeBinding private val viewModel by viewModels() private var myMenu: Menu? = null - + lateinit var sharedPreferences: SharedPreferences private lateinit var mDriver: UsbSerialDriver private var mConnection: UsbDeviceConnection? = null lateinit var mService: UsbService @@ -108,6 +114,91 @@ open class HemocubeActivity : AppCompatActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) setupListener() connectUsb(false) + val configSettings = remoteConfigSettings { + minimumFetchIntervalInSeconds = 10//3600 + } + sharedPreferences = this.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) + remoteConfig.setConfigSettingsAsync(configSettings) + remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) + + remoteConfig.fetchAndActivate() + .addOnCompleteListener(this) { task -> + if (task.isSuccessful) { + val normalMin2mm = remoteConfig.getDouble("normalMin2mm") + val normalMax2mm = remoteConfig.getDouble("normalMax2mm") + val negativeBorderlineMin2mm = remoteConfig.getDouble("negativeBorderlineMin2mm") + val negativeBorderlineMax2mm = remoteConfig.getDouble("negativeBorderlineMax2mm") + val positiveForSickleCellMin2mm = remoteConfig.getDouble("positiveForSickleCellMin2mm") + val positiveForSickleCellMax2mm = remoteConfig.getDouble("positiveForSickleCellMax2mm") + val sickleCellTraitMin2mm = remoteConfig.getDouble("sickleCellTraitMin2mm") + val sickleCellTraitMax2mm = remoteConfig.getDouble("sickleCellTraitMax2mm") + val sickleCellDiseaseMin2mm = remoteConfig.getDouble("sickleCellDiseaseMin2mm") + val sickleCellDiseaseMax2mm = remoteConfig.getDouble("sickleCellDiseaseMax2mm") + val positiveBoderLine2mm1 = remoteConfig.getDouble("positiveBoderLine2mm1") + val positiveBoderLine2mm2 = remoteConfig.getDouble("positiveBoderLine2mm2") + val negativeBoderLine2mm1 = remoteConfig.getDouble("negativeBoderLine2mm1") + val negativeBoderLine2mm2 = remoteConfig.getDouble("negativeBoderLine2mm2") + + val normalMin10mm = remoteConfig.getDouble("normalMin10mm") + val normalMax10mm = remoteConfig.getDouble("normalMax10mm") + val negativeBorderlineMin10mm = remoteConfig.getDouble("negativeBorderlineMin10mm") + val negativeBorderlineMax10mm = remoteConfig.getDouble("negativeBorderlineMax10mm") + val positiveForSickleCellMin10mm = remoteConfig.getDouble("positiveForSickleCellMin10mm") + val positiveForSickleCellMax10mm = remoteConfig.getDouble("positiveForSickleCellMax10mm") + val sickleCellTraitMin10mm = remoteConfig.getDouble("sickleCellTraitMin10mm") + val sickleCellTraitMax10mm = remoteConfig.getDouble("sickleCellTraitMax10mm") + val sickleCellDiseaseMin10mm = remoteConfig.getDouble("sickleCellDiseaseMin10mm") + val sickleCellDiseaseMax10mm = remoteConfig.getDouble("sickleCellDiseaseMax10mm") + val positiveBoderLine10mm1 = remoteConfig.getDouble("positiveBoderLine10mm1") + val positiveBoderLine10mm2 = remoteConfig.getDouble("positiveBoderLine10mm2") + val negativeBoderLine10mm1 = remoteConfig.getDouble("negativeBoderLine10mm1") + val negativeBoderLine10mm2 = remoteConfig.getDouble("negativeBoderLine10mm2") + + val bufferMinLed1 = remoteConfig.getDouble("bufferMinLed1") + val bufferMaxLed1 = remoteConfig.getDouble("bufferMaxLed1") + val bufferMinLed2 = remoteConfig.getDouble("bufferMinLed2") + val bufferMaxLed2 = remoteConfig.getDouble("bufferMaxLed2") + with(sharedPreferences.edit()) { + putString("bufferMinLed1", bufferMinLed1.toString()) + putString("bufferMaxLed1", bufferMaxLed1.toString()) + putString("bufferMinLed2", bufferMinLed2.toString()) + putString("bufferMaxLed2", bufferMaxLed2.toString())//buffer + putString("normalMin2mm", normalMin2mm.toString())//2mm + putString("normalMax2mm", normalMax2mm.toString()) + putString("negativeBorderlineMin2mm", negativeBorderlineMin2mm.toString()) + putString("negativeBorderlineMax2mm", negativeBorderlineMax2mm.toString()) + putString("positiveForSickleCellMin2mm", positiveForSickleCellMin2mm.toString()) + putString("positiveForSickleCellMax2mm", positiveForSickleCellMax2mm.toString()) + putString("sickleCellTraitMin2mm", sickleCellTraitMin2mm.toString()) + putString("sickleCellTraitMax2mm", sickleCellTraitMax2mm.toString()) + putString("sickleCellDiseaseMin2mm", sickleCellDiseaseMin2mm.toString()) + putString("sickleCellDiseaseMax2mm", sickleCellDiseaseMax2mm.toString()) + putString("positiveBoderLine2mm1", positiveBoderLine2mm1.toString()) + putString("positiveBoderLine2mm2", positiveBoderLine2mm2.toString()) + putString("negativeBoderLine2mm1", negativeBoderLine2mm1.toString()) + putString("negativeBoderLine2mm2", negativeBoderLine2mm2.toString())//2mm + putString("normalMin10mm", normalMin10mm.toString())//10mm + putString("normalMax10mm", normalMax10mm.toString()) + putString("negativeBorderlineMin10mm", negativeBorderlineMin10mm.toString()) + putString("negativeBorderlineMax10mm", negativeBorderlineMax10mm.toString()) + putString("positiveForSickleCellMin10mm", positiveForSickleCellMin10mm.toString()) + putString("positiveForSickleCellMax10mm", positiveForSickleCellMax10mm.toString()) + putString("sickleCellTraitMin10mm", sickleCellTraitMin10mm.toString()) + putString("sickleCellTraitMax10mm", sickleCellTraitMax10mm.toString()) + putString("sickleCellDiseaseMin10mm", sickleCellDiseaseMin10mm.toString()) + putString("sickleCellDiseaseMax10mm", sickleCellDiseaseMax10mm.toString()) + putString("positiveBoderLine10mm1", positiveBoderLine10mm1.toString()) + putString("positiveBoderLine10mm2", positiveBoderLine10mm2.toString()) + putString("negativeBoderLine10mm1", negativeBoderLine10mm1.toString()) + putString("negativeBoderLine10mm2", negativeBoderLine10mm2.toString())//10mm + apply() + } + Toast.makeText(this@HemocubeActivity, "Config params updated", Toast.LENGTH_SHORT).show() + Log.d(TAG, "Config params updated") + } else { + Log.d(TAG, "Config params Fetch failed") + } + } } private fun setupListener() { diff --git a/app/src/main/res/layout/fragment_hemo_cube_reference.xml b/app/src/main/res/layout/fragment_hemo_cube_reference.xml index 41bcf3b..9b25250 100644 --- a/app/src/main/res/layout/fragment_hemo_cube_reference.xml +++ b/app/src/main/res/layout/fragment_hemo_cube_reference.xml @@ -20,7 +20,23 @@ android:id="@+id/cl_parent" android:layout_width="match_parent" android:layout_height="match_parent"> - +