Compare commits
7 Commits
dev-check-
...
local-data
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
563621d72b | ||
|
|
f922f585b5 | ||
|
|
1742363f1a | ||
|
|
ba9564d867 | ||
|
|
1aaf2ba485 | ||
|
|
85756a7052 | ||
|
|
0141c2791e |
@@ -19,8 +19,8 @@ android {
|
|||||||
applicationId "in.sminnovations.hpostesting.dev"
|
applicationId "in.sminnovations.hpostesting.dev"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 114
|
versionCode 120
|
||||||
versionName "2.1.114"
|
versionName "2.1.120"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,11 @@
|
|||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:theme="@style/Theme.HPOS.NoActionBar"/>
|
android:theme="@style/Theme.HPOS.NoActionBar"/>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.example.hpostesting.presentation.datatransfer.DataTransferActivity"
|
||||||
|
android:exported="false"
|
||||||
|
android:theme="@style/Theme.HPOS.NoActionBar"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpostesting.presentation.hemocube.HemocubeActivity"
|
android:name="com.example.hpostesting.presentation.hemocube.HemocubeActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ object AppModule {
|
|||||||
@Singleton
|
@Singleton
|
||||||
fun provideMyDatabase(@ApplicationContext context: Context): MyDatabase {
|
fun provideMyDatabase(@ApplicationContext context: Context): MyDatabase {
|
||||||
return Room.databaseBuilder(
|
return Room.databaseBuilder(
|
||||||
context, MyDatabase::class.java, "my_database"
|
context, MyDatabase::class.java, "hpos_database"
|
||||||
).fallbackToDestructiveMigration().build()
|
).fallbackToDestructiveMigration().build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
|||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
if(isRegistered) {
|
if(isRegistered) {
|
||||||
try {
|
try {
|
||||||
unregisterReceiver(downloadReceiver)
|
// unregisterReceiver(downloadReceiver)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.d("HomeFragment", e.toString())
|
Log.d("HomeFragment", e.toString())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.core.content.FileProvider
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
@@ -150,7 +151,7 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now re-subscribe to allUserData
|
// Now re-subscribe to allUserData
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { originalUserDataList ->
|
hemoCubeViewModel.allLocalData.observe(viewLifecycleOwner) { originalUserDataList ->
|
||||||
|
|
||||||
Log.d("LOCAL_DB OBSERVE", "OBSERVE CALLED")
|
Log.d("LOCAL_DB OBSERVE", "OBSERVE CALLED")
|
||||||
|
|
||||||
@@ -236,30 +237,34 @@ class HomeFragment : Fragment() {
|
|||||||
logoutUser(requireContext())
|
logoutUser(requireContext())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.btnLogout1.setOnClickListener {
|
||||||
|
logoutUser(requireContext())
|
||||||
|
}
|
||||||
|
|
||||||
binding.uploadData.setOnClickListener {
|
binding.uploadData.setOnClickListener {
|
||||||
// showUploadDialog(requireContext())
|
// showUploadDialog(requireContext())
|
||||||
}
|
}
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
// hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
||||||
|
//
|
||||||
val btnSaveLocalVisibility =
|
// val btnSaveLocalVisibility =
|
||||||
if (userData.any { it.testStatus == true }) View.GONE else View.GONE
|
// if (userData.any { it.testStatus == true }) View.GONE else View.GONE
|
||||||
|
//
|
||||||
binding.downloadCSV.visibility = btnSaveLocalVisibility
|
// binding.downloadCSV.visibility = btnSaveLocalVisibility
|
||||||
|
//
|
||||||
binding.downloadCSV.setOnClickListener {
|
// binding.downloadCSV.setOnClickListener {
|
||||||
if (btnSaveLocalVisibility == View.VISIBLE) {
|
// if (btnSaveLocalVisibility == View.VISIBLE) {
|
||||||
// Execute the action when the button is visible (testStatus is true for at least one user)
|
// // Execute the action when the button is visible (testStatus is true for at least one user)
|
||||||
showDownloadDialog(requireContext())
|
// showDownloadDialog(requireContext())
|
||||||
} else {
|
// } else {
|
||||||
// Handle the case when the button is not visible
|
// // Handle the case when the button is not visible
|
||||||
Toast.makeText(
|
// Toast.makeText(
|
||||||
requireContext(),
|
// requireContext(),
|
||||||
"No test details stored locally",
|
// "No test details stored locally",
|
||||||
Toast.LENGTH_SHORT
|
// Toast.LENGTH_SHORT
|
||||||
).show()
|
// ).show()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
binding.btnNewKit.setOnClickListener {
|
binding.btnNewKit.setOnClickListener {
|
||||||
@@ -271,6 +276,17 @@ class HomeFragment : Fragment() {
|
|||||||
startActivity(Intent(requireContext(), KitScanActivity::class.java))
|
startActivity(Intent(requireContext(), KitScanActivity::class.java))
|
||||||
requireActivity().finish()
|
requireActivity().finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
binding.btnNewKitoffline.setOnClickListener {
|
||||||
|
with(sharedPreference.edit()) {
|
||||||
|
putString(Constants.KIT_NUMBER, "")
|
||||||
|
putInt(Constants.KIT_COUNT, 0)
|
||||||
|
apply()
|
||||||
|
}
|
||||||
|
startActivity(Intent(requireContext(), KitScanActivity::class.java))
|
||||||
|
requireActivity().finish()
|
||||||
|
}
|
||||||
binding.btnQuickCapture.setOnClickListener {
|
binding.btnQuickCapture.setOnClickListener {
|
||||||
DataHolder.hemoCubeTestData = HemoCubeTestData()
|
DataHolder.hemoCubeTestData = HemoCubeTestData()
|
||||||
|
|
||||||
@@ -310,7 +326,7 @@ class HomeFragment : Fragment() {
|
|||||||
hemoCubeViewModel.login(createLoginRequestData(userID, password))
|
hemoCubeViewModel.login(createLoginRequestData(userID, password))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (userID.isEmpty() && password.isEmpty() && deviceId.isNotEmpty()) {
|
} else if (userID == "deviceIDAPI" && password == "devicePasswordAPI" && deviceId.isNotEmpty()) {
|
||||||
fetchDeviceCredentials()
|
fetchDeviceCredentials()
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
@@ -846,16 +862,16 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkForLocalDBData() {
|
private fun checkForLocalDBData() {
|
||||||
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
val uploadDataVisibility = if (userDataList.isEmpty()) View.GONE else View.VISIBLE
|
// val uploadDataVisibility = if (userDataList.isEmpty()) View.GONE else View.VISIBLE
|
||||||
binding.uploadData.visibility = uploadDataVisibility
|
// binding.uploadData.visibility = uploadDataVisibility
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
val uploadDataVisibility =
|
// val uploadDataVisibility =
|
||||||
if (userDataList.any { !it.localFlag && !it.molbioFlag && it.testStatus == true }) View.VISIBLE else View.GONE
|
// if (userDataList.any { !it.localFlag && !it.molbioFlag && it.testStatus == true }) View.VISIBLE else View.GONE
|
||||||
binding.uploadData.visibility = uploadDataVisibility
|
// binding.uploadData.visibility = uploadDataVisibility
|
||||||
}
|
// }
|
||||||
|
|
||||||
hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { bufferData ->
|
hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { bufferData ->
|
||||||
val uploadDataVisibility =
|
val uploadDataVisibility =
|
||||||
@@ -865,11 +881,11 @@ class HomeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkUnprocessedCSVData() {
|
private fun checkUnprocessedCSVData() {
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
val downloadDataVisibility =
|
// val downloadDataVisibility =
|
||||||
if (userDataList.any { !it.isCSVCreated && it.testStatus == true }) View.GONE else View.GONE
|
// if (userDataList.any { !it.isCSVCreated && it.testStatus == true }) View.GONE else View.GONE
|
||||||
binding.downloadCSV.visibility = downloadDataVisibility
|
// binding.downloadCSV.visibility = downloadDataVisibility
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun sanitizeDoubleValues(hemoCubeTestData: HemoCubeTestData): HemoCubeTestData {
|
private fun sanitizeDoubleValues(hemoCubeTestData: HemoCubeTestData): HemoCubeTestData {
|
||||||
@@ -922,23 +938,23 @@ class HomeFragment : Fragment() {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
private fun uploadLocalDBData(dialog: DialogInterface) {
|
private fun uploadLocalDBData(dialog: DialogInterface) {
|
||||||
viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// viewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
if (userDataList.isEmpty()) {
|
// if (userDataList.isEmpty()) {
|
||||||
dialog.dismiss()
|
// dialog.dismiss()
|
||||||
} else {
|
// } else {
|
||||||
userDataList.forEach { userData ->
|
// userDataList.forEach { userData ->
|
||||||
viewModel.bulkUploadResultToDatabase(userData)
|
// viewModel.bulkUploadResultToDatabase(userData)
|
||||||
viewModel.deleteById(userData._id)
|
// viewModel.deleteById(userData._id)
|
||||||
}
|
// }
|
||||||
dialog.dismiss()
|
// dialog.dismiss()
|
||||||
Toast.makeText(
|
// Toast.makeText(
|
||||||
requireContext(), R.string.upload_success_message, Toast.LENGTH_SHORT
|
// requireContext(), R.string.upload_success_message, Toast.LENGTH_SHORT
|
||||||
).show()
|
// ).show()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
val resultList = MolbioV2ResultRequest(mutableListOf(MolbioV2Result()))
|
// val resultList = MolbioV2ResultRequest(mutableListOf(MolbioV2Result()))
|
||||||
// userDataList.forEach { userData ->
|
// userDataList.forEach { userData ->
|
||||||
// if (!userData.molbioFlag && isTokenAvailable) {
|
// if (!userData.molbioFlag && isTokenAvailable) {
|
||||||
// resultList.results?.add(
|
// resultList.results?.add(
|
||||||
@@ -967,8 +983,8 @@ class HomeFragment : Fragment() {
|
|||||||
// hemoCubeViewModel.uploadResult(resultList)
|
// hemoCubeViewModel.uploadResult(resultList)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
dialog.dismiss()
|
// dialog.dismiss()
|
||||||
}
|
// }
|
||||||
|
|
||||||
hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { kitDataList ->
|
hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { kitDataList ->
|
||||||
kitDataList.forEach { userData ->
|
kitDataList.forEach { userData ->
|
||||||
@@ -1043,7 +1059,7 @@ class HomeFragment : Fragment() {
|
|||||||
builder.setMessage(R.string.download_db_registration_message)
|
builder.setMessage(R.string.download_db_registration_message)
|
||||||
|
|
||||||
builder.setPositiveButton(R.string.downloadcsv) { dialog, _ ->
|
builder.setPositiveButton(R.string.downloadcsv) { dialog, _ ->
|
||||||
downloadLocalDBData(dialog)
|
// downloadLocalDBData(dialog)
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setNegativeButton(R.string.cancel) { dialog, _ ->
|
builder.setNegativeButton(R.string.cancel) { dialog, _ ->
|
||||||
@@ -1054,49 +1070,49 @@ class HomeFragment : Fragment() {
|
|||||||
dialog.show()
|
dialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun downloadLocalDBData(dialog: DialogInterface) {
|
// private fun downloadLocalDBData(dialog: DialogInterface) {
|
||||||
var csvDownloaded = false
|
// var csvDownloaded = false
|
||||||
hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
// hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userDataList ->
|
||||||
try {
|
// try {
|
||||||
if (!csvDownloaded) {
|
// if (!csvDownloaded) {
|
||||||
val downloadList = mutableListOf<HemoCubeTestData>()
|
// val downloadList = mutableListOf<HemoCubeTestData>()
|
||||||
|
//
|
||||||
userDataList.forEach { userData ->
|
// userDataList.forEach { userData ->
|
||||||
if (userData.testStatus == true) {
|
// if (userData.testStatus == true) {
|
||||||
// if (!userData.isCSVCreated) {
|
//// if (!userData.isCSVCreated) {
|
||||||
downloadList.add(userData) // Add the userData to downloadList
|
// downloadList.add(userData) // Add the userData to downloadList
|
||||||
}
|
|
||||||
// }
|
// }
|
||||||
}
|
//// }
|
||||||
|
// }
|
||||||
if (downloadList.isNotEmpty()) {
|
//
|
||||||
// Call ViewModel function to create CSV with filtered data
|
// if (downloadList.isNotEmpty()) {
|
||||||
hemoCubeViewModel.createCSV(downloadList, requireContext())
|
// // Call ViewModel function to create CSV with filtered data
|
||||||
csvDownloaded = true
|
// hemoCubeViewModel.createCSV(downloadList, requireContext())
|
||||||
Toast.makeText(
|
// csvDownloaded = true
|
||||||
requireContext(),
|
// Toast.makeText(
|
||||||
"CSV file downloaded successfully",
|
// requireContext(),
|
||||||
Toast.LENGTH_SHORT
|
// "CSV file downloaded successfully",
|
||||||
).show()
|
// Toast.LENGTH_SHORT
|
||||||
} else {
|
// ).show()
|
||||||
Toast.makeText(
|
// } else {
|
||||||
requireContext(),
|
// Toast.makeText(
|
||||||
"No data to download",
|
// requireContext(),
|
||||||
Toast.LENGTH_SHORT
|
// "No data to download",
|
||||||
)
|
// Toast.LENGTH_SHORT
|
||||||
.show()
|
// )
|
||||||
}
|
// .show()
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
} catch (e: Exception) {
|
//
|
||||||
e.printStackTrace()
|
// } catch (e: Exception) {
|
||||||
Toast.makeText(requireContext(), "Error downloading CSV file", Toast.LENGTH_SHORT)
|
// e.printStackTrace()
|
||||||
.show()
|
// Toast.makeText(requireContext(), "Error downloading CSV file", Toast.LENGTH_SHORT)
|
||||||
} finally {
|
// .show()
|
||||||
dialog.dismiss()
|
// } finally {
|
||||||
}
|
// dialog.dismiss()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
private fun getDeviceId() {
|
private fun getDeviceId() {
|
||||||
Log.d("HomeFragmentUSb","getDeviceId")
|
Log.d("HomeFragmentUSb","getDeviceId")
|
||||||
@@ -1158,7 +1174,7 @@ class HomeFragment : Fragment() {
|
|||||||
val deviceUpdateAvailableGlobal= deviceData.deviceUpdateAvailable
|
val deviceUpdateAvailableGlobal= deviceData.deviceUpdateAvailable
|
||||||
val updatePathGlobal= deviceData.updatePath
|
val updatePathGlobal= deviceData.updatePath
|
||||||
|
|
||||||
// if(deviceUpdateAvailableGlobal){
|
|
||||||
db.collection("devices").whereEqualTo("deviceId", deviceId).get().addOnSuccessListener { documentSnapshotNew ->
|
db.collection("devices").whereEqualTo("deviceId", deviceId).get().addOnSuccessListener { documentSnapshotNew ->
|
||||||
if (documentSnapshotNew.documents.isNotEmpty()) {
|
if (documentSnapshotNew.documents.isNotEmpty()) {
|
||||||
documentSnapshotNew.documents.forEach{
|
documentSnapshotNew.documents.forEach{
|
||||||
@@ -1182,14 +1198,24 @@ class HomeFragment : Fragment() {
|
|||||||
Log.d("HomeFragmentUpdate","Device update not available")
|
Log.d("HomeFragmentUpdate","Device update not available")
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if(!globalUpdateDone){
|
if(deviceUpdateAvailableGlobal) {
|
||||||
val update = db.collection("devices").document(it.id).update("globalUpdateDone",true)
|
if (!globalUpdateDone) {
|
||||||
update.addOnSuccessListener {
|
val update =
|
||||||
Log.d("HomeFragmentUpdate","Device global update done")
|
db.collection("devices").document(it.id)
|
||||||
|
.update("globalUpdateDone", true)
|
||||||
|
update.addOnSuccessListener {
|
||||||
|
Log.d(
|
||||||
|
"HomeFragmentUpdate",
|
||||||
|
"Device global update done"
|
||||||
|
)
|
||||||
|
|
||||||
initiateUpdate(updatePathGlobal)
|
initiateUpdate(updatePathGlobal)
|
||||||
}.addOnFailureListener{
|
}.addOnFailureListener {
|
||||||
Log.e("fetchDeviceUpdate", "update fail.")
|
Log.e(
|
||||||
|
"fetchDeviceUpdate",
|
||||||
|
"update fail."
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1211,8 +1237,7 @@ class HomeFragment : Fragment() {
|
|||||||
"fetchDeviceCredentials",
|
"fetchDeviceCredentials",
|
||||||
"deviceVersion: $deviceVersion, Password: $deviceUpdateAvailableGlobal, updatePath: $updatePathGlobal"
|
"deviceVersion: $deviceVersion, Password: $deviceUpdateAvailableGlobal, updatePath: $updatePathGlobal"
|
||||||
)
|
)
|
||||||
|
// ?: Log.e("fetchDeviceUpdate", "Failed to parse device data.")
|
||||||
// } ?: Log.e("fetchDeviceUpdate", "Failed to parse device data.")
|
|
||||||
} else {
|
} else {
|
||||||
Log.e("fetchDeviceUpdate", "Document does not exist.")
|
Log.e("fetchDeviceUpdate", "Document does not exist.")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.example.hpostesting.presentation.datatransfer
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import `in`.sminnovations.hpostesting.databinding.ActivityDataTransferBinding
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class DataTransferActivity : AppCompatActivity() {
|
||||||
|
lateinit var binding: ActivityDataTransferBinding
|
||||||
|
lateinit var sharedPreference: SharedPreferences
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
binding = ActivityDataTransferBinding.inflate(layoutInflater)
|
||||||
|
sharedPreference = this.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE)
|
||||||
|
setContentView(binding.root)
|
||||||
|
|
||||||
|
if (savedInstanceState == null) {
|
||||||
|
supportFragmentManager.beginTransaction()
|
||||||
|
.replace(binding.fgDataTransfer.id, DataTransferFragment())
|
||||||
|
.commit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.example.hpostesting.presentation.datatransfer
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import com.google.firebase.storage.FirebaseStorage
|
||||||
|
import `in`.sminnovations.hpostesting.databinding.FragmentAssuranceControlsBinding
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class DataTransferFragment : Fragment() {
|
||||||
|
private lateinit var binding: FragmentAssuranceControlsBinding
|
||||||
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
|
private lateinit var databasePath: String
|
||||||
|
private val storage = FirebaseStorage.getInstance()
|
||||||
|
private val storageReference = storage.reference
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?,
|
||||||
|
): View {
|
||||||
|
binding = FragmentAssuranceControlsBinding.inflate(inflater, container, false)
|
||||||
|
sharedPreferences = requireContext().getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE)
|
||||||
|
|
||||||
|
val databaseName = "hpos_database.db"
|
||||||
|
databasePath = requireContext().getDatabasePath(databaseName).absolutePath
|
||||||
|
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
initViews()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initViews() {
|
||||||
|
binding.btnSubmit.setOnClickListener {
|
||||||
|
uploadDatabaseFile()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun uploadDatabaseFile() {
|
||||||
|
val databaseFile = File(databasePath)
|
||||||
|
val deviceId = "unknown"
|
||||||
|
|
||||||
|
if (databaseFile.exists()) {
|
||||||
|
val storageRef = storageReference.child("databases/${deviceId}/${databaseFile.name}")
|
||||||
|
|
||||||
|
val fileUri = android.net.Uri.fromFile(databaseFile)
|
||||||
|
val fileReference = storageRef.child(fileUri.lastPathSegment!!)
|
||||||
|
|
||||||
|
fileReference.putFile(fileUri)
|
||||||
|
.addOnSuccessListener {
|
||||||
|
|
||||||
|
}
|
||||||
|
.addOnFailureListener {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.example.hpostesting.presentation.datatransfer
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
|
||||||
|
class DataTransferViewModel : ViewModel() {
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -172,10 +173,11 @@ class HemoCubeFragment : Fragment() {
|
|||||||
it.exception.let { message ->
|
it.exception.let { message ->
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
activity,
|
activity,
|
||||||
"An error occurred: $message",
|
"$message",
|
||||||
Toast.LENGTH_LONG
|
Toast.LENGTH_LONG
|
||||||
)
|
)
|
||||||
.show()
|
.show()
|
||||||
|
Log.d("resultuploadfail1", message.toString())
|
||||||
}
|
}
|
||||||
handleReadingFinish()
|
handleReadingFinish()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import com.example.hpostesting.data.model.updates.DeviceUpdateRequest
|
|||||||
import com.example.hpostesting.data.repository.Repository
|
import com.example.hpostesting.data.repository.Repository
|
||||||
import com.example.hpostesting.domain.CheckUpdateWorker
|
import com.example.hpostesting.domain.CheckUpdateWorker
|
||||||
import com.example.hpostesting.domain.LogFileManager
|
import com.example.hpostesting.domain.LogFileManager
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
@@ -88,6 +89,7 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
|
|
||||||
private val _networkStatusLiveData = NetworkStatusLiveData(context)
|
private val _networkStatusLiveData = NetworkStatusLiveData(context)
|
||||||
val allUserData = hemoCubeDao.getAll()
|
val allUserData = hemoCubeDao.getAll()
|
||||||
|
val allLocalData = hemoCubeDao.getAll()
|
||||||
val allPendingUserToUpload = MutableLiveData<List<HemoCubeTestData>>()
|
val allPendingUserToUpload = MutableLiveData<List<HemoCubeTestData>>()
|
||||||
val allKitTestData = hemoCubeBufferDao.getAll()
|
val allKitTestData = hemoCubeBufferDao.getAll()
|
||||||
val deviceData = MutableLiveData<DeviceData?>()
|
val deviceData = MutableLiveData<DeviceData?>()
|
||||||
@@ -333,20 +335,24 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
fireBaseUpload.postValue("Success")
|
fireBaseUpload.postValue("Success")
|
||||||
testDetails.localFlag = true
|
testDetails.localFlag = true
|
||||||
if (Constants.MOLBIO_INTEGRATION) {
|
if (Constants.MOLBIO_INTEGRATION) {
|
||||||
|
// Sanitize testDetails before using it in the API call
|
||||||
|
val sanitizedTestDetails = sanitizeDoubleValues(testDetails)
|
||||||
|
|
||||||
|
// Now, use sanitizedTestDetails for the API call
|
||||||
uploadResult(
|
uploadResult(
|
||||||
MolbioV2ResultRequest(
|
MolbioV2ResultRequest(
|
||||||
mutableListOf(
|
mutableListOf(
|
||||||
MolbioV2Result(
|
MolbioV2Result(
|
||||||
rawData = testDetails,
|
rawData = sanitizedTestDetails,
|
||||||
analysisId = testDetails._id,
|
analysisId = sanitizedTestDetails._id,
|
||||||
analysisDate = testDetails.testTime,
|
analysisDate = sanitizedTestDetails.testTime,
|
||||||
analysisStatus = testDetails.classificationResult,
|
analysisStatus = sanitizedTestDetails.classificationResult,
|
||||||
thresholds = Constants.BUFFER_INTENSITY_THRESHOLDS[testDetails.deviceId].toString(),
|
thresholds = Constants.BUFFER_INTENSITY_THRESHOLDS[sanitizedTestDetails.deviceId]?.toString(),
|
||||||
interpretation = testDetails.classificationResult,
|
interpretation = sanitizedTestDetails.classificationResult,
|
||||||
testId = testDetails._id,
|
testId = sanitizedTestDetails._id,
|
||||||
testTime = testDetails.testTime,
|
testTime = sanitizedTestDetails.testTime,
|
||||||
collectionTime = testDetails.testTime,
|
collectionTime = sanitizedTestDetails.testTime,
|
||||||
expiryTime = testDetails.testTime,
|
expiryTime = sanitizedTestDetails.testTime,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -375,7 +381,7 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
userData.reportUploadTime = SimpleDateFormat(
|
userData.reportUploadTime = SimpleDateFormat(
|
||||||
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
||||||
).format(Calendar.getInstance().time)
|
).format(Calendar.getInstance().time)
|
||||||
when (repository.addTestToDatabasefornew(userData)) {
|
when (repository.addTestToDatabase(userData)) {
|
||||||
is Response.Success -> {
|
is Response.Success -> {
|
||||||
fireBaseBulkUpload.postValue("Success")
|
fireBaseBulkUpload.postValue("Success")
|
||||||
updateLocalFlag(userData._id)
|
updateLocalFlag(userData._id)
|
||||||
@@ -388,6 +394,19 @@ class HemoCubeViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun sanitizeDoubleValues(hemoCubeTestData: HemoCubeTestData): HemoCubeTestData {
|
||||||
|
hemoCubeTestData::class.java.declaredFields.forEach { field ->
|
||||||
|
if (field.type == Double::class.javaObjectType || field.type == Double::class.javaPrimitiveType) {
|
||||||
|
field.isAccessible = true
|
||||||
|
val value = field.get(hemoCubeTestData) as Double?
|
||||||
|
if (value != null && (value.isInfinite() || value.isNaN())) {
|
||||||
|
field.set(hemoCubeTestData, 0.0) // Replace with a suitable default value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hemoCubeTestData
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateLocalFlag(userId: String) = viewModelScope.launch {
|
private fun updateLocalFlag(userId: String) = viewModelScope.launch {
|
||||||
hemoCubeDao.updateFieldById(id = userId, true)
|
hemoCubeDao.updateFieldById(id = userId, true)
|
||||||
}
|
}
|
||||||
|
|||||||
24
app/src/main/res/layout/activity_data_transfer.xml
Normal file
24
app/src/main/res/layout/activity_data_transfer.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/cl_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/fg_data_transfer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
tools:context=".presentation.assurance.AssuranceControlsActivity">
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</layout>
|
||||||
63
app/src/main/res/layout/fragment_data_transfer.xml
Normal file
63
app/src/main/res/layout/fragment_data_transfer.xml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="com.example.hpostesting.presentation.datatransfer.DataTransferFragment">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_subtitle2"
|
||||||
|
style="@style/title2"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:textSize="22sp"
|
||||||
|
android:text="Local Data Transfer"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_submit"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginTop="352dp"
|
||||||
|
android:clickable="false"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="Upload"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
app:cornerRadius="16dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_subtitle2" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/iv_check"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:layout_marginTop="40dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:src="@drawable/check"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/btn_submit" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBar"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:elevation="12dp"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:indeterminateDrawable="@drawable/progressbar_drawable"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -38,10 +38,20 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:padding="24dp">
|
android:padding="24dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/btnLogout1"
|
||||||
|
android:layout_width="30dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:src="@drawable/baseline_logout_24"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/internetNotAvailableCL"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_title_no_internet"
|
android:id="@+id/tv_title_no_internet"
|
||||||
style="@style/title1"
|
style="@style/title1"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:layout_marginTop="24dp"
|
android:layout_marginTop="24dp"
|
||||||
@@ -125,6 +135,27 @@
|
|||||||
<!-- app:layout_constraintBottom_toBottomOf="@+id/rv_order_offline"-->
|
<!-- app:layout_constraintBottom_toBottomOf="@+id/rv_order_offline"-->
|
||||||
<!-- app:layout_constraintStart_toStartOf="parent" />-->
|
<!-- app:layout_constraintStart_toStartOf="parent" />-->
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/label1"
|
||||||
|
style="@style/title1_1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/new_kit"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/btnNewKitoffline"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
|
android:id="@+id/btnNewKitoffline"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:backgroundTint="@color/primary"
|
||||||
|
android:contentDescription="@string/new_kit"
|
||||||
|
android:src="@drawable/ic_add"
|
||||||
|
app:elevation="1dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<external-files-path name="downloaded_file" path="." />
|
<external-files-path name="Updates" path="." />
|
||||||
</paths>
|
</paths>
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ buildscript {
|
|||||||
kotlin_version = '1.8.21'
|
kotlin_version = '1.8.21'
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:8.3.0'
|
classpath 'com.android.tools.build:gradle:8.2.2'
|
||||||
classpath 'com.google.gms:google-services:4.4.0'
|
classpath 'com.google.gms:google-services:4.4.1'
|
||||||
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.1'
|
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.1.0'
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,4 +1,4 @@
|
|||||||
#Tue Feb 27 16:09:58 IST 2024
|
#Mon Mar 04 17:08:24 IST 2024
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||||
|
|||||||
Reference in New Issue
Block a user