Uploading files to storage and adding to pending queue.

This commit is contained in:
vsuryakumar
2023-06-04 00:50:01 +05:30
parent eb89cf5842
commit 7d744819f8
19 changed files with 300 additions and 137 deletions

View File

@@ -11,6 +11,8 @@ object DataHolder {
val usbConnected = MutableLiveData(true)
var mobileUniqueId: String? = null
var isStoragePermissionGranted = false
var isAppFolderCreated = false
var appFolderPath = ""

View File

@@ -0,0 +1,4 @@
package com.example.hpos.data
class FileUploader {
}

View File

@@ -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?
)

View File

@@ -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
)

View File

@@ -1,4 +1,4 @@
package com.example.hpos.data
package com.example.hpos.data.model
sealed class Response<out R> {
data class Success<out T>(val data: T) : Response<T>()

View File

@@ -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<String> {
return try {
@@ -79,9 +83,46 @@ class DatabaseRepository : Repository {
}
}
suspend fun uploadFileToStorage(id: String, filePath: String): Response<Boolean> {
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<Boolean> {
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<Boolean> {
return try {
db.collection("pendingUploads")
.document(pendingId)
.delete()
.await()
Response.Success(true)
} catch (e: Exception) {
e.printStackTrace()
Response.Error(e)
}
}
}

View File

@@ -1,4 +1,4 @@
package com.example.hpos.data
package com.example.hpos.data.repository
import com.example.hpos.data.datasource.LocalFileDataSource

View File

@@ -1,4 +1,4 @@
package com.example.hpos.data
package com.example.hpos.data.repository
interface Repository {
// suspend fun addToDatabase(data: PatientDetails)

View File

@@ -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

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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()

View File

@@ -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(),

View File

@@ -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()

View File

@@ -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())
}
}

View File

@@ -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() {

View File

@@ -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())
}
}
}
}
}

View File

@@ -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 {

View File

@@ -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