diff --git a/app/src/main/java/com/example/hpos/data/DataHolder.kt b/app/src/main/java/com/example/hpos/data/DataHolder.kt index 861c14f..7b9305a 100644 --- a/app/src/main/java/com/example/hpos/data/DataHolder.kt +++ b/app/src/main/java/com/example/hpos/data/DataHolder.kt @@ -11,6 +11,8 @@ object DataHolder { val usbConnected = MutableLiveData(true) + var mobileUniqueId: String? = null + var isStoragePermissionGranted = false var isAppFolderCreated = false var appFolderPath = "" diff --git a/app/src/main/java/com/example/hpos/data/FileUploader.kt b/app/src/main/java/com/example/hpos/data/FileUploader.kt new file mode 100644 index 0000000..bb64327 --- /dev/null +++ b/app/src/main/java/com/example/hpos/data/FileUploader.kt @@ -0,0 +1,4 @@ +package com.example.hpos.data + +class FileUploader { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/data/model/PendingQueue.kt b/app/src/main/java/com/example/hpos/data/model/PendingQueue.kt deleted file mode 100644 index 18385e2..0000000 --- a/app/src/main/java/com/example/hpos/data/model/PendingQueue.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.hpos.data.model - -data class PendingQueue( - val photoInDevicePath: String?, - val csvInDevicePath: String?, - val detailedCsvInDevicePath: String?, - val pdfReportInDevicePath: String? -) diff --git a/app/src/main/java/com/example/hpos/data/model/PendingUploads.kt b/app/src/main/java/com/example/hpos/data/model/PendingUploads.kt new file mode 100644 index 0000000..e08f127 --- /dev/null +++ b/app/src/main/java/com/example/hpos/data/model/PendingUploads.kt @@ -0,0 +1,11 @@ +package com.example.hpos.data.model + +import java.util.Date + +data class PendingUploads( + val pendingId: String, + val mobileId: String, + val patientId: String, + val filePath: String, + val timeAdded: Date +) diff --git a/app/src/main/java/com/example/hpos/data/Response.kt b/app/src/main/java/com/example/hpos/data/model/Response.kt similarity index 84% rename from app/src/main/java/com/example/hpos/data/Response.kt rename to app/src/main/java/com/example/hpos/data/model/Response.kt index ac0868f..8c5886d 100644 --- a/app/src/main/java/com/example/hpos/data/Response.kt +++ b/app/src/main/java/com/example/hpos/data/model/Response.kt @@ -1,4 +1,4 @@ -package com.example.hpos.data +package com.example.hpos.data.model sealed class Response { data class Success(val data: T) : Response() diff --git a/app/src/main/java/com/example/hpos/data/DatabaseRepository.kt b/app/src/main/java/com/example/hpos/data/repository/DatabaseRepository.kt similarity index 61% rename from app/src/main/java/com/example/hpos/data/DatabaseRepository.kt rename to app/src/main/java/com/example/hpos/data/repository/DatabaseRepository.kt index e3528b8..ec78f9b 100644 --- a/app/src/main/java/com/example/hpos/data/DatabaseRepository.kt +++ b/app/src/main/java/com/example/hpos/data/repository/DatabaseRepository.kt @@ -1,18 +1,22 @@ -package com.example.hpos.data +package com.example.hpos.data.repository +import android.net.Uri +import com.example.hpos.data.model.Response +import com.example.hpos.data.model.PendingUploads import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.data.model.test.TestDetails import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.Query import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase -import com.google.firebase.storage.FirebaseStorage +import com.google.firebase.storage.ktx.storage import kotlinx.coroutines.tasks.await +import java.io.File class DatabaseRepository : Repository { private val db: FirebaseFirestore = Firebase.firestore - private val storage = FirebaseStorage.getInstance().reference + private val storage = Firebase.storage suspend fun addPatientToDatabase(data: PatientDetails) : Response { return try { @@ -79,9 +83,46 @@ class DatabaseRepository : Repository { } } + suspend fun uploadFileToStorage(id: String, filePath: String): Response { + try { -// suspend fun updateTestData(id: String, newTest: TestDetails, isUpdate): Boolean { -// -// } + val file = Uri.fromFile(File(filePath)) + val riversRef = storage.reference.child("$id/${file.lastPathSegment}") + riversRef.putFile(file).await() + return Response.Success(true) + + } catch (e: Exception) { + e.printStackTrace() + return Response.Error(e) + } + } + + suspend fun addToPendingQueue(pendingUploads: PendingUploads): Response { + return try { + db.collection("pendingUploads") + .document(pendingUploads.pendingId) + .set(pendingUploads) + .await() + + Response.Success(true) + } catch (e: Exception) { + e.printStackTrace() + Response.Error(e) + } + } + + suspend fun removeFromPendingQueue(pendingId: String): Response { + return try { + db.collection("pendingUploads") + .document(pendingId) + .delete() + .await() + + Response.Success(true) + } catch (e: Exception) { + e.printStackTrace() + Response.Error(e) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/data/LocalFileRepository.kt b/app/src/main/java/com/example/hpos/data/repository/LocalFileRepository.kt similarity index 90% rename from app/src/main/java/com/example/hpos/data/LocalFileRepository.kt rename to app/src/main/java/com/example/hpos/data/repository/LocalFileRepository.kt index 452f442..9eae08b 100644 --- a/app/src/main/java/com/example/hpos/data/LocalFileRepository.kt +++ b/app/src/main/java/com/example/hpos/data/repository/LocalFileRepository.kt @@ -1,4 +1,4 @@ -package com.example.hpos.data +package com.example.hpos.data.repository import com.example.hpos.data.datasource.LocalFileDataSource diff --git a/app/src/main/java/com/example/hpos/data/Repository.kt b/app/src/main/java/com/example/hpos/data/repository/Repository.kt similarity index 65% rename from app/src/main/java/com/example/hpos/data/Repository.kt rename to app/src/main/java/com/example/hpos/data/repository/Repository.kt index 257ad79..ab985b6 100644 --- a/app/src/main/java/com/example/hpos/data/Repository.kt +++ b/app/src/main/java/com/example/hpos/data/repository/Repository.kt @@ -1,4 +1,4 @@ -package com.example.hpos.data +package com.example.hpos.data.repository interface Repository { // suspend fun addToDatabase(data: PatientDetails) diff --git a/app/src/main/java/com/example/hpos/domain/SaveRawData.kt b/app/src/main/java/com/example/hpos/domain/SaveRawData.kt index 603ecfa..155420b 100644 --- a/app/src/main/java/com/example/hpos/domain/SaveRawData.kt +++ b/app/src/main/java/com/example/hpos/domain/SaveRawData.kt @@ -1,7 +1,7 @@ package com.example.hpos.domain import android.util.Log -import com.example.hpos.data.LocalFileRepository +import com.example.hpos.data.repository.LocalFileRepository import com.example.hpos.data.constant.Constants import com.example.hpos.data.model.test.TestDetails import com.example.hpos.data.model.test.TestRightCalculationData diff --git a/app/src/main/java/com/example/hpos/domain/SaveRawDataTest.kt b/app/src/main/java/com/example/hpos/domain/SaveRawDataTest.kt index ac39d9f..4173f7c 100644 --- a/app/src/main/java/com/example/hpos/domain/SaveRawDataTest.kt +++ b/app/src/main/java/com/example/hpos/domain/SaveRawDataTest.kt @@ -1,6 +1,6 @@ package com.example.hpos.domain -import com.example.hpos.data.LocalFileRepository +import com.example.hpos.data.repository.LocalFileRepository import com.example.hpos.data.model.CalculationVariableForTest class SaveRawDataTest(private val localFileRepository: LocalFileRepository) { diff --git a/app/src/main/java/com/example/hpos/presentation/SplashActivity.kt b/app/src/main/java/com/example/hpos/presentation/SplashActivity.kt index 6aa9419..757f463 100644 --- a/app/src/main/java/com/example/hpos/presentation/SplashActivity.kt +++ b/app/src/main/java/com/example/hpos/presentation/SplashActivity.kt @@ -41,6 +41,7 @@ class SplashActivity : AppCompatActivity() { setContentView(binding.root) setupFirestoreCache() + setupStaticConstants() checkForStoragePermissions() checkForLocationPermission() @@ -53,6 +54,10 @@ class SplashActivity : AppCompatActivity() { } + private fun setupStaticConstants() { + DataHolder.mobileUniqueId = Settings.Secure.getString(applicationContext.contentResolver, Settings.Secure.ANDROID_ID) + } + private fun setupFirestoreCache() { val settings = FirebaseFirestoreSettings.Builder() .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED) diff --git a/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardActivity.kt b/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardActivity.kt index b6131f6..bd0fb3e 100644 --- a/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardActivity.kt +++ b/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardActivity.kt @@ -2,6 +2,7 @@ package com.example.hpos.presentation.dashboard import android.os.Bundle import android.view.Menu +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.ViewModelProvider @@ -12,6 +13,7 @@ import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.example.hpos.R import com.example.hpos.databinding.ActivityDashboardBinding +import com.example.hpos.util.MyUtils import com.example.hpos.util.MyViewModelFactory import com.google.android.material.navigation.NavigationView @@ -32,8 +34,7 @@ class DashboardActivity : AppCompatActivity() { val drawerLayout: DrawerLayout = binding.drawerLayout val navView: NavigationView = binding.navView val navController = findNavController(R.id.nav_host_fragment_content_dashboard) - // Passing each menu ID as a set of Ids because each - // menu should be considered as top level destinations. + appBarConfiguration = AppBarConfiguration( setOf( R.id.nav_home, R.id.nav_profile, R.id.nav_settings @@ -42,9 +43,6 @@ class DashboardActivity : AppCompatActivity() { setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) -// val i = Intent(applicationContext, MainActivity::class.java) -// startActivity(i) - viewModel = ViewModelProvider( this, MyViewModelFactory() diff --git a/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardViewModel.kt b/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardViewModel.kt index 09a27e2..055e1a6 100644 --- a/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/com/example/hpos/presentation/dashboard/DashboardViewModel.kt @@ -1,13 +1,12 @@ package com.example.hpos.presentation.dashboard -import android.content.Context -import android.provider.Settings import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.hpos.BuildConfig -import com.example.hpos.data.DatabaseRepository -import com.example.hpos.data.Response +import com.example.hpos.data.DataHolder +import com.example.hpos.data.repository.DatabaseRepository +import com.example.hpos.data.model.Response import com.example.hpos.data.model.AadharCard import com.example.hpos.data.model.Location import com.example.hpos.data.model.patient.PatientDetails @@ -65,9 +64,8 @@ class DashboardViewModel() : ViewModel() { } - fun createTest(context: Context) { + fun createTest() { val mTestId = MyUtils.generateTestIdForPatient(patientDetails.id) - val mMobileId = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) testDetails = TestDetails( testID = mTestId, @@ -81,7 +79,7 @@ class DashboardViewModel() : ViewModel() { csvPath = null, logPath = null, deviceId = null, - mobileId = mMobileId, + mobileId = DataHolder.mobileUniqueId!!, kitSerial = null, location = deviceLocation, appVersion = BuildConfig.VERSION_CODE.toString(), diff --git a/app/src/main/java/com/example/hpos/presentation/dashboard/register/RegisterThreeEnterPatientDetails.kt b/app/src/main/java/com/example/hpos/presentation/dashboard/register/RegisterThreeEnterPatientDetails.kt index 5627910..ab12036 100644 --- a/app/src/main/java/com/example/hpos/presentation/dashboard/register/RegisterThreeEnterPatientDetails.kt +++ b/app/src/main/java/com/example/hpos/presentation/dashboard/register/RegisterThreeEnterPatientDetails.kt @@ -14,7 +14,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.example.hpos.R -import com.example.hpos.data.Response +import com.example.hpos.data.model.Response import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.databinding.FragmentRegisterThreeEnterPatientDetailsBinding import com.example.hpos.presentation.dashboard.DashboardViewModel @@ -71,7 +71,7 @@ class RegisterThreeEnterPatientDetails : Fragment() { if (mPatient != null) { viewModel.patientDetails = mPatient viewModel.pushPatientDetailsToDb() - viewModel.createTest(requireContext()) + viewModel.createTest() moveToNextPage() } else { Toast.makeText(requireContext(), "Fields can't be empty", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt index 4f2c3b5..33b40dd 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightExpSample.kt @@ -242,59 +242,26 @@ class TestRightExpSample : Fragment() { } private fun saveDataLocally() { - val patientName = viewModel.testDetails?.patientName - + // OLD ------------------------------ +// val patientName = viewModel.testDetails?.patientName // if (patientName.length > 5){ // patientName = patientName.substring(0, 5) // } +// val id = PreferenceUtility.generateId(requireContext()) - val id = PreferenceUtility.generateId(requireContext()) - - // OLD ------------------------------ // val prefixCsv: String = if (DataHolder.selectedTestType == TestType.SICKLECERT) // "HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_" // else // "HPOSSF_${DataHolder.deviceSerialNumber}_${patientName}_" - // NEW ------------------------------ - val prefixCsv: String = if (DataHolder.selectedTestType == TestType.SICKLECERT) - "HPOSSC_${viewModel.testDetails?.testID}" - else - "HPOSSF_${viewModel.testDetails?.testID}" - -// val prefixCsv = "HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_" - val fileExtensionCsv = ".csv" - - // OLD ------------------------------ // val fileNameCsv = prefixCsv + id + fileExtensionCsv - // NEW ------------------------------ - val fileNameCsv = prefixCsv + fileExtensionCsv - saveCsv(fileNameCsv) - - // OLD ------------------------------ -// val prefixTxt = "log_${DataHolder.deviceSerialNumber}_${patientName}_" -// val fileExtensionTxt = ".txt" -// val fileNameTxt = prefixTxt + id + fileExtensionTxt // NEW ------------------------------ - val prefixTxt = "log_${viewModel.testDetails?.testID}" - val fileExtensionTxt = ".txt" - val fileNameTxt = prefixTxt + fileExtensionTxt + viewModel.saveCsv(requireContext().applicationContext, viewModel.getCSVFileName()) + viewModel.saveCsvForTesting(requireContext().applicationContext, viewModel.getDetailedCSVFileName()) - saveLog(fileNameTxt) - } - - private fun saveCsv(fileName: String) { - Log.d(TAG, "saveCsv() called") - - viewModel.saveCsv(requireContext().applicationContext, fileName) - viewModel.saveCsvForTesting(requireContext().applicationContext, "detailed_$fileName") - } - - private fun saveLog(fileName: String) { - Log.d(TAG, "saveLog() called") - viewModel.saveLogWithPatient(requireContext().applicationContext, fileName) + viewModel.saveLogWithPatient(requireContext().applicationContext, viewModel.getLogFileName()) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt index 944ec55..177da55 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightResults.kt @@ -17,6 +17,7 @@ import com.example.hpos.data.model.test.TestRightResultType import com.example.hpos.data.model.test.TestType import com.example.hpos.databinding.FragmentTestRightResultsBinding import com.example.hpos.presentation.dashboard.DashboardActivity +import com.example.hpos.util.MyUtils import java.text.SimpleDateFormat import java.util.Date @@ -42,6 +43,15 @@ class TestRightResults : Fragment() { updateResults() viewModel.addResultTestToDb() + + // This is to add files to the pending queue + viewModel.addFilesToQueue(requireContext()) + + // Uploading to cloud storage and deleting the from the pending queue when uploaded +// if (MyUtils.isInternetConnected()) { +// viewModel.addFilesToCloud(requireContext()) +// } + } private fun setupListeners() { diff --git a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt index c721bdf..fd33939 100644 --- a/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt +++ b/app/src/main/java/com/example/hpos/presentation/testRight/TestRightViewModel.kt @@ -6,26 +6,36 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.hpos.data.DataHolder -import com.example.hpos.data.DatabaseRepository +import com.example.hpos.data.repository.DatabaseRepository +import com.example.hpos.data.model.Response import com.example.hpos.data.constant.Constants import com.example.hpos.data.model.CalculationVariableForTest import com.example.hpos.data.model.ErrorMessage +import com.example.hpos.data.model.PendingUploads import com.example.hpos.data.model.test.Status import com.example.hpos.data.model.test.TestRightCalculationData import com.example.hpos.data.model.test.TestRightDeviceConstants +import com.example.hpos.data.model.test.TestType import com.example.hpos.domain.ResultCalculationWithMaxImpl import com.example.hpos.domain.SaveRawData import com.example.hpos.domain.SaveRawDataTest import com.example.hpos.domain.SickleFindResultCaluculationWithMaxImpl import com.example.hpos.domain.TestRightResultCalculation import com.example.hpos.util.MyUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import java.text.SimpleDateFormat +import java.util.Calendar import java.util.Date import kotlin.math.log10 import kotlin.math.pow -class TestRightViewModel(private val saveRawData: SaveRawData, private val saveRawDataTest: SaveRawDataTest, private val repository: DatabaseRepository) : ViewModel() { +class TestRightViewModel( + private val saveRawData: SaveRawData, + private val saveRawDataTest: SaveRawDataTest, + private val repository: DatabaseRepository +) : ViewModel() { private val TAG = "TestRightViewModel" @@ -271,21 +281,21 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR fun saveCsv(appContext: Context, filename: String) { // try { - var folderPath: String? = DataHolder.appFolderPath - if (DataHolder.isAppFolderCreated) { + var folderPath: String? = DataHolder.appFolderPath + if (DataHolder.isAppFolderCreated) { // SaveRawData().saveCsv(folderPath!!, filename, wavelengthToAbsorbance) - saveRawData.saveCsv(folderPath!!, filename, wavelengthToAbsorbance) - } else { - folderPath = MyUtils.createAppFolder(appContext) - if (folderPath != null) { - DataHolder.isAppFolderCreated = true - DataHolder.appFolderPath = folderPath + saveRawData.saveCsv(folderPath!!, filename, wavelengthToAbsorbance) + } else { + folderPath = MyUtils.createAppFolder(appContext) + if (folderPath != null) { + DataHolder.isAppFolderCreated = true + DataHolder.appFolderPath = folderPath // SaveRawData().saveCsv(folderPath, filename, wavelengthToAbsorbance) - saveRawData.saveCsv(folderPath, filename, wavelengthToAbsorbance) - } else { + saveRawData.saveCsv(folderPath, filename, wavelengthToAbsorbance) + } else { // errorTriggered.postValue("Unable to save CSV, Please try again") - } } + } // } catch (e: java.io.FileNotFoundException) { // errorTriggered.postValue( // ErrorMessage( @@ -298,22 +308,22 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR fun saveCsvForTesting(appContext: Context, filename: String) { // try { - var folderPath: String? = DataHolder.appFolderPath - if (DataHolder.isAppFolderCreated) { + var folderPath: String? = DataHolder.appFolderPath + if (DataHolder.isAppFolderCreated) { // SaveRawDataTest().saveCsv(folderPath!!, filename, calculationVariableList) - saveRawDataTest.saveCsv(folderPath!!, filename, calculationVariableList) - } else { - folderPath = MyUtils.createAppFolder(appContext) - if (folderPath != null) { - DataHolder.isAppFolderCreated = true - DataHolder.appFolderPath = folderPath + saveRawDataTest.saveCsv(folderPath!!, filename, calculationVariableList) + } else { + folderPath = MyUtils.createAppFolder(appContext) + if (folderPath != null) { + DataHolder.isAppFolderCreated = true + DataHolder.appFolderPath = folderPath // SaveRawDataTest().saveCsv(folderPath, filename, calculationVariableList) - saveRawDataTest.saveCsv(folderPath, filename, calculationVariableList) - } else { + saveRawDataTest.saveCsv(folderPath, filename, calculationVariableList) + } else { // errorTriggered.postValue("Unable to save CSV, Please try again") - } - } + + } // } catch (e: java.io.FileNotFoundException) { // errorTriggered.postValue( // ErrorMessage( @@ -326,22 +336,22 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR fun saveLog(appContext: Context, fileName: String) { // try { - var folderPath: String? = DataHolder.appFolderPath + var folderPath: String? = DataHolder.appFolderPath - if (DataHolder.isAppFolderCreated) { + if (DataHolder.isAppFolderCreated) { // SaveRawData().saveLog(folderPath!!, fileName, calculationData) - saveRawData.saveLog(folderPath!!, fileName, calculationData) - } else { - folderPath = MyUtils.createAppFolder(appContext) - if (folderPath != null) { - DataHolder.isAppFolderCreated = true - DataHolder.appFolderPath = folderPath + saveRawData.saveLog(folderPath!!, fileName, calculationData) + } else { + folderPath = MyUtils.createAppFolder(appContext) + if (folderPath != null) { + DataHolder.isAppFolderCreated = true + DataHolder.appFolderPath = folderPath // SaveRawData().saveLog(folderPath, fileName, calculationData) - saveRawData.saveLog(folderPath, fileName, calculationData) - } else { + saveRawData.saveLog(folderPath, fileName, calculationData) + } else { // errorTriggered.postValue("Unable to save Log, Please try again") - } } + } // } catch (e: java.io.FileNotFoundException) { // errorTriggered.postValue( // ErrorMessage( @@ -354,32 +364,32 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR fun saveLogWithPatient(appContext: Context, fileName: String) { // try { - var folderPath: String? = DataHolder.appFolderPath + var folderPath: String? = DataHolder.appFolderPath - if (DataHolder.isAppFolderCreated) { + if (DataHolder.isAppFolderCreated) { // SaveRawData().saveLogWithPatientData( + saveRawData.saveLogWithPatientData( + folderPath!!, + fileName, + calculationData, + testDetails + ) + } else { + folderPath = MyUtils.createAppFolder(appContext) + if (folderPath != null) { + DataHolder.isAppFolderCreated = true + DataHolder.appFolderPath = folderPath +// SaveRawData().saveLogWithPatientData( saveRawData.saveLogWithPatientData( - folderPath!!, + folderPath, fileName, calculationData, testDetails ) } else { - folderPath = MyUtils.createAppFolder(appContext) - if (folderPath != null) { - DataHolder.isAppFolderCreated = true - DataHolder.appFolderPath = folderPath -// SaveRawData().saveLogWithPatientData( - saveRawData.saveLogWithPatientData( - folderPath, - fileName, - calculationData, - testDetails - ) - } else { // errorTriggered.postValue("Unable to save Log, Please try again") - } } + } // } catch (e: java.io.FileNotFoundException) { // errorTriggered.postValue( // ErrorMessage( @@ -416,16 +426,131 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR } } - // Scanner Fragment Related Members + fun getCSVFileName(): String { + val prefixCsv: String = if (DataHolder.selectedTestType == TestType.SICKLECERT) + "HPOSSC_${testDetails?.testID}" + else + "HPOSSF_${testDetails?.testID}" -// fun processEncodedScannedData(contents: String) { -// -// } + val fileExtensionCsv = ".csv" + + return prefixCsv + fileExtensionCsv + } + + fun getDetailedCSVFileName(): String { + return "detailed_" + getCSVFileName() + } + + fun getLogFileName(): String { + val prefixTxt = "log_${testDetails?.testID}" + val fileExtensionTxt = ".txt" + return prefixTxt + fileExtensionTxt + } fun addResultTestToDb() { viewModelScope.launch { - repository.addTestToDatabase(testDetails!!) + testDetails!!.uploadTime = Calendar.getInstance().time + repository.addTestToDatabase(testDetails) } } + fun addFilesToQueue(context: Context) { + viewModelScope.launch { + val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName() + val pendingId = getCSVFileName().split(".")[0] + repository.addToPendingQueue( + PendingUploads( + pendingId, + DataHolder.mobileUniqueId!!, + testDetails!!.patientID, + csvFilePath, + Calendar.getInstance().time + ) + ) + } + viewModelScope.launch { + val detailedCsvFilePath = MyUtils.getAppFolderPath(context) + getDetailedCSVFileName() + val pendingId = getDetailedCSVFileName().split(".")[0] + repository.addToPendingQueue( + PendingUploads( + pendingId, + DataHolder.mobileUniqueId!!, + testDetails!!.patientID, + detailedCsvFilePath, + Calendar.getInstance().time + ) + ) + } + viewModelScope.launch { + val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName() + val pendingId = getLogFileName().split(".")[0] + repository.addToPendingQueue( + PendingUploads( + pendingId, + DataHolder.mobileUniqueId!!, + testDetails!!.patientID, + logTxtFilePath, + Calendar.getInstance().time + ) + ) + } + } + + fun addFilesToCloud(context: Context) { + GlobalScope.launch(Dispatchers.IO) { + val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName() + val fileName = getCSVFileName().split(".")[0] + val response = repository.uploadFileToStorage(testDetails!!.patientID, csvFilePath) + + when (response) { + is Response.Success -> { + Log.d(TAG, "Uploaded $csvFilePath") + repository.removeFromPendingQueue(fileName) + } + + is Response.Error -> { + Log.d(TAG, response.exception.toString()) + } + } + } + + GlobalScope.launch(Dispatchers.IO) { + val detailedCsvFilePath = + MyUtils.getAppFolderPath(context) + getDetailedCSVFileName() + val fileName = getDetailedCSVFileName().split(".")[0] + val response = + repository.uploadFileToStorage(testDetails!!.patientID, detailedCsvFilePath) + + when (response) { + is Response.Success -> { + Log.d(TAG, "Uploaded $detailedCsvFilePath") + repository.removeFromPendingQueue(fileName) + } + + is Response.Error -> { + Log.d(TAG, response.exception.toString()) + } + } + } + + GlobalScope.launch(Dispatchers.IO) { + val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName() + val fileName = getLogFileName().split(".")[0] + val response = + repository.uploadFileToStorage(testDetails!!.patientID, logTxtFilePath) + + when (response) { + is Response.Success -> { + Log.d(TAG, "Uploaded $logTxtFilePath") + repository.removeFromPendingQueue(fileName) + } + + is Response.Error -> { + Log.d(TAG, response.exception.toString()) + } + } + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpos/util/MyUtils.kt b/app/src/main/java/com/example/hpos/util/MyUtils.kt index 432f8a7..024aaa1 100644 --- a/app/src/main/java/com/example/hpos/util/MyUtils.kt +++ b/app/src/main/java/com/example/hpos/util/MyUtils.kt @@ -5,6 +5,7 @@ import android.os.Environment import com.example.hpos.R import com.example.hpos.data.model.patient.PatientDetails import java.io.File +import java.io.IOException import java.net.InetAddress import java.text.SimpleDateFormat import java.util.Date @@ -14,7 +15,7 @@ import java.util.Locale object MyUtils { fun createAppFolder(context: Context) : String? { - val folderPath = Environment.getExternalStorageDirectory().absolutePath + "/" + context.resources.getString(R.string.app_name) + "/" + val folderPath = getAppFolderPath(context) val file = File(folderPath) return if (!file.exists()) { @@ -28,13 +29,22 @@ object MyUtils { } } + fun getAppFolderPath(context: Context) : String { + return Environment.getExternalStorageDirectory().absolutePath + "/" + context.resources.getString(R.string.app_name) + "/" + } + fun isInternetConnected(): Boolean { - return try { - val ipAddr: InetAddress = InetAddress.getByName("google.com") - ipAddr.equals("hpos") - } catch (e: Exception) { - false + val runtime = Runtime.getRuntime() + try { + val ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8") + val exitValue = ipProcess.waitFor() + return exitValue == 0 + } catch (e: IOException) { + e.printStackTrace() + } catch (e: InterruptedException) { + e.printStackTrace() } + return false } fun generateTestIdForPatient(patientId: String): String { diff --git a/app/src/main/java/com/example/hpos/util/MyViewModelFactory.kt b/app/src/main/java/com/example/hpos/util/MyViewModelFactory.kt index 63b7e49..5cdcc36 100644 --- a/app/src/main/java/com/example/hpos/util/MyViewModelFactory.kt +++ b/app/src/main/java/com/example/hpos/util/MyViewModelFactory.kt @@ -2,8 +2,8 @@ package com.example.hpos.util import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.example.hpos.data.DatabaseRepository -import com.example.hpos.data.LocalFileRepository +import com.example.hpos.data.repository.DatabaseRepository +import com.example.hpos.data.repository.LocalFileRepository import com.example.hpos.data.datasource.LocalFileDataSource import com.example.hpos.domain.SaveRawData import com.example.hpos.domain.SaveRawDataTest