diff --git a/app/build.gradle b/app/build.gradle index 61967bf..07f7326 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,9 +55,10 @@ dependencies { implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.9.0' + implementation 'com.google.android.material:material:1.10.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.2' + implementation 'androidx.fragment:fragment-ktx:1.6.2' //firebase implementation platform('com.google.firebase:firebase-bom:32.1.0') @@ -72,8 +73,8 @@ dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' implementation 'com.google.android.things:androidthings:1.0' - implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta10' - implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta10") + implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta11' + implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta11") // Testing diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c2f6365..83e3687 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,8 +5,8 @@ - - @@ -32,6 +32,9 @@ android:supportsRtl="true" android:theme="@style/Theme.HPOSTesting" tools:targetApi="31"> + diff --git a/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt b/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt index 8b24d41..f186a27 100644 --- a/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt @@ -11,7 +11,7 @@ import com.example.hpostesting.data.model.patient.HemoCubeTestData import com.google.android.datatransport.runtime.dagger.Provides import javax.inject.Singleton -@Database(entities = [UserData::class, HemoCubeTestData::class, DeviceData::class], version = 6, exportSchema = false) +@Database(entities = [UserData::class, HemoCubeTestData::class, DeviceData::class], version = 9, exportSchema = false) @TypeConverters(Converters::class) abstract class MyDatabase : RoomDatabase() { abstract fun userDao(): UserDao diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt index 2083849..94f31f9 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt @@ -13,7 +13,6 @@ data class HemoCubeTestData( var birthYear: String = "", var state: String = "", var abhaId: String = "", - var bloodGroup: String = "", var userImageURL: String = "", var location: UserData.Location? = null, var reportUploadTime: String? = "", diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt index 8fe5e29..a434558 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/UserData.kt @@ -12,6 +12,7 @@ data class UserData( var incubationTime: String = "", var birthYear: String = "", var abhaId: String = "", + var bloodGroup: String = "", var userImageURL: String = "", var gender: String ="", var location: Location? = null, @@ -27,7 +28,8 @@ data class UserData( var csvPath: String = "", var reportPath: String = "", var result: TestRightResultType? = null, - var resultRatio: Double? = null + var resultRatio: Double? = null, + var prdClassification: String = "" ) { enum class Gender { MALE, @@ -48,5 +50,10 @@ fun UserData.toHemoCubeTestData() = HemoCubeTestData( userImageURL = userImageURL, testStatus = testStatus, location = location, - gender = gender + gender = gender, + state = state, + abhaId = abhaId, + bloodGroup = bloodGroup, + prdClassification = prdClassification, + testTime = testTime ) diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt new file mode 100644 index 0000000..402dc1d --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardActivity.kt @@ -0,0 +1,61 @@ +package com.example.hpostesting.presentation.hemocube + +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.hardware.usb.UsbDevice +import android.hardware.usb.UsbDeviceConnection +import android.hardware.usb.UsbManager +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.IBinder +import android.view.Menu +import androidx.activity.viewModels +import com.example.hpostesting.data.DataHolder +import com.example.hpostesting.presentation.testRight.UsbService +import com.hoho.android.usbserial.driver.UsbSerialDriver +import `in`.sminnovations.hpostesting.R +import `in`.sminnovations.hpostesting.databinding.ActivityDigitalCardBinding +import `in`.sminnovations.hpostesting.databinding.ActivityHemocubeBinding + +class DigitalCardActivity : AppCompatActivity() { + private lateinit var binding: ActivityDigitalCardBinding + private val viewModel by viewModels() + private var myMenu: Menu? = null + + private lateinit var mDriver: UsbSerialDriver + private var mConnection: UsbDeviceConnection? = null + lateinit var mService: UsbService + + private val TAG = "HemoCube" + +// private val connection = object : ServiceConnection { +// override fun onServiceConnected(className: ComponentName, service: IBinder) { +// val binder = service as UsbService.UsbServiceBinder +// mService = binder.getService() +// viewModel.isServiceConnected = true +// mConnection.let { mService.connect(mDriver, mConnection!!) } +// moveToNext() +// } +// +// override fun onServiceDisconnected(arg0: ComponentName) { +// viewModel.isServiceConnected = false +// } +// } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityDigitalCardBinding.inflate(layoutInflater) + setContentView(binding.root) + moveToNext() + } + + + private fun moveToNext() { + if (supportFragmentManager.isDestroyed) return + supportFragmentManager.beginTransaction().replace(binding.fghemocube.id, DigitalCardFragment()) + .commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt index 15ea73a..f72c826 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/DigitalCardFragment.kt @@ -1,8 +1,10 @@ package com.example.hpostesting.presentation.hemocube +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -14,13 +16,15 @@ import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.FragmentDigitalCardBinding import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding import java.text.SimpleDateFormat +import java.util.Calendar import java.util.Date +import java.util.Locale class DigitalCardFragment : Fragment() { private lateinit var binding: FragmentDigitalCardBinding private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels() private lateinit var sharedPreferences: SharedPreferences - val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() + private val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, @@ -33,29 +37,47 @@ class DigitalCardFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initViews() } + @SuppressLint("SetTextI18n") private fun initViews() { activity?.runOnUiThread { binding.progressBar.visibility = View.VISIBLE } - val originalDateStr = testDetails?.testTime - val originalDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - val originalDate: Date? = originalDateFormat.parse(originalDateStr) - val desiredDateFormat = SimpleDateFormat("MMM dd, yyyy") - val formattedDate: String = originalDate?.let { desiredDateFormat.format(it) } ?: "N/A" + Log.d("DigitalCardFragment", "Name: ${DataHolder.hemoCubeTestData?.name}") + Log.d("DigitalCardFragment", "DOB: ${testDetails?.birthYear}") + Log.d("DigitalCardFragment", "Gender: ${testDetails?.gender}") + Log.d("DigitalCardFragment", "State: ${testDetails?.state}") + Log.d("DigitalCardFragment", "ABHA ID: ${testDetails?.abhaId}") + Log.d("DigitalCardFragment", "Blood Group: ${testDetails?.bloodGroup}") + Log.d("DigitalCardFragment", "Sickle-Cell: ${testDetails?.classificationResult}") +// Log.d("DigitalCardFragment", "Issue Date: $formattedDate") activity?.runOnUiThread { binding.progressBar.visibility = View.GONE + binding.name.text = "Name: ${DataHolder.hemoCubeTestData?.name}" + binding.dob.text = "DOB: ${testDetails?.birthYear}" + binding.gender.text = "Gender: ${testDetails?.gender}" + binding.State.text = "State: ${testDetails?.state}" + binding.abhaid.text = "ABHA ID: ${testDetails?.abhaId}" + binding.blood.text = "Blood Group: ${testDetails?.bloodGroup}" + binding.sicklecell.text = "Sickle-Cell: ${DataHolder.hemoCubeTestData?.prdClassification.toString()}" + } - binding.name.text = "Name: ${testDetails?.name}" - binding.dob.text = "DOB: ${testDetails?.birthYear}" - binding.gender.text = "gender: ${testDetails?.gender}" - binding.State.text = "state: ${testDetails?.state}" - binding.abhaid.text = "ABHA ID: ${testDetails?.abhaId}" - binding.blood.text = "Blood Group: ${testDetails?.bloodGroup}" - binding.sicklecell.text = "Sickle-Cell: ${testDetails?.classificationResult}" - binding.issueDate.text = "Issue Date: $formattedDate" + // Update the UI with the fetched details + val originalDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) + val originalDate: Date? = originalDateFormat.parse(SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time)) + +// Format the parsed date to "mm date, year" + val desiredDateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()) + val formattedDate: String = originalDate?.let { desiredDateFormat.format(it) } ?: "N/A" + activity?.runOnUiThread { + binding.issueDate.text = "Issue Date: ${formattedDate}" + } + } + + } \ No newline at end of file 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 b07c615..6901e53 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 @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -19,6 +20,7 @@ import com.example.hpostesting.data.model.patient.DeviceData import com.example.hpostesting.data.model.patient.toHemoCubeTestData import com.example.hpostesting.presentation.UsbServiceListener import com.example.hpostesting.presentation.dashboard.DashboardActivity +import androidx.navigation.fragment.findNavController import com.example.hpostesting.presentation.utils.MyDialogListener import com.example.hpostesting.presentation.utils.UIUtils import com.google.firebase.crashlytics.ktx.crashlytics @@ -89,8 +91,8 @@ class HemoCubeFragment : Fragment() { binding.nameEditText.visibility = View.GONE binding.tvTitle.visibility = View.GONE binding.btnGo.visibility = View.GONE - binding.btnSubmit.isEnabled = false - binding.btnSubmit.isClickable = false +// binding.btnSubmit.isEnabled = false +// binding.btnSubmit.isClickable = false binding.btnPlacebuffer.visibility = View.GONE binding.tvName.text = "Name: ${testDetails?.name}\n ID: ${testDetails?._id}" @@ -126,22 +128,17 @@ class HemoCubeFragment : Fragment() { hemoCubeViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result -> if (result == "Success") { showToast("Test Results Uploaded Successfully") + activity?.runOnUiThread { + binding.btnSubmit.visibility = View.GONE + binding.btnDigitalCard.visibility = View.VISIBLE + binding.btnDigitalCard.setOnClickListener { + val i = Intent( + requireContext().applicationContext, DigitalCardActivity::class.java + ) + startActivity(i) + } + } - val digitalCardFragment = DigitalCardFragment() - val transaction = parentFragmentManager.beginTransaction() - transaction.replace(R.id.fragment_container, digitalCardFragment) - transaction.addToBackStack(null) - transaction.commit() - -// val i = Intent( -// requireContext().applicationContext, DashboardActivity::class.java -// ) -// startActivity(i) -// (activity as HemocubeActivity).finish() -// val i = Intent( -// requireContext().applicationContext, DashboardActivity::class.java -// ) -// startActivity(i) // (activity as HemocubeActivity).finish() } if (result == "Local") { @@ -451,6 +448,8 @@ class HemoCubeFragment : Fragment() { binding.errorMessage.text = "Error: Invalid Test. Improper buffer reading (high)" binding.errorMessage.visibility = View.VISIBLE + binding.btnSubmit.isEnabled = true + binding.btnSubmit.isClickable = true } } diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt index b4b4305..b9af079 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt @@ -1,11 +1,13 @@ package com.example.hpostesting.presentation.hemocube +import android.app.Application import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.SharedPreferences import android.os.BatteryManager import android.util.Log +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -37,229 +39,241 @@ class HemoCubeViewModel @Inject constructor( ) : ViewModel() { var isServiceConnected = false val progressBar = MutableLiveData(false) - val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() - val messages = MutableLiveData() - private val sharedPreference: SharedPreferences = - context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE) + val testDetails = DataHolder.selectedTest?.toHemoCubeTestData() + val messages = MutableLiveData() + private val sharedPreference: SharedPreferences = + context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE) - // Get the device ID of the device you want to retrieve data for (e.g., the first device in the list) + // Get the device ID of the device you want to retrieve data for (e.g., the first device in the list) - private val _networkStatusLiveData = NetworkStatusLiveData(context) - val allUserData = hemoCubeDao.getAll() - val deviceData = MutableLiveData() - val networkStatusLiveData: LiveData - get() = _networkStatusLiveData - val fireBaseUpload = MutableLiveData() - val fireBaseBulkUpload = MutableLiveData() + private val _networkStatusLiveData = NetworkStatusLiveData(context) + val allUserData = hemoCubeDao.getAll() + val deviceData = MutableLiveData() + val networkStatusLiveData: LiveData + get() = _networkStatusLiveData + val fireBaseUpload = MutableLiveData() + val fireBaseBulkUpload = MutableLiveData() - private val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> - context.registerReceiver(null, ifilter) - } - - fun uploadHemoCubeResultToDatabase(isOnline: Boolean, testStatus: Boolean, kitSerial: String?) = - viewModelScope.launch { - if (kitSerial != null) { - testDetails?.kitSerial = kitSerial + private val batteryStatus: Intent? = + IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> + context.registerReceiver(null, ifilter) } - testDetails?.testStatus = testStatus - try { - if (isOnline) { - parseData() - addResultTestToDb() - } else { - parseData() - testDetails?.testTime = SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss", Locale.getDefault() - ).format(Calendar.getInstance().time) - hemoCubeDao.insertAll(testDetails!!) - fireBaseUpload.postValue("Local") + fun uploadHemoCubeResultToDatabase( + isOnline: Boolean, + testStatus: Boolean, + kitSerial: String? + ) = + viewModelScope.launch { + if (kitSerial != null) { + testDetails?.kitSerial = kitSerial + } + testDetails?.testStatus = testStatus + + try { + if (isOnline) { + parseData() + addResultTestToDb() + } else { + parseData() + testDetails?.testTime = SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time) + hemoCubeDao.insertAll(testDetails!!) + fireBaseUpload.postValue("Local") + } + } catch (e: Exception) { + Log.e("Testdb", "Upload failed: ${e.message}") } - } catch (e: Exception) { - Log.e("Testdb", "Upload failed: ${e.message}") } + + + fun uploadHemoCubeResultToDatabaseforbuffercheckN(bufferCheckData: BufferCheckData) = + viewModelScope.launch { + addResultTestToDbforbuffercheck(bufferCheckData) + } + + fun getDeviceData(deviceId: String?) = viewModelScope.launch { + deviceData.postValue(deviceId?.let { repository.getDeviceDataById(it) }) } - - - fun uploadHemoCubeResultToDatabaseforbuffercheckN(bufferCheckData: BufferCheckData) = - viewModelScope.launch { - addResultTestToDbforbuffercheck(bufferCheckData) - } - - fun getDeviceData(deviceId: String?) = viewModelScope.launch { - deviceData.postValue(deviceId?.let { repository.getDeviceDataById(it) }) - } - - private fun parseData() { - testDetails?.deviceRatio = DataHolder.hemocubeResult - testDetails?.resultData = DataHolder.hemoCubeTestData?.resultData.toString() - testDetails?.location = DataHolder.location - testDetails?.testTime = SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss", Locale.getDefault() - ).format(Calendar.getInstance().time) - testDetails?.appVersion = DataHolder.hemoCubeTestData?.appVersion - testDetails?.deviceId = DataHolder.hemoCubeTestData?.deviceId - testDetails?.deviceSerialNumber = - sharedPreference.getString(Constants.USER_ID, "").toString() - testDetails?.kitSerial = sharedPreference.getString(Constants.KIT_NUMBER, "").toString() - testDetails?.led1Buffer = DataHolder.hemoCubeTestData?.led1Buffer - testDetails?.led2Buffer = DataHolder.hemoCubeTestData?.led2Buffer - testDetails?.led3Buffer = DataHolder.hemoCubeTestData?.led3Buffer - testDetails?.led4Buffer = DataHolder.hemoCubeTestData?.led4Buffer - testDetails?.led1Sample = DataHolder.hemoCubeTestData?.led1Sample - testDetails?.led2Sample = DataHolder.hemoCubeTestData?.led2Sample - testDetails?.led3Sample = DataHolder.hemoCubeTestData?.led3Sample - testDetails?.led4Sample = DataHolder.hemoCubeTestData?.led4Sample - testDetails?.led1Average = DataHolder.hemoCubeTestData?.led1Average - testDetails?.led2Average = DataHolder.hemoCubeTestData?.led2Average - testDetails?.led3Average = DataHolder.hemoCubeTestData?.led3Average - testDetails?.led4Average = DataHolder.hemoCubeTestData?.led4Average - testDetails?.abs1 = DataHolder.hemoCubeTestData?.abs1 - testDetails?.abs2 = DataHolder.hemoCubeTestData?.abs2 - testDetails?.abs3 = DataHolder.hemoCubeTestData?.abs3 - testDetails?.abs4 = DataHolder.hemoCubeTestData?.abs4 - testDetails?.deviceRatio = DataHolder.hemoCubeTestData?.deviceRatio - testDetails?.predictedDenovixRatio = DataHolder.hemoCubeTestData?.predictedDenovixRatio - testDetails?.calculatedRatio = DataHolder.hemoCubeTestData?.calculatedRatio - testDetails?.coefficients = DataHolder.hemoCubeTestData?.coefficients - testDetails?.classificationResult = DataHolder.hemoCubeTestData?.classificationResult!! - testDetails?.prdClassification = DataHolder.hemoCubeTestData?.prdClassification.toString() - testDetails?.batteryLevel = DataHolder.hemoCubeTestData?.batteryLevel.toString() - testDetails?.batteryCapacity = DataHolder.hemoCubeTestData?.batteryCapacity.toString() - testDetails?.batteryMaxCapacity = DataHolder.hemoCubeTestData?.batteryMaxCapacity.toString() - testDetails?.batteryTemperature = DataHolder.hemoCubeTestData?.batteryTemperature.toString() - testDetails?.batteryVoltage = DataHolder.hemoCubeTestData?.batteryVoltage.toString() - } - - private fun addResultTestToDb() { - viewModelScope.launch { - try { - testDetails!!.reportUploadTime = SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss", Locale.getDefault() - ).format(Calendar.getInstance().time) - - when (val response = repository.addTestToDatabase(testDetails)) { - is Response.Success -> { - val kitCount = sharedPreference.getInt(Constants.KIT_COUNT, 0) - with(sharedPreference.edit()) { - putInt(Constants.KIT_COUNT, kitCount.plus(1)) - apply() - } - Log.i("Testdb", "Data uploaded to Firestore successfully") - fireBaseUpload.postValue("Success") - testDetails.localFlag = true - hemoCubeDao.insertAll(testDetails) - } - - is Response.Error -> { - Log.e("Testdb", "Error uploading data to Firestore: $response") - fireBaseUpload.postValue("Error") - hemoCubeDao.insertAll(testDetails) - } - } - } catch (e: Exception) { - Log.e("Testdb", "Exception during data upload: ${e.message}") - fireBaseUpload.postValue("Error") - } - } - } - - - private fun addResultTestToDbforbuffercheck(bufferCheckData: BufferCheckData) { - viewModelScope.launch { - try { - - when (val response = repository.addTestToDatabaseforBufferCheck(bufferCheckData)) { - is Response.Success -> { - Log.i("Testdb", "Data uploaded to Firestore successfully") - fireBaseUpload.postValue("Success") - } - - is Response.Error -> { - Log.e("Testdb", "Error uploading data to Firestore: $response") - fireBaseUpload.postValue("Error") - } - } - } catch (e: Exception) { - Log.e("Testdb", "Exception during data upload: ${e.message}") - fireBaseUpload.postValue("Error") - } - } - } - - fun bulkAddResultTestToDb(userData: HemoCubeTestData) { - viewModelScope.launch { - userData.reportUploadTime = SimpleDateFormat( + private fun parseData() { + testDetails?.deviceRatio = DataHolder.hemocubeResult + testDetails?.resultData = DataHolder.hemoCubeTestData?.resultData.toString() + testDetails?.location = DataHolder.location + testDetails?.testTime = SimpleDateFormat( "yyyy-MM-dd HH:mm:ss", Locale.getDefault() ).format(Calendar.getInstance().time) - when (repository.addTestToDatabase(userData)) { - is Response.Success -> { - fireBaseBulkUpload.postValue("Success") - updateLocalFlag(userData._id) - } + testDetails?.appVersion = DataHolder.hemoCubeTestData?.appVersion + testDetails?.deviceId = DataHolder.hemoCubeTestData?.deviceId + testDetails?.deviceSerialNumber = + sharedPreference.getString(Constants.USER_ID, "").toString() + testDetails?.kitSerial = sharedPreference.getString(Constants.KIT_NUMBER, "").toString() + testDetails?.led1Buffer = DataHolder.hemoCubeTestData?.led1Buffer + testDetails?.led2Buffer = DataHolder.hemoCubeTestData?.led2Buffer + testDetails?.led3Buffer = DataHolder.hemoCubeTestData?.led3Buffer + testDetails?.led4Buffer = DataHolder.hemoCubeTestData?.led4Buffer + testDetails?.led1Sample = DataHolder.hemoCubeTestData?.led1Sample + testDetails?.led2Sample = DataHolder.hemoCubeTestData?.led2Sample + testDetails?.led3Sample = DataHolder.hemoCubeTestData?.led3Sample + testDetails?.led4Sample = DataHolder.hemoCubeTestData?.led4Sample + testDetails?.led1Average = DataHolder.hemoCubeTestData?.led1Average + testDetails?.led2Average = DataHolder.hemoCubeTestData?.led2Average + testDetails?.led3Average = DataHolder.hemoCubeTestData?.led3Average + testDetails?.led4Average = DataHolder.hemoCubeTestData?.led4Average + testDetails?.abs1 = DataHolder.hemoCubeTestData?.abs1 + testDetails?.abs2 = DataHolder.hemoCubeTestData?.abs2 + testDetails?.abs3 = DataHolder.hemoCubeTestData?.abs3 + testDetails?.abs4 = DataHolder.hemoCubeTestData?.abs4 + testDetails?.deviceRatio = DataHolder.hemoCubeTestData?.deviceRatio + testDetails?.predictedDenovixRatio = DataHolder.hemoCubeTestData?.predictedDenovixRatio + testDetails?.calculatedRatio = DataHolder.hemoCubeTestData?.calculatedRatio + testDetails?.coefficients = DataHolder.hemoCubeTestData?.coefficients + testDetails?.classificationResult = DataHolder.hemoCubeTestData?.classificationResult!! + testDetails?.prdClassification = + DataHolder.hemoCubeTestData?.prdClassification.toString() + testDetails?.batteryLevel = DataHolder.hemoCubeTestData?.batteryLevel.toString() + testDetails?.batteryCapacity = DataHolder.hemoCubeTestData?.batteryCapacity.toString() + testDetails?.batteryMaxCapacity = + DataHolder.hemoCubeTestData?.batteryMaxCapacity.toString() + testDetails?.batteryTemperature = + DataHolder.hemoCubeTestData?.batteryTemperature.toString() + testDetails?.batteryVoltage = DataHolder.hemoCubeTestData?.batteryVoltage.toString() + } - else -> { - fireBaseBulkUpload.postValue("Error") + private fun addResultTestToDb() { + viewModelScope.launch { + try { + testDetails!!.reportUploadTime = SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time) + + when (val response = repository.addTestToDatabase(testDetails)) { + is Response.Success -> { + val kitCount = sharedPreference.getInt(Constants.KIT_COUNT, 0) + with(sharedPreference.edit()) { + putInt(Constants.KIT_COUNT, kitCount.plus(1)) + apply() + } + Log.i("Testdb", "Data uploaded to Firestore successfully") + fireBaseUpload.postValue("Success") + testDetails.localFlag = true + hemoCubeDao.insertAll(testDetails) + } + + is Response.Error -> { + Log.e("Testdb", "Error uploading data to Firestore: $response") + fireBaseUpload.postValue("Error") + hemoCubeDao.insertAll(testDetails) + } + } + } catch (e: Exception) { + Log.e("Testdb", "Exception during data upload: ${e.message}") + fireBaseUpload.postValue("Error") } } } - } - private fun updateLocalFlag(userId: String) = viewModelScope.launch { - hemoCubeDao.updateFieldById(id = userId, true) - } - fun addUser(userData: HemoCubeTestData) = viewModelScope.launch { - hemoCubeDao.insertAll(userData) - } + private fun addResultTestToDbforbuffercheck(bufferCheckData: BufferCheckData) { + viewModelScope.launch { + try { - fun deleteById(userId: String) = viewModelScope.launch { - hemoCubeDao.deleteById(id = userId) - } + when (val response = + repository.addTestToDatabaseforBufferCheck(bufferCheckData)) { + is Response.Success -> { + Log.i("Testdb", "Data uploaded to Firestore successfully") + fireBaseUpload.postValue("Success") + } - fun getBatteryLevel(): Float? { - val batteryPct: Float? = batteryStatus?.let { intent -> - val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) - val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) - level * 100 / scale.toFloat() + is Response.Error -> { + Log.e("Testdb", "Error uploading data to Firestore: $response") + fireBaseUpload.postValue("Error") + } + } + } catch (e: Exception) { + Log.e("Testdb", "Exception during data upload: ${e.message}") + fireBaseUpload.postValue("Error") + } + } } - return batteryPct - } + fun bulkAddResultTestToDb(userData: HemoCubeTestData) { + viewModelScope.launch { + userData.reportUploadTime = SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time) + when (repository.addTestToDatabase(userData)) { + is Response.Success -> { + fireBaseBulkUpload.postValue("Success") + updateLocalFlag(userData._id) + } - fun getBatteryTemperature(): Float? { - val batteryTemp: Float? = batteryStatus?.let { intent -> - val temperature = intent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0 - temperature.toFloat() / 10 + else -> { + fireBaseBulkUpload.postValue("Error") + } + } + } } - return batteryTemp + private fun updateLocalFlag(userId: String) = viewModelScope.launch { + hemoCubeDao.updateFieldById(id = userId, true) + } + + fun addUser(userData: HemoCubeTestData) = viewModelScope.launch { + hemoCubeDao.insertAll(userData) + } + + fun deleteById(userId: String) = viewModelScope.launch { + hemoCubeDao.deleteById(id = userId) + } + + fun getBatteryLevel(): Float? { + val batteryPct: Float? = batteryStatus?.let { intent -> + val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) + val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) + level * 100 / scale.toFloat() + } + + return batteryPct + } + + fun getBatteryTemperature(): Float? { + val batteryTemp: Float? = batteryStatus?.let { intent -> + val temperature = intent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0 + temperature.toFloat() / 10 + } + + return batteryTemp + } + + fun getBatteryVoltage(context: Context): Float { + val batteryIntent = + context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) + val voltage = batteryIntent?.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0) ?: 0 + + // milli-volts to volts + return voltage.toFloat() / 1000 + } + + fun getBatteryCapacity(context: Context): Int { + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + val currentCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) + + return currentCapacity + } + + fun getBatteryMaxCapacity(context: Context): Float { + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + val designCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) + val currentCapacity = + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) + + // Calculate the estimated maximum battery capacity in mAh + val maxCapacity = currentCapacity.toFloat() / designCapacity.toFloat() * 100 + + return maxCapacity + } } - - fun getBatteryVoltage(context: Context): Float { - val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) - val voltage = batteryIntent?.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0) ?: 0 - - // milli-volts to volts - return voltage.toFloat() / 1000 - } - - fun getBatteryCapacity(context: Context): Int { - val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager - val currentCapacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) - - return currentCapacity - } - - fun getBatteryMaxCapacity(context: Context): Float { - val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager - val designCapacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) - val currentCapacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER) - - // Calculate the estimated maximum battery capacity in mAh - val maxCapacity = currentCapacity.toFloat() / designCapacity.toFloat() * 100 - - return maxCapacity - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_digital_card.xml b/app/src/main/res/layout/activity_digital_card.xml new file mode 100644 index 0000000..3e8cf38 --- /dev/null +++ b/app/src/main/res/layout/activity_digital_card.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_hemocube.xml b/app/src/main/res/layout/activity_hemocube.xml index a91259a..2d0b501 100644 --- a/app/src/main/res/layout/activity_hemocube.xml +++ b/app/src/main/res/layout/activity_hemocube.xml @@ -1,10 +1,8 @@ - - + app:layout_constraintTop_toTopOf="parent" /> - - - - - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/content_dashboard.xml b/app/src/main/res/layout/content_dashboard.xml index 02c00de..27f66f1 100644 --- a/app/src/main/res/layout/content_dashboard.xml +++ b/app/src/main/res/layout/content_dashboard.xml @@ -18,4 +18,6 @@ app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/dashboard_navigation" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_digital_card.xml b/app/src/main/res/layout/fragment_digital_card.xml index 00aeb77..4a6532a 100644 --- a/app/src/main/res/layout/fragment_digital_card.xml +++ b/app/src/main/res/layout/fragment_digital_card.xml @@ -1,14 +1,13 @@ - + + - - + + + + android:src="@drawable/karnataka" /> + android:src="@drawable/sickle_cell_gov_logo"/> + android:src="@drawable/indianoil"/> + - + android:text="name: Mariya" /> @@ -240,4 +239,3 @@ - \ No newline at end of file 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 3c029b8..a9aa2dd 100644 --- a/app/src/main/res/layout/fragment_hemo_cube_reference.xml +++ b/app/src/main/res/layout/fragment_hemo_cube_reference.xml @@ -205,7 +205,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/btn_submit" /> - +