Integrated testing with patient registration. [Test Mode - USBSerial]

This commit is contained in:
vsuryakumar
2023-06-03 19:10:48 +05:30
parent 0e5046d521
commit a1f41db68b
48 changed files with 1323 additions and 666 deletions

View File

@@ -13,8 +13,8 @@ android {
applicationId "com.example.hpos" applicationId "com.example.hpos"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 1 versionCode 2
versionName "1.0" versionName "2.0.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -55,7 +55,14 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.2' implementation 'androidx.navigation:navigation-ui-ktx:2.5.2'
// Firebase
implementation 'com.google.firebase:firebase-firestore-ktx:24.4.1'
implementation 'com.google.firebase:firebase-storage-ktx:20.1.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'
// implementation 'androidx.core:core-ktx:+' // implementation 'androidx.core:core-ktx:+'
// Testing
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

View File

@@ -8,10 +8,10 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -25,6 +25,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.HPOS" android:theme="@style/Theme.HPOS"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".presentation.KitScanActivity"
android:exported="false" />
<activity <activity
android:name=".presentation.dashboard.DashboardActivity" android:name=".presentation.dashboard.DashboardActivity"
android:exported="false" android:exported="false"
@@ -50,9 +53,9 @@
</activity> </activity>
<activity <activity
android:name=".presentation.testRight.TestRightActivity" android:name=".presentation.testRight.TestRightActivity"
android:screenOrientation="portrait"
android:exported="false" android:exported="false"
android:parentActivityName=".presentation.MainActivity" android:parentActivityName=".presentation.MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan"> android:windowSoftInputMode="adjustPan">
<!-- <intent-filter> --> <!-- <intent-filter> -->
@@ -66,8 +69,8 @@
</activity> <!-- android:theme="@style/Theme.HPOS.ActionBar" --> </activity> <!-- android:theme="@style/Theme.HPOS.ActionBar" -->
<activity <activity
android:name=".presentation.MainActivity" android:name=".presentation.MainActivity"
android:screenOrientation="portrait" android:exported="true"
android:exported="true"> android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter> </intent-filter>
@@ -76,12 +79,11 @@
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" /> android:resource="@xml/device_filter" />
</activity> </activity>
<activity <activity
android:name="com.journeyapps.barcodescanner.CaptureActivity" android:name="com.journeyapps.barcodescanner.CaptureActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:replace="android:screenOrientation" android:stateNotNeeded="true"
android:stateNotNeeded="true"/> tools:replace="android:screenOrientation" />
<meta-data <meta-data
android:name="preloaded_fonts" android:name="preloaded_fonts"

View File

@@ -8,4 +8,7 @@ class MyApplication : Application() {
// fun getSampleDetails() : PatientDetails = sampleDetails // fun getSampleDetails() : PatientDetails = sampleDetails
// fun setSampleDetails(sample: SampleDetails) {sampleDetails = sample} // fun setSampleDetails(sample: SampleDetails) {sampleDetails = sample}
}
}
// 1. firestore Database cache limit - full

View File

@@ -1,6 +1,7 @@
package com.example.hpos.data package com.example.hpos.data
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.example.hpos.data.model.test.TestDetails
import com.example.hpos.data.model.test.TestRightDeviceConstants import com.example.hpos.data.model.test.TestRightDeviceConstants
import com.example.hpos.data.model.test.TestType import com.example.hpos.data.model.test.TestType
@@ -24,4 +25,8 @@ object DataHolder {
/* (For reference/baseline) Contains pixel no. -> Intensity of light falling on that pixel */ /* (For reference/baseline) Contains pixel no. -> Intensity of light falling on that pixel */
val intensityReferenceArray = ArrayList<Double>() val intensityReferenceArray = ArrayList<Double>()
var selectedTest: TestDetails? = null
var testExp: Boolean = true
} }

View File

@@ -0,0 +1,87 @@
package com.example.hpos.data
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 kotlinx.coroutines.tasks.await
class DatabaseRepository : Repository {
private val db: FirebaseFirestore = Firebase.firestore
private val storage = FirebaseStorage.getInstance().reference
suspend fun addPatientToDatabase(data: PatientDetails) : Response<String> {
return try {
db.collection("patientData")
.document(data.id)
.set(data)
.await()
Response.Success(data.id)
} catch (e: Exception) {
Response.Error(e)
}
}
suspend fun getAllPatientsFromDatabase(): Response<List<PatientDetails>> {
return try {
val querySnapshot = db.collection("patientData").get().await()
val patientList = mutableListOf<PatientDetails>()
for (doc in querySnapshot.documents){
val patient = doc.toObject(PatientDetails::class.java)
patient?.let {
patientList.add(it)
}
}
Response.Success(patientList)
} catch (e: Exception) {
Response.Error(e)
}
}
suspend fun addTestToDatabase(data: TestDetails) : Response<String> {
return try {
db.collection("testData")
.document(data.testID)
.set(data)
.await()
Response.Success(data.testID)
} catch (e: Exception) {
Response.Error(e)
}
}
suspend fun getAllTestsFromDatabase(): List<TestDetails> {
val testList = mutableListOf<TestDetails>()
return try {
val querySnapshot = db.collection("testData").orderBy("registeredTime", Query.Direction.DESCENDING).get().await()
for (doc in querySnapshot.documents){
val patient = doc.toObject(TestDetails::class.java)
patient?.let {
testList.add(it)
}
}
// Response.Success(testList)
testList
} catch (e: Exception) {
e.printStackTrace()
testList
// Response.Error(e)
}
}
// suspend fun updateTestData(id: String, newTest: TestDetails, isUpdate): Boolean {
//
// }
}

View File

@@ -1,7 +1,5 @@
package com.example.hpos.data package com.example.hpos.data
import com.example.hpos.data.model.test.TestInfo
interface Repository { interface Repository {
suspend fun saveToDatabase(info: TestInfo) // suspend fun addToDatabase(data: PatientDetails)
} }

View File

@@ -1,12 +0,0 @@
package com.example.hpos.data
import com.example.hpos.data.model.test.TestInfo
class RepositoryImpl : Repository {
override suspend fun saveToDatabase(info: TestInfo) {
}
}

View File

@@ -0,0 +1,7 @@
package com.example.hpos.data
sealed class Response<out R> {
data class Success<out T>(val data: T) : Response<T>()
data class Error(val exception: Exception) : Response<Nothing>()
// object Loading : Response<Nothing>()
}

View File

@@ -11,7 +11,7 @@ object Constants {
const val TEST_RIGHT_TOTAL_PIXEL = 3694 const val TEST_RIGHT_TOTAL_PIXEL = 3694
const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE = 9999 const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE = 40
const val RANGE_IN_RESULT_CALCULATIONS = 10 const val RANGE_IN_RESULT_CALCULATIONS = 10

View File

@@ -0,0 +1,8 @@
package com.example.hpos.data.model
data class Location(
var latitude: Double?,
var longitude: Double?
) {
constructor() : this(null, null)
}

View File

@@ -18,7 +18,7 @@ data class PatientDetails(
var address: Address?, var address: Address?,
var category: Category?, var category: Category?,
var registerDate: Date?, var registerDate: Date?,
val uploadDate: Date? var uploadDate: Date?
) { ) {
constructor() : this( constructor() : this(
"", "",

View File

@@ -0,0 +1,55 @@
package com.example.hpos.data.model.test
import com.example.hpos.data.model.Location
import java.util.Date
data class TestDetails(
val testID: String,
var testStatus: Status,
val patientID: String,
val patientName: String,
val patientAge: Int?,
var resultRatio: Double?,
var result: TestRightResultType?,
val reportPath: String?,
val csvPath: String?,
val logPath: String?,
// Meta Data
var deviceId: String?,
val mobileId: String,
var kitSerial: String?,
val location: Location?,
val appVersion: String,
val registeredTime: Date?,
var uploadTime: Date?
) {
constructor() : this(
"",
Status.PENDING,
"",
"",
null,
null,
null,
null,
null,
null,
null,
"",
null,
null,
"",
null,
null
)
}
enum class Status {
COMPLETED,
PENDING,
INPROGRESS
}

View File

@@ -3,7 +3,7 @@ package com.example.hpos.domain
import android.util.Log import android.util.Log
import com.example.hpos.data.LocalFileRepository import com.example.hpos.data.LocalFileRepository
import com.example.hpos.data.constant.Constants import com.example.hpos.data.constant.Constants
import com.example.hpos.data.model.PatientData import com.example.hpos.data.model.test.TestDetails
import com.example.hpos.data.model.test.TestRightCalculationData import com.example.hpos.data.model.test.TestRightCalculationData
import java.util.Collections.sort import java.util.Collections.sort
@@ -98,7 +98,7 @@ class SaveRawData(private val localFileRepository: LocalFileRepository) {
folderPath: String, folderPath: String,
fileName: String, fileName: String,
calculationData: TestRightCalculationData, calculationData: TestRightCalculationData,
patientData: PatientData testDetails: TestDetails?
) { ) {
// val fileObj = File(folderPath, fileName) // val fileObj = File(folderPath, fileName)
// val writer = FileWriter(fileObj) // val writer = FileWriter(fileObj)
@@ -110,18 +110,18 @@ class SaveRawData(private val localFileRepository: LocalFileRepository) {
val fullPath = folderPath + fileName val fullPath = folderPath + fileName
localFileRepository.saveTextToDisk( localFileRepository.saveTextToDisk(
fullPath, fullPath,
getLogStringFromObjWithPatientData(calculationData, patientData) getLogStringFromObjWithPatientData(calculationData, testDetails)
) )
} }
private fun getLogStringFromObjWithPatientData( private fun getLogStringFromObjWithPatientData(
calculationData: TestRightCalculationData, calculationData: TestRightCalculationData,
patientData: PatientData testDetails: TestDetails?
): String { ): String {
var outputString = "Test calculation logs ==>\n" var outputString = "Test calculation logs ==>\n"
outputString += "Name = ${patientData.name}\n" outputString += "Name = ${testDetails?.patientName}\n"
outputString += "Age = ${patientData.age}\n" outputString += "ID = ${testDetails?.patientID}\n"
outputString += "Gender = ${patientData.gender}\n" // outputString += "Gender = ${patientData.gender}\n"
outputString += "Absorbance one = ${ outputString += "Absorbance one = ${
String.format( String.format(
"%.3f", "%.3f",

View File

@@ -0,0 +1,100 @@
package com.example.hpos.presentation
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.hpos.data.DataHolder
import com.example.hpos.data.constant.Constants
import com.example.hpos.databinding.ActivityKitScanBinding
import com.example.hpos.presentation.dashboard.DashboardActivity
import com.example.hpos.presentation.testRight.TestRightActivity
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanIntentResult
import com.journeyapps.barcodescanner.ScanOptions
class KitScanActivity : AppCompatActivity() {
private val TAG = "KitScanActivity"
private lateinit var binding: ActivityKitScanBinding
private val barcodeLauncher = registerForActivityResult(
ScanContract()
) { result: ScanIntentResult ->
if (result.contents.isNullOrEmpty()) {
Toast.makeText(this, "Cancelled: Unable to scan, Try Again!!", Toast.LENGTH_LONG).show()
} else {
Log.d(TAG, result.contents)
processScannedData(result.contents)
}
}
private fun processScannedData(contents: String) {
binding.nameEditText.setText(contents)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityKitScanBinding.inflate(layoutInflater)
setContentView(binding.root)
if (DataHolder.sampleReadCounter <= Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE && DataHolder.isReferenceTaken){
moveToNext()
}
setSupportActionBar(binding.toolbar)
binding.btnScanNow.setOnClickListener {
startScanningNow()
}
binding.btnGo.setOnClickListener {
if (binding.nameEditText.text.toString().trim().isNotEmpty() && checkDataNotNull()) {
DataHolder.selectedTest!!.kitSerial = binding.nameEditText.text.toString()
moveToNext()
} else {
Toast.makeText(this, "Invalid KIT Number", Toast.LENGTH_LONG).show()
}
}
}
private fun moveToNext() {
val i = Intent(applicationContext, TestRightActivity::class.java)
startActivity(i)
}
private fun startScanningNow() {
val options = ScanOptions()
options.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
options.setPrompt("Scan a barcode")
options.setCameraId(0) // Use a specific camera of the device
options.setBeepEnabled(true)
options.setBarcodeImageEnabled(true)
options.setPrompt("Start Scanning")
options.setOrientationLocked(false)
// options.setTimeout(10000) // in ms
barcodeLauncher.launch(options)
}
private fun checkDataNotNull(): Boolean {
return if (DataHolder.selectedTest == null) {
Toast.makeText(
applicationContext,
"Please Select patient before starting test",
Toast.LENGTH_SHORT
).show()
val i = Intent(applicationContext, DashboardActivity::class.java)
startActivity(i)
false
} else {
true
}
}
}

View File

@@ -18,13 +18,11 @@ import com.example.hpos.data.DataHolder
import com.example.hpos.data.constant.Constants import com.example.hpos.data.constant.Constants
import com.example.hpos.data.model.test.TestType import com.example.hpos.data.model.test.TestType
import com.example.hpos.databinding.ActivityMainBinding import com.example.hpos.databinding.ActivityMainBinding
import com.example.hpos.presentation.testRight.TestRightActivity
import com.example.hpos.util.MyViewModelFactory import com.example.hpos.util.MyViewModelFactory
import com.hoho.android.usbserial.driver.UsbSerialProber import com.hoho.android.usbserial.driver.UsbSerialProber
class MainActivity : AppCompatActivity() class MainActivity : AppCompatActivity() {
{
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
@@ -52,7 +50,7 @@ class MainActivity : AppCompatActivity()
setContentView(binding.root) setContentView(binding.root)
viewModel = ViewModelProvider( viewModel = ViewModelProvider(
this, this,
MyViewModelFactory(applicationContext) MyViewModelFactory()
)[MainViewModel::class.java] )[MainViewModel::class.java]
setSupportActionBar(binding.myToolbar) setSupportActionBar(binding.myToolbar)
@@ -87,13 +85,18 @@ class MainActivity : AppCompatActivity()
binding.cvItem1.setOnClickListener { binding.cvItem1.setOnClickListener {
DataHolder.selectedTestType = TestType.SICKLECERT DataHolder.selectedTestType = TestType.SICKLECERT
val i = Intent(applicationContext, TestRightActivity::class.java)
// val i = Intent(applicationContext, TestRightActivity::class.java)
// startActivity(i)
val i = Intent(applicationContext, KitScanActivity::class.java)
startActivity(i) startActivity(i)
} }
binding.cvItem2.setOnClickListener { binding.cvItem2.setOnClickListener {
DataHolder.selectedTestType = TestType.SICKLEFIND DataHolder.selectedTestType = TestType.SICKLEFIND
val i = Intent(applicationContext, TestRightActivity::class.java) // val i = Intent(applicationContext, TestRightActivity::class.java)
// startActivity(i)
val i = Intent(applicationContext, KitScanActivity::class.java)
startActivity(i) startActivity(i)
} }
@@ -107,18 +110,18 @@ class MainActivity : AppCompatActivity()
} }
} }
// TODO Scan: Remove this line // binding.cvItem3.setOnClickListener {
binding.cvItem3.setOnClickListener { // val i = Intent(applicationContext, TestRightActivity::class.java)
val i = Intent(applicationContext, TestRightActivity::class.java) // startActivity(i)
startActivity(i) // }
}
} }
override fun onCreateOptionsMenu(menu: Menu?): Boolean { override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.my_menu, menu) menuInflater.inflate(R.menu.my_menu, menu)
myMenu = menu myMenu = menu
checkAndUpdateUsbConnection() // Todo: Uncomment this
// checkAndUpdateUsbConnection()
return true return true
} }

View File

@@ -3,37 +3,119 @@ package com.example.hpos.presentation
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.example.hpos.R import com.example.hpos.R
import com.example.hpos.data.model.PatientData import com.example.hpos.data.model.test.Status
import com.example.hpos.data.model.test.TestDetails
import com.example.hpos.presentation.dashboard.ItemClickListener
class RVAdapter : RecyclerView.Adapter<RVAdapter.ViewHolder>() { class RVAdapter : RecyclerView.Adapter<RVAdapter.ViewHolder>() {
private val dataset = ArrayList<PatientData>() // private lateinit var binding: TableItemBinding
private val dataset = ArrayList<TestDetails>()
var itemClickListener: ItemClickListener? = null
companion object {var selectedPosition = -1}
// private var lastChecked: CheckBox? = null
// private var lastCheckedPos = 0
// This keeps track of the currently selected position
// var selectedPosition by Delegates.observable(-1) { property, oldPos, newPos ->
// if (newPos in dataset.indices) {
// notifyItemChanged(oldPos)
// notifyItemChanged(newPos)
// }
// }
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val tvId: TextView
val tvName: TextView
val tvStatus: TextView
val radioButton: RadioButton
init {
tvId = view.findViewById(R.id.tv_id)
tvName = view.findViewById(R.id.tv_name)
tvStatus = view.findViewById(R.id.tv_status)
radioButton = view.findViewById(R.id.radioButton)
}
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder( val view = LayoutInflater.from(parent.context)
LayoutInflater.from(parent.context) .inflate(R.layout.table_item, parent, false)
.inflate(R.layout.table_item, parent, false)
) return ViewHolder(view)
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val idString = "ID: " + dataset[position].patientID
holder.tvId.text = idString
holder.tvName.text = dataset[position].patientName
holder.tvStatus.text = dataset[position].testStatus.toString()
if (dataset[position].testStatus == Status.PENDING) {
holder.radioButton.isChecked = (position
== selectedPosition)
} else {
holder.radioButton.isEnabled = false
}
holder.radioButton.setOnCheckedChangeListener { compoundButton, b ->
// check condition
if (b) {
// When checked update selected position
selectedPosition = holder.adapterPosition
itemClickListener!!.onClick(position)
}
}
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return dataset.size return dataset.size
} }
fun updateDataSet(newDataSet: ArrayList<PatientData>) { fun updateDataSet(newDataSet: ArrayList<TestDetails>) {
dataset.clear() dataset.clear()
dataset.addAll(newDataSet) dataset.addAll(newDataSet)
notifyDataSetChanged() notifyDataSetChanged()
} }
// inner class ViewHolder(itemView: TableItemBinding) : RecyclerView.ViewHolder(itemView.root) {
// fun bind(item : TestDetails){
// binding.apply {
// tvId.text = item.patientID
// tvName.text = item.patientName
// tvStatus.text = item.testStatus.toString()
// }
// }
// }
//
// override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
// val inflater =LayoutInflater.from(parent.context)
// binding = TableItemBinding.inflate(inflater,parent,false)
// return ViewHolder(binding)
// }
//
// override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// holder.bind(dataset[position])
// }
//
// override fun getItemCount(): Int {
// return dataset.size
// }
//
// fun updateDataSet(newDataSet: ArrayList<TestDetails>) {
// dataset.clear()
// dataset.addAll(newDataSet)
// notifyDataSetChanged()
// }
} }

View File

@@ -8,17 +8,18 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.example.hpos.data.DataHolder import com.example.hpos.data.DataHolder
import com.example.hpos.databinding.ActivitySplashBinding import com.example.hpos.databinding.ActivitySplashBinding
import com.example.hpos.presentation.dashboard.DashboardActivity import com.example.hpos.presentation.dashboard.DashboardActivity
import com.example.hpos.util.MyUtils import com.example.hpos.util.MyUtils
import com.google.firebase.firestore.FirebaseFirestoreSettings
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase
/** /**
@@ -31,6 +32,7 @@ class SplashActivity : AppCompatActivity() {
private lateinit var binding: ActivitySplashBinding private lateinit var binding: ActivitySplashBinding
var permissionStorage = false var permissionStorage = false
var permissionLocation = false var permissionLocation = false
var permissionLocation2 = false
var permissionCamera = false var permissionCamera = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,8 +40,11 @@ class SplashActivity : AppCompatActivity() {
binding = ActivitySplashBinding.inflate(layoutInflater) binding = ActivitySplashBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
setupFirestoreCache()
checkForStoragePermissions() checkForStoragePermissions()
checkForLocationPermission() checkForLocationPermission()
checkForLocationPermission2()
// Keep this in last permission check, as checking all given or not after this // Keep this in last permission check, as checking all given or not after this
checkForCameraPermission() checkForCameraPermission()
@@ -48,9 +53,16 @@ class SplashActivity : AppCompatActivity() {
} }
private fun setupFirestoreCache() {
val settings = FirebaseFirestoreSettings.Builder()
.setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
.build()
Firebase.firestore.firestoreSettings = settings
}
private fun checkAllPermissionsGiven() { private fun checkAllPermissionsGiven() {
// Log.d("surya_permission", "inside checkAllPermissionsGiven") // Log.d("surya_permission", "inside checkAllPermissionsGiven")
if (permissionStorage && permissionCamera && permissionLocation) if (permissionStorage && permissionCamera && permissionLocation && permissionLocation2)
moveToLandingPage() moveToLandingPage()
} }
@@ -176,6 +188,31 @@ class SplashActivity : AppCompatActivity() {
} }
} }
private fun checkForLocationPermission2() {
if (ContextCompat.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_DENIED
) {
val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
permissionLocation2 = true
checkAllPermissionsGiven()
} else {
Toast.makeText(
this,
"You must grant permission to Location to use the app",
Toast.LENGTH_SHORT
).show()
}
}
requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
} else {
permissionLocation2 = true
checkAllPermissionsGiven()
}
}
private fun moveToLandingPage() { private fun moveToLandingPage() {
createAppFolder() createAppFolder()
// val i = Intent(applicationContext, MainActivity::class.java) // val i = Intent(applicationContext, MainActivity::class.java)

View File

@@ -2,19 +2,18 @@ package com.example.hpos.presentation.dashboard
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import com.google.android.material.navigation.NavigationView import androidx.appcompat.app.AppCompatActivity
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import androidx.drawerlayout.widget.DrawerLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.example.hpos.R import com.example.hpos.R
import com.example.hpos.databinding.ActivityDashboardBinding import com.example.hpos.databinding.ActivityDashboardBinding
import com.example.hpos.presentation.testRight.TestRightViewModel
import com.example.hpos.util.MyViewModelFactory import com.example.hpos.util.MyViewModelFactory
import com.google.android.material.navigation.NavigationView
class DashboardActivity : AppCompatActivity() { class DashboardActivity : AppCompatActivity() {
@@ -48,7 +47,7 @@ class DashboardActivity : AppCompatActivity() {
viewModel = ViewModelProvider( viewModel = ViewModelProvider(
this, this,
MyViewModelFactory(this.applicationContext) MyViewModelFactory()
)[DashboardViewModel::class.java] )[DashboardViewModel::class.java]
} }

View File

@@ -1,14 +1,40 @@
package com.example.hpos.presentation.dashboard 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.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.model.AadharCard import com.example.hpos.data.model.AadharCard
import com.example.hpos.data.model.Location
import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.data.model.patient.PatientDetails
import com.example.hpos.data.model.test.Status
import com.example.hpos.data.model.test.TestDetails
import com.example.hpos.util.MyUtils
import com.example.hpos.util.MyUtils.fetchYOBFromDOB import com.example.hpos.util.MyUtils.fetchYOBFromDOB
import com.example.hpos.util.MyUtils.mapToGender import com.example.hpos.util.MyUtils.mapToGender
import kotlinx.coroutines.launch
import java.util.Calendar
class DashboardViewModel : ViewModel() { //class DashboardViewModel(val repository: DatabaseRepository) : ViewModel() {
class DashboardViewModel() : ViewModel() {
private val TAG = "DashboardViewModel"
lateinit var aadharCard: AadharCard lateinit var aadharCard: AadharCard
lateinit var patientDetails: PatientDetails lateinit var patientDetails: PatientDetails
lateinit var testDetails: TestDetails
var deviceLocation = Location(null, null)
val repository = DatabaseRepository()
val dataUploadStatus = MutableLiveData<Response<String>>()
// val allTestDetails = MutableLiveData<Response<List<TestDetails>>>()
val allTestDetails = MutableLiveData<List<TestDetails>>()
var temp = 1
fun initializePatientDetails(patient: PatientDetails) { fun initializePatientDetails(patient: PatientDetails) {
@@ -38,18 +64,63 @@ class DashboardViewModel : ViewModel() {
} }
} }
fun createTest(context: Context) {
val mTestId = MyUtils.generateTestIdForPatient(patientDetails.id)
val mMobileId = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
testDetails = TestDetails(
testID = mTestId,
testStatus = Status.PENDING,
patientID = patientDetails.id,
patientName = patientDetails.name!!,
patientAge = patientDetails.yob,
resultRatio = null,
result = null,
reportPath = null,
csvPath = null,
logPath = null,
deviceId = null,
mobileId = mMobileId,
kitSerial = null,
location = deviceLocation,
appVersion = BuildConfig.VERSION_CODE.toString(),
registeredTime = Calendar.getInstance().time,
uploadTime = Calendar.getInstance().time
)
pushTestDetailsToDb()
}
// ------- Cloud Actions ------------------------------------------ // ------- Cloud Actions ------------------------------------------
fun pushPatientDetailsToCloud() { fun pushPatientDetailsToDb() {
// Synchronous Call Require patientDetails.uploadDate = Calendar.getInstance().time
TODO("Not yet implemented")
viewModelScope.launch {
val response = repository.addPatientToDatabase(patientDetails)
dataUploadStatus.value = response
}
} }
fun createTest() { private fun pushTestDetailsToDb() {
TODO("Not yet implemented") testDetails.uploadTime = Calendar.getInstance().time
viewModelScope.launch {
val response = repository.addTestToDatabase(testDetails)
dataUploadStatus.value = response
}
} }
fun fetchAllTestData() {
viewModelScope.launch {
val response = repository.getAllTestsFromDatabase()
allTestDetails.postValue(response)
}
}
} }

View File

@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.hpos.databinding.FragmentGalleryBinding import com.example.hpos.databinding.FragmentGalleryBinding
@@ -29,10 +28,10 @@ class GalleryFragment : Fragment() {
_binding = FragmentGalleryBinding.inflate(inflater, container, false) _binding = FragmentGalleryBinding.inflate(inflater, container, false)
val root: View = binding.root val root: View = binding.root
val textView: TextView = binding.textGallery // val textView: TextView = binding.textGallery
galleryViewModel.text.observe(viewLifecycleOwner) { // galleryViewModel.text.observe(viewLifecycleOwner) {
textView.text = it //// textView.text = it
} // }
return root return root
} }

View File

@@ -1,42 +1,93 @@
package com.example.hpos.presentation.dashboard package com.example.hpos.presentation.dashboard
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
import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.hpos.R import com.example.hpos.R
import com.example.hpos.data.DataHolder
import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.data.model.patient.PatientDetails
import com.example.hpos.databinding.FragmentHomeBinding import com.example.hpos.databinding.FragmentHomeBinding
import com.example.hpos.presentation.dashboard.ui.home.HomeViewModel import com.example.hpos.presentation.RVAdapter
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
val TAG = "HomeFragment"
private var _binding: FragmentHomeBinding? = null private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val viewModel: DashboardViewModel by activityViewModels() private val viewModel: DashboardViewModel by activityViewModels()
// private val viewModel: DashboardViewModel by activityViewModels{ MyViewModelFactory() }
private lateinit var rvAdapter: RVAdapter
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false) try {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
// DataHolder.selectedTest = TestDetails()
return binding.root rvAdapter = RVAdapter()
val itemClickListener = object : ItemClickListener {
override fun onClick(pos: Int) {
// binding.recyclerView.post(Runnable { rvAdapter.notifyDataSetChanged() })
rvAdapter.notifyDataSetChanged()
DataHolder.selectedTest = viewModel.allTestDetails.value?.get(pos)
}
}
rvAdapter.itemClickListener = itemClickListener
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
binding.recyclerView.adapter = rvAdapter
// Toast.makeText(requireActivity(), viewModel.temp, Toast.LENGTH_SHORT).show()
// viewModel.temp++
// Log.d(TAG, "viewmodel temp = ${viewModel.temp}")
return binding.root
} catch (e: Exception){
e.printStackTrace()
Log.e(TAG, "onCreateView", e);
throw e
}
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupObservers()
viewModel.fetchAllTestData()
binding.btnAdd.setOnClickListener { binding.btnAdd.setOnClickListener {
viewModel.initializePatientDetails(PatientDetails()) viewModel.initializePatientDetails(PatientDetails())
findNavController().navigate(R.id.action_nav_home_to_registerOneScanAbhaFragment) findNavController().navigate(R.id.action_nav_home_to_registerOneScanAbhaFragment)
} }
binding.btnTest.setOnClickListener { binding.btnTest.setOnClickListener {
findNavController().navigate(R.id.action_nav_home_to_mainActivity) if (DataHolder.selectedTest != null)
findNavController().navigate(R.id.action_nav_home_to_mainActivity)
else
Toast.makeText(requireContext(), "Select One Record to start testing", Toast.LENGTH_SHORT).show()
}
}
private fun setupObservers() {
viewModel.allTestDetails.observe(viewLifecycleOwner) {
rvAdapter.updateDataSet(ArrayList(it))
// when(it) {
// is Response.Success -> {
// rvAdapter.updateDataSet(ArrayList(it.data))
// }
// is Response.Error -> {
//
// }
// }
} }
} }

View File

@@ -0,0 +1,5 @@
package com.example.hpos.presentation.dashboard
interface ItemClickListener {
fun onClick(pos: Int)
}

View File

@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.hpos.databinding.FragmentSlideshowBinding import com.example.hpos.databinding.FragmentSlideshowBinding
@@ -29,10 +28,10 @@ class SlideshowFragment : Fragment() {
_binding = FragmentSlideshowBinding.inflate(inflater, container, false) _binding = FragmentSlideshowBinding.inflate(inflater, container, false)
val root: View = binding.root val root: View = binding.root
val textView: TextView = binding.textSlideshow // val textView: TextView = binding.textSlideshow
slideshowViewModel.text.observe(viewLifecycleOwner) { // slideshowViewModel.text.observe(viewLifecycleOwner) {
textView.text = it // textView.text = it
} // }
return root return root
} }

View File

@@ -22,7 +22,6 @@ import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanIntentResult import com.journeyapps.barcodescanner.ScanIntentResult
import com.journeyapps.barcodescanner.ScanOptions import com.journeyapps.barcodescanner.ScanOptions
import org.json.JSONObject import org.json.JSONObject
import java.lang.Exception
class RegisterOneScanAbhaFragment : Fragment() { class RegisterOneScanAbhaFragment : Fragment() {
@@ -47,17 +46,18 @@ class RegisterOneScanAbhaFragment : Fragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = FragmentRegisterOneScanAbhaBinding.inflate(inflater, container, false) binding = FragmentRegisterOneScanAbhaBinding.inflate(inflater, container, false)
return binding.root return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// Toast.makeText(requireContext(), viewModel.temp, Toast.LENGTH_SHORT).show()
viewModel.temp++
Log.d(TAG, "viewmodel temp = ${viewModel.temp}")
binding.btnScanNow.setOnClickListener { binding.btnScanNow.setOnClickListener {
// Todo: Remove this, add later
// viewModel.patientDetails.name = "Surya"
// viewModel.patientDetails.gender = PatientDetails.Gender.MALE
// moveToRegisterThree()
startScanningNow() startScanningNow()
} }

View File

@@ -1,36 +1,62 @@
package com.example.hpos.presentation.dashboard.register package com.example.hpos.presentation.dashboard.register
import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment 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
import android.widget.Toast import android.widget.Toast
import androidx.core.app.ActivityCompat
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
import com.example.hpos.R import com.example.hpos.R
import com.example.hpos.data.model.PatientData import com.example.hpos.data.Response
import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.data.model.patient.PatientDetails
import com.example.hpos.databinding.FragmentRegisterOneScanAbhaBinding
import com.example.hpos.databinding.FragmentRegisterThreeEnterPatientDetailsBinding import com.example.hpos.databinding.FragmentRegisterThreeEnterPatientDetailsBinding
import com.example.hpos.presentation.dashboard.DashboardViewModel import com.example.hpos.presentation.dashboard.DashboardViewModel
import com.example.hpos.util.MyUtils
import com.example.hpos.util.MyUtils.mapToCategory import com.example.hpos.util.MyUtils.mapToCategory
import com.example.hpos.util.MyUtils.mapToGender import com.example.hpos.util.MyUtils.mapToGender
import com.example.hpos.util.MyUtils.mapYesNoStringToBool import com.example.hpos.util.MyUtils.mapYesNoStringToBool
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import java.util.Calendar import java.util.Calendar
class RegisterThreeEnterPatientDetails : Fragment() { class RegisterThreeEnterPatientDetails : Fragment() {
private val TAG = "RegisterThreeEnterPatientDetails" private val TAG = "RegisterThreeEnterPat"
private lateinit var binding: FragmentRegisterThreeEnterPatientDetailsBinding private lateinit var binding: FragmentRegisterThreeEnterPatientDetailsBinding
private val viewModel: DashboardViewModel by activityViewModels() private val viewModel: DashboardViewModel by activityViewModels()
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
binding = FragmentRegisterThreeEnterPatientDetailsBinding.inflate(inflater, container, false)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity())
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
locationResult.lastLocation?.let { location ->
viewModel.deviceLocation = com.example.hpos.data.model.Location(location.latitude, location.longitude)
}
}
}
getLocation()
binding =
FragmentRegisterThreeEnterPatientDetailsBinding.inflate(inflater, container, false)
return binding.root return binding.root
} }
@@ -38,12 +64,14 @@ class RegisterThreeEnterPatientDetails : Fragment() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
prefillTexts() prefillTexts()
setupObservers()
binding.btnSubmit.setOnClickListener { binding.btnSubmit.setOnClickListener {
val mPatient = validateAndReturnPatientData() val mPatient = validateAndReturnPatientData()
if(mPatient != null){ if (mPatient != null) {
viewModel.patientDetails = mPatient viewModel.patientDetails = mPatient
viewModel.pushPatientDetailsToCloud() viewModel.pushPatientDetailsToDb()
viewModel.createTest() viewModel.createTest(requireContext())
moveToNextPage() moveToNextPage()
} else { } else {
Toast.makeText(requireContext(), "Fields can't be empty", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Fields can't be empty", Toast.LENGTH_SHORT).show()
@@ -51,8 +79,36 @@ class RegisterThreeEnterPatientDetails : Fragment() {
} }
} }
private fun setupObservers() {
viewModel.dataUploadStatus.observe(viewLifecycleOwner) {
when (it) {
is Response.Success -> {
Log.d(TAG, "Patient details pushed to DB successfully")
// Directly pushing because of limitation of offline
// Toast.makeText(
// requireContext(),
// "Patient Details Added successfully",
// Toast.LENGTH_SHORT
// ).show()
//
// viewModel.createTest(requireContext())
}
is Response.Error -> {
it.exception.printStackTrace()
Toast.makeText(
requireContext(),
"Failed to add Patient Details, please try again.",
Toast.LENGTH_LONG
).show()
}
}
}
}
private fun moveToNextPage() { private fun moveToNextPage() {
findNavController().navigate(R.id.action_registerThreeEnterPatientDetails_to_mainActivity) findNavController().navigate(R.id.action_registerThreeEnterPatientDetails_to_nav_home)
} }
private fun prefillTexts() { private fun prefillTexts() {
@@ -67,11 +123,15 @@ class RegisterThreeEnterPatientDetails : Fragment() {
} }
private fun validateAndReturnPatientData(): PatientDetails? { private fun validateAndReturnPatientData(): PatientDetails? {
if (viewModel.patientDetails.id.isEmpty()){ if (viewModel.patientDetails.id.isEmpty()) {
Toast.makeText(requireContext(), "Unable to get \"ABHA ID\" or \"AADHAAR NO\", please try again", Toast.LENGTH_LONG).show() Toast.makeText(
requireContext(),
"Unable to get \"ABHA ID\" or \"AADHAAR NO\", please try again",
Toast.LENGTH_LONG
).show()
} }
if (viewModel.patientDetails.address == null){ if (viewModel.patientDetails.address == null) {
viewModel.patientDetails.address = PatientDetails.Address() viewModel.patientDetails.address = PatientDetails.Address()
} }
@@ -85,6 +145,9 @@ class RegisterThreeEnterPatientDetails : Fragment() {
if (binding.etYob.text.isNullOrEmpty()) { if (binding.etYob.text.isNullOrEmpty()) {
binding.etYob.error = getString(R.string.yob_error) binding.etYob.error = getString(R.string.yob_error)
return null return null
} else if (binding.etYob.text.toString().toInt() <= 1900 || binding.etYob.text.toString().toInt() > 2023) {
binding.etYob.error = getString(R.string.yob_error_2)
return null
} else { } else {
viewModel.patientDetails.yob = binding.etYob.text.toString().toInt() viewModel.patientDetails.yob = binding.etYob.text.toString().toInt()
} }
@@ -114,7 +177,8 @@ class RegisterThreeEnterPatientDetails : Fragment() {
binding.etIsMarried.error = getString(R.string.this_error) binding.etIsMarried.error = getString(R.string.this_error)
return null return null
} else { } else {
viewModel.patientDetails.isMarried = binding.etIsMarried.text.toString().mapYesNoStringToBool() viewModel.patientDetails.isMarried =
binding.etIsMarried.text.toString().mapYesNoStringToBool()
} }
if (binding.etCategory.text.isNullOrEmpty()) { if (binding.etCategory.text.isNullOrEmpty()) {
@@ -165,4 +229,81 @@ class RegisterThreeEnterPatientDetails : Fragment() {
viewModel.patientDetails.registerDate = Calendar.getInstance().time viewModel.patientDetails.registerDate = Calendar.getInstance().time
return viewModel.patientDetails return viewModel.patientDetails
} }
// private fun getLocation() {
// locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager
// if ((ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {
// ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), locationPermissionCode)
// }
// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5f, this)
// }
// private fun getLocation() {
// fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity())
// locationCallback = object : LocationCallback() {
// override fun onLocationResult(locationResult: LocationResult) {
// locationResult.lastLocation?.let { location ->
// val latitude = location.latitude
// val longitude = location.longitude
// }
// }
// }
// }
private fun requestLocationUpdates() {
val locationRequest = LocationRequest.create().apply {
interval = 10000 // Interval for receiving location updates (in milliseconds)
fastestInterval = 5000 // Fastest interval for location updates (in milliseconds)
priority = LocationRequest.PRIORITY_HIGH_ACCURACY // Location accuracy priority
}
if (ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
return
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
}
private fun getLocation() {
if (ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
// Handle location permission request if needed
Toast.makeText(requireContext(), "Please enable location services", Toast.LENGTH_SHORT).show()
return
}
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
location?.let {
viewModel.deviceLocation = com.example.hpos.data.model.Location(it.latitude, it.longitude)
} ?: run {
requestLocationUpdates()
}
}
.addOnFailureListener { exception: Exception ->
exception.printStackTrace()
}
}
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
override fun onResume() {
super.onResume()
getLocation()
}
override fun onPause() {
super.onPause()
stopLocationUpdates()
}
} }

View File

@@ -2,11 +2,11 @@ package com.example.hpos.presentation.dashboard.register
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
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
import com.example.hpos.R import com.example.hpos.R
@@ -100,7 +100,7 @@ class RegisterTwoAadhaarFragment : Fragment() {
} catch (e: QrCodeException) { } catch (e: QrCodeException) {
e.printStackTrace() e.printStackTrace()
Toast.makeText(requireContext(), "Unable to Fetch data, please try again!!", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), "Unable to Fetch data, please scan again or enter manually!!", Toast.LENGTH_LONG).show()
} }
} }

View File

@@ -1,14 +1,19 @@
package com.example.hpos.presentation.testRight package com.example.hpos.presentation.testRight
import android.app.PendingIntent import android.app.PendingIntent
import android.content.* import android.content.BroadcastReceiver
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.ServiceConnection
import android.hardware.usb.UsbDevice import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbDeviceConnection import android.hardware.usb.UsbDeviceConnection
import android.hardware.usb.UsbManager import android.hardware.usb.UsbManager
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import android.view.* import android.view.Menu
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@@ -20,7 +25,6 @@ import com.example.hpos.data.constant.Constants
import com.example.hpos.databinding.ActivityTestRightBinding import com.example.hpos.databinding.ActivityTestRightBinding
import com.example.hpos.util.MyViewModelFactory import com.example.hpos.util.MyViewModelFactory
import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialDriver
import com.hoho.android.usbserial.driver.UsbSerialProber
class TestRightActivity : AppCompatActivity() { class TestRightActivity : AppCompatActivity() {
@@ -58,7 +62,9 @@ class TestRightActivity : AppCompatActivity() {
val binder = service as UsbService.UsbServiceBinder val binder = service as UsbService.UsbServiceBinder
mService = binder.getService() mService = binder.getService()
viewModel.isServiceConnected = true viewModel.isServiceConnected = true
mConnection.let { mService.connect(mDriver, mConnection!!) }
// Todo: Uncomment this
// mConnection.let { mService.connect(mDriver, mConnection!!) }
moveToNext() moveToNext()
} }
@@ -73,19 +79,14 @@ class TestRightActivity : AppCompatActivity() {
setContentView(binding.root) setContentView(binding.root)
viewModel = ViewModelProvider( viewModel = ViewModelProvider(
this, this,
MyViewModelFactory(this.applicationContext) MyViewModelFactory()
)[TestRightViewModel::class.java] )[TestRightViewModel::class.java]
setSupportActionBar(binding.myToolbar) setSupportActionBar(binding.myToolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
// TODO Scan: Remove this line
// supportFragmentManager.beginTransaction()
// .replace(binding.flMain.id, TestRightExpScanner()).commit()
setupListener() setupListener()
// TODO Scan: uncomment this line
connectUsb(false) connectUsb(false)
} }
@@ -109,32 +110,40 @@ class TestRightActivity : AppCompatActivity() {
// .replace(binding.flMain.id, TestRightExpSample()).commit() // .replace(binding.flMain.id, TestRightExpSample()).commit()
// } // }
// Todo: Comment this
private fun connectUsb(permissionGranted: Boolean) { private fun connectUsb(permissionGranted: Boolean) {
Log.d(TAG, "connectUsb() called, permission variable = $permissionGranted") setupService()
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
if (availableDrivers.isEmpty()) {
onErrorReported("No Device is Connected")
} else {
mDriver = availableDrivers[0]
if (mDriver.device.productId != Constants.DEVICE_PRODUCT_ID || mDriver.device.vendorId != Constants.DEVICE_VENDOR_ID){
Toast.makeText(this, "Device Connected is not supported", Toast.LENGTH_SHORT).show()
onBackPressed()
return
}
DataHolder.deviceSerialNumber = mDriver.device.serialNumber.toString()
mConnection = manager.openDevice(mDriver.device)
if (mConnection == null) {
requestUserPermission(manager, mDriver.device)
} else {
setupService()
}
}
} }
// Todo: Uncomment this
// private fun connectUsb(permissionGranted: Boolean) {
// Log.d(TAG, "connectUsb() called, permission variable = $permissionGranted")
// val manager = getSystemService(Context.USB_SERVICE) as UsbManager
// val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
//
// if (availableDrivers.isEmpty()) {
// onErrorReported("No Device is Connected")
// } else {
// mDriver = availableDrivers[0]
//
// if (mDriver.device.productId != Constants.DEVICE_PRODUCT_ID || mDriver.device.vendorId != Constants.DEVICE_VENDOR_ID){
// Toast.makeText(this, "Device Connected is not supported", Toast.LENGTH_SHORT).show()
// onBackPressed()
// return
// }
//
// viewModel.testDetails?.deviceId = mDriver.device.serialNumber.toString()
// DataHolder.deviceSerialNumber = mDriver.device.serialNumber.toString()
// mConnection = manager.openDevice(mDriver.device)
//
// if (mConnection == null) {
// requestUserPermission(manager, mDriver.device)
// } else {
// setupService()
// }
// }
// }
/* /*
* Request user permission. The response will be received in the BroadcastReceiver * Request user permission. The response will be received in the BroadcastReceiver
*/ */

View File

@@ -8,7 +8,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.view.children
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.example.hpos.R import com.example.hpos.R
@@ -256,6 +255,8 @@ class TestRightExpReference : Fragment() {
Log.d(TAG, "sendCmdToFetchLightIntensities() called") Log.d(TAG, "sendCmdToFetchLightIntensities() called")
viewModel.progressBar.postValue(true) viewModel.progressBar.postValue(true)
val fullReadOutput = StringBuilder() val fullReadOutput = StringBuilder()
DataHolder.testExp = true
(activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printAll, (activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printAll,
object : UsbServiceListener { object : UsbServiceListener {
override fun onUsbRead(data: ByteArray?) { override fun onUsbRead(data: ByteArray?) {

View File

@@ -1,5 +1,6 @@
package com.example.hpos.presentation.testRight package com.example.hpos.presentation.testRight
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@@ -15,10 +16,9 @@ import com.example.hpos.data.PreferenceUtility
import com.example.hpos.data.constant.Constants import com.example.hpos.data.constant.Constants
import com.example.hpos.data.constant.TestRightCommands import com.example.hpos.data.constant.TestRightCommands
import com.example.hpos.data.model.ErrorMessage import com.example.hpos.data.model.ErrorMessage
import com.example.hpos.data.model.PatientData
import com.example.hpos.data.model.test.TestRightResultType
import com.example.hpos.data.model.test.TestType import com.example.hpos.data.model.test.TestType
import com.example.hpos.databinding.FragmentTestRightExpSampleBinding import com.example.hpos.databinding.FragmentTestRightExpSampleBinding
import com.example.hpos.presentation.MainActivity
import com.example.hpos.presentation.UsbServiceListener import com.example.hpos.presentation.UsbServiceListener
import com.example.hpos.presentation.utils.MyDialogListener import com.example.hpos.presentation.utils.MyDialogListener
import com.example.hpos.presentation.utils.UIUtils import com.example.hpos.presentation.utils.UIUtils
@@ -74,9 +74,9 @@ class TestRightExpSample : Fragment() {
} }
binding.btnSubmit.setOnClickListener { binding.btnSubmit.setOnClickListener {
val details = validateAndReturnPatientData() // val details = validateAndReturnTestData()
if (details != null) { // if (details != null) {
viewModel.patientDetails = details // viewModel.patientDetails = details
UIUtils.createAlertDialog( UIUtils.createAlertDialog(
requireContext(), requireContext(),
@@ -90,42 +90,26 @@ class TestRightExpSample : Fragment() {
startAcquiring() startAcquiring()
} }
}) })
} // }
}
binding.etNameBlock.setOnClickListener { binding.etName.isErrorEnabled = false }
binding.etAgeBlock.setOnClickListener { binding.etAge.isErrorEnabled = false }
binding.etGenderBlock.setOnClickListener { binding.ddGender.isErrorEnabled = false }
}
private fun validateAndReturnPatientData(): PatientData? {
val name = binding.etName.editText?.text?.trim()
if (name.isNullOrEmpty()) {
binding.etName.error = getString(R.string.name_error)
return null
} else {
val regex = Regex("[|\\\\?*<\":>+\\[\\]'/]")
if (regex.containsMatchIn(name)){
binding.etName.error = getString(R.string.name_error_2)
return null
}
} }
val age = binding.etAge.editText?.text?.trim() binding.tvSkip.setOnClickListener {
if (age.isNullOrEmpty()) { DataHolder.sampleReadCounter = 0
binding.etAge.error = getString(R.string.age_error) DataHolder.isReferenceTaken = false
return null val i = Intent(requireContext(), MainActivity::class.java)
} else if (age.toString().toInt() < 0 || age.toString().toInt() > 199) { startActivity(i)
binding.etAge.error = getString(R.string.age_error_out_of_bound)
return null
} }
val gender = binding.ddGender.editText?.text
if (gender.isNullOrEmpty()) { // binding.etNameBlock.setOnClickListener { binding.etName.isErrorEnabled = false }
binding.ddGender.error = getString(R.string.gender_error) // binding.etAgeBlock.setOnClickListener { binding.etAge.isErrorEnabled = false }
return null // binding.etGenderBlock.setOnClickListener { binding.ddGender.isErrorEnabled = false }
}
return PatientData(name.toString(), age.toString().toInt(), gender.toString(), TestRightResultType.UNDEFINED)
} }
// private fun validateAndReturnTestData(): TestDetails? {
//
// return PatientData(name.toString(), age.toString().toInt(), gender.toString(), TestRightResultType.UNDEFINED)
// }
/** /**
* Executing the commands sequentially each after successfully executing one. * Executing the commands sequentially each after successfully executing one.
* 1. command run * 1. command run
@@ -178,6 +162,8 @@ class TestRightExpSample : Fragment() {
Log.d(TAG, "sendCmdToFetchLightIntensities() called") Log.d(TAG, "sendCmdToFetchLightIntensities() called")
viewModel.progressBar.postValue(true) viewModel.progressBar.postValue(true)
val fullReadOutput = StringBuilder() val fullReadOutput = StringBuilder()
DataHolder.testExp = false
(activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printAll, (activity as TestRightActivity).mService.eventDrivenWrite(TestRightCommands.printAll,
object : UsbServiceListener { object : UsbServiceListener {
override fun onUsbRead(data: ByteArray?) { override fun onUsbRead(data: ByteArray?) {
@@ -256,26 +242,46 @@ class TestRightExpSample : Fragment() {
} }
private fun saveDataLocally() { private fun saveDataLocally() {
val patientName = viewModel.patientDetails.name val patientName = viewModel.testDetails?.patientName
// if (patientName.length > 5){ // if (patientName.length > 5){
// patientName = patientName.substring(0, 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) val prefixCsv: String = if (DataHolder.selectedTestType == TestType.SICKLECERT)
"HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_" "HPOSSC_${viewModel.testDetails?.testID}"
else else
"HPOSSF_${DataHolder.deviceSerialNumber}_${patientName}_" "HPOSSF_${viewModel.testDetails?.testID}"
// val prefixCsv = "HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_" // val prefixCsv = "HPOSSC_${DataHolder.deviceSerialNumber}_${patientName}_"
val fileExtensionCsv = ".csv" val fileExtensionCsv = ".csv"
val fileNameCsv = prefixCsv + id + fileExtensionCsv
// OLD ------------------------------
// val fileNameCsv = prefixCsv + id + fileExtensionCsv
// NEW ------------------------------
val fileNameCsv = prefixCsv + fileExtensionCsv
saveCsv(fileNameCsv) saveCsv(fileNameCsv)
val prefixTxt = "log_${DataHolder.deviceSerialNumber}_${patientName}_" // 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 fileExtensionTxt = ".txt"
val fileNameTxt = prefixTxt + id + fileExtensionTxt val fileNameTxt = prefixTxt + fileExtensionTxt
saveLog(fileNameTxt) saveLog(fileNameTxt)
} }

View File

@@ -1,98 +0,0 @@
package com.example.hpos.presentation.testRight
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import com.example.hpos.R
import com.example.hpos.databinding.FragmentTestRightExpSampleBinding
import com.example.hpos.databinding.FragmentTestRightExpScannerBinding
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanIntentResult
import com.journeyapps.barcodescanner.ScanOptions
class TestRightExpScanner : Fragment() {
private lateinit var binding: FragmentTestRightExpScannerBinding
private val viewModel: TestRightViewModel by activityViewModels()
val MY_CAMERA_REQUEST_CODE = 100
private val TAG = "TestRightExpScanner"
val requestCameraPermission = registerForActivityResult( ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted){
startCamera()
} else {
Toast.makeText(requireContext(), "Camera Permission is Required to Scan", Toast.LENGTH_SHORT).show();
}
}
private val barcodeLauncher = registerForActivityResult(ScanContract()) { result: ScanIntentResult ->
if (result.contents == null) {
Toast.makeText(requireContext(), "Unsuccessful, Please Scan Again!! ", Toast.LENGTH_SHORT).show()
} else {
viewModel.processEncodedScannedData(result.contents)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
binding = FragmentTestRightExpScannerBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setupListeners()
}
private fun setupListeners() {
binding.btnScanAadhaar.setOnClickListener {
scanAadhaarCard()
}
binding.btnScanAbha.setOnClickListener {
scanAbhaCard()
}
}
private fun scanAadhaarCard() {
// Toast.makeText(requireContext(), "Scan Aadhaar Clicked", Toast.LENGTH_SHORT).show();
requestCameraPermission.launch(Manifest.permission.CAMERA)
}
private fun scanAbhaCard() {
Toast.makeText(requireContext(), "Scan Abha Clicked", Toast.LENGTH_SHORT).show();
}
private fun startCamera() {
Toast.makeText(requireContext(), "SUCESS CAMERA START", Toast.LENGTH_SHORT).show();
val options = ScanOptions()
options.setDesiredBarcodeFormats(ScanOptions.QR_CODE)
options.setPrompt("Scan a barcode")
options.setCameraId(0) // Use a specific camera of the device
options.setBeepEnabled(true)
options.setBarcodeImageEnabled(true)
options.setPrompt("Start Scanning")
options.setOrientationLocked(false)
// options.setTimeout(1000) // in ms
barcodeLauncher.launch(options)
}
}

View File

@@ -16,9 +16,9 @@ import com.example.hpos.data.constant.Constants
import com.example.hpos.data.model.test.TestRightResultType import com.example.hpos.data.model.test.TestRightResultType
import com.example.hpos.data.model.test.TestType import com.example.hpos.data.model.test.TestType
import com.example.hpos.databinding.FragmentTestRightResultsBinding import com.example.hpos.databinding.FragmentTestRightResultsBinding
import com.example.hpos.presentation.MainActivity import com.example.hpos.presentation.dashboard.DashboardActivity
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
class TestRightResults : Fragment() { class TestRightResults : Fragment() {
@@ -40,32 +40,36 @@ class TestRightResults : Fragment() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupListeners() setupListeners()
updateResults() updateResults()
// saveCsv()
// saveLog() viewModel.addResultTestToDb()
} }
private fun setupListeners() { private fun setupListeners() {
binding.ivHome.setOnClickListener { binding.ivHome.setOnClickListener {
val i = Intent(requireContext().applicationContext, MainActivity::class.java) val i = Intent(requireContext().applicationContext, DashboardActivity::class.java)
startActivity(i) startActivity(i)
} }
binding.ivNext.setOnClickListener { binding.ivNext.setOnClickListener {
moveToSamplePage() val i = Intent(requireContext().applicationContext, DashboardActivity::class.java)
startActivity(i)
// moveToSamplePage()
} }
} }
private fun updateResults() { private fun updateResults() {
binding.tvName.text = getString(R.string.name_in_textview, viewModel.patientDetails.name) binding.tvName.text = getString(R.string.name_in_textview, viewModel.testDetails?.patientName)
binding.tvAge.text = binding.tvAge.text =
getString(R.string.age_in_textview, viewModel.patientDetails.age.toString()) getString(R.string.age_in_textview, viewModel.testDetails?.patientAge.toString())
binding.tvGender.text = // binding.tvGender.text =
getString(R.string.gender_in_textview, viewModel.patientDetails.gender) // getString(R.string.gender_in_textview, viewModel.patientDetails.gender)
binding.tvId.text = getString(R.string.patient_id_in_tv, viewModel.testDetails?.patientID)
//TODO: remove //TODO: remove
// viewModel.patientDetails.results = TestRightResultType.NEGATIVEBORDERLINE // viewModel.patientDetails.results = TestRightResultType.NEGATIVEBORDERLINE
if (DataHolder.selectedTestType == TestType.SICKLECERT){ if (DataHolder.selectedTestType == TestType.SICKLECERT){
when (viewModel.patientDetails.results) { when (viewModel.testDetails?.result) {
TestRightResultType.NORMAL -> { TestRightResultType.NORMAL -> {
binding.resultNormal.visibility = View.VISIBLE binding.resultNormal.visibility = View.VISIBLE
} }
@@ -90,7 +94,7 @@ class TestRightResults : Fragment() {
} }
} }
} else { } else {
when (viewModel.patientDetails.results) { when (viewModel.testDetails?.result) {
TestRightResultType.SICKLECELLDISEASE -> { TestRightResultType.SICKLECELLDISEASE -> {
binding.resultDisease.visibility = View.VISIBLE binding.resultDisease.visibility = View.VISIBLE
binding.resultDisease.text = "Positive" binding.resultDisease.text = "Positive"
@@ -105,10 +109,10 @@ class TestRightResults : Fragment() {
} }
} }
} }
if (viewModel.patientDetails.age < 5) { // if (viewModel.patientDetails.age < 5) {
binding.tvRecommended.visibility = View.VISIBLE // binding.tvRecommended.visibility = View.VISIBLE
binding.tvRecommended.text = getString(R.string.recommended_age) // binding.tvRecommended.text = getString(R.string.recommended_age)
} // }
} }

View File

@@ -4,20 +4,28 @@ import android.content.Context
import android.util.Log import android.util.Log
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.hpos.data.DataHolder import com.example.hpos.data.DataHolder
import com.example.hpos.data.DatabaseRepository
import com.example.hpos.data.constant.Constants import com.example.hpos.data.constant.Constants
import com.example.hpos.data.model.* import com.example.hpos.data.model.CalculationVariableForTest
import com.example.hpos.data.model.ErrorMessage
import com.example.hpos.data.model.test.Status
import com.example.hpos.data.model.test.TestRightCalculationData import com.example.hpos.data.model.test.TestRightCalculationData
import com.example.hpos.data.model.test.TestRightDeviceConstants import com.example.hpos.data.model.test.TestRightDeviceConstants
import com.example.hpos.domain.* 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 com.example.hpos.util.MyUtils
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.Date
import kotlin.collections.ArrayList
import kotlin.math.log10 import kotlin.math.log10
import kotlin.math.pow import kotlin.math.pow
class TestRightViewModel(private val saveRawData: SaveRawData, private val saveRawDataTest: SaveRawDataTest) : ViewModel() { class TestRightViewModel(private val saveRawData: SaveRawData, private val saveRawDataTest: SaveRawDataTest, private val repository: DatabaseRepository) : ViewModel() {
private val TAG = "TestRightViewModel" private val TAG = "TestRightViewModel"
@@ -28,7 +36,9 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
val errorTriggered = MutableLiveData<ErrorMessage>() val errorTriggered = MutableLiveData<ErrorMessage>()
var numberOfSampleRun = 0 var numberOfSampleRun = 0
lateinit var patientDetails: PatientData // lateinit var patientDetails: PatientData
val testDetails = DataHolder.selectedTest
// var deviceConstant: TestRightDeviceConstants? = null // var deviceConstant: TestRightDeviceConstants? = null
private lateinit var calculationData: TestRightCalculationData private lateinit var calculationData: TestRightCalculationData
@@ -241,7 +251,11 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
val resultCalculation: TestRightResultCalculation = ResultCalculationWithMaxImpl() val resultCalculation: TestRightResultCalculation = ResultCalculationWithMaxImpl()
calculationData = resultCalculation.getResults(wavelengthToAbsorbance) calculationData = resultCalculation.getResults(wavelengthToAbsorbance)
// patientDetails.results = resultCalculation.getResults(wavelengthToAbsorbance) // patientDetails.results = resultCalculation.getResults(wavelengthToAbsorbance)
patientDetails.results = calculationData.result // patientDetails.results = calculationData.result
testDetails?.result = calculationData.result
testDetails?.resultRatio = calculationData.ratioValue
testDetails?.testStatus = Status.COMPLETED
} }
@@ -250,7 +264,8 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
val resultCalculation: TestRightResultCalculation = val resultCalculation: TestRightResultCalculation =
SickleFindResultCaluculationWithMaxImpl() SickleFindResultCaluculationWithMaxImpl()
calculationData = resultCalculation.getResults(wavelengthToAbsorbance) calculationData = resultCalculation.getResults(wavelengthToAbsorbance)
patientDetails.results = calculationData.result testDetails?.result = calculationData.result
testDetails?.testStatus = Status.COMPLETED
} }
@@ -347,7 +362,7 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
folderPath!!, folderPath!!,
fileName, fileName,
calculationData, calculationData,
patientDetails testDetails
) )
} else { } else {
folderPath = MyUtils.createAppFolder(appContext) folderPath = MyUtils.createAppFolder(appContext)
@@ -359,7 +374,7 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
folderPath, folderPath,
fileName, fileName,
calculationData, calculationData,
patientDetails testDetails
) )
} else { } else {
// errorTriggered.postValue("Unable to save Log, Please try again") // errorTriggered.postValue("Unable to save Log, Please try again")
@@ -403,9 +418,14 @@ class TestRightViewModel(private val saveRawData: SaveRawData, private val saveR
// Scanner Fragment Related Members // Scanner Fragment Related Members
fun processEncodedScannedData(contents: String) { // fun processEncodedScannedData(contents: String) {
//
// }
fun addResultTestToDb() {
viewModelScope.launch {
repository.addTestToDatabase(testDetails!!)
}
} }
} }

View File

@@ -6,12 +6,11 @@ import android.hardware.usb.UsbDeviceConnection
import android.os.Binder import android.os.Binder
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import com.example.hpos.data.constant.Constants import com.example.hpos.data.DataHolder
import com.example.hpos.data.constant.TestRightCommands import com.example.hpos.data.constant.TestRightCommands
import com.example.hpos.presentation.UsbServiceListener import com.example.hpos.presentation.UsbServiceListener
import com.hoho.android.usbserial.driver.UsbSerialDriver import com.hoho.android.usbserial.driver.UsbSerialDriver
import com.hoho.android.usbserial.driver.UsbSerialPort import com.hoho.android.usbserial.driver.UsbSerialPort
import com.hoho.android.usbserial.util.SerialInputOutputManager
import java.io.IOException import java.io.IOException
@@ -33,37 +32,29 @@ class UsbService : Service() {
return binder return binder
} }
// fun connect(driver: UsbSerialDriver, connection: UsbDeviceConnection) { var listener: UsbServiceListener? = null
fun connect(driver: UsbSerialDriver, connection: UsbDeviceConnection) {
// Todo: Uncomment this
// mPort = driver.ports[0] // Most devices have just one port (port 0) // mPort = driver.ports[0] // Most devices have just one port (port 0)
// mPort.open(connection) // mPort.open(connection)
// mPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE) // mPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE)
// //
// isUsbConnected = true
// Log.d(TAG, "My Usb Connected ${mPort.driver}")
// }
var listener: UsbServiceListener? = null
fun connect(driver: UsbSerialDriver, connection: UsbDeviceConnection) {
mPort = driver.ports[0] // Most devices have just one port (port 0)
mPort.open(connection)
mPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE)
isUsbConnected = true isUsbConnected = true
Log.d(TAG, "My Usb Connected ${mPort.driver}") // Log.d(TAG, "My Usb Connected ${mPort.driver}")
//
val usbIoManager = SerialInputOutputManager(mPort, // val usbIoManager = SerialInputOutputManager(mPort,
object : SerialInputOutputManager.Listener{ // object : SerialInputOutputManager.Listener{
override fun onNewData(data: ByteArray?) { // override fun onNewData(data: ByteArray?) {
// Log.e(TAG, "onNewData() called inside eventDrivenWrite()") //// Log.e(TAG, "onNewData() called inside eventDrivenWrite()")
listener?.onUsbRead(data) // listener?.onUsbRead(data)
} // }
override fun onRunError(e: Exception?) { // override fun onRunError(e: Exception?) {
Log.e(TAG, "onRunError() called inside eventDrivenWrite()") // Log.e(TAG, "onRunError() called inside eventDrivenWrite()")
listener?.onUsbError(e) // listener?.onUsbError(e)
} // }
//
}) // })
usbIoManager.start(); // usbIoManager.start();
} }
fun disconnect() { fun disconnect() {
@@ -74,21 +65,46 @@ class UsbService : Service() {
} }
} }
// Todo: comment this
fun eventDrivenWrite(command: TestRightCommands, listener: UsbServiceListener) {
this.listener = listener
try {
when (command) {
TestRightCommands.autoset -> {
this.listener!!.onUsbRead("OK".toByteArray())
}
TestRightCommands.led2Set50 -> {
this.listener!!.onUsbRead("OK".toByteArray())
}
TestRightCommands.run -> {
this.listener!!.onUsbRead("OK [0]".toByteArray())
}
TestRightCommands.read -> {
this.listener!!.onUsbRead(InputData().inputRead.toByteArray())
}
TestRightCommands.printAll -> {
if (DataHolder.testExp) {
for (each in InputData().printForReference.lines()) {
this.listener!!.onUsbRead((each + "\n").toByteArray())
}
} else {
for (each in InputData().printForSample.lines()) {
this.listener!!.onUsbRead((each + "\n").toByteArray())
}
}
}
else -> {
this.listener!!.onUsbRead("OK".toByteArray())
}
}
} catch (e: IOException) {
listener.onUsbError(e)
}
}
// Todo: Uncomment this
// fun eventDrivenWrite(command: TestRightCommands, listener: UsbServiceListener) { // fun eventDrivenWrite(command: TestRightCommands, listener: UsbServiceListener) {
// val usbIoManager = SerialInputOutputManager(mPort, // this.listener = listener
// object : SerialInputOutputManager.Listener{
// override fun onNewData(data: ByteArray?) {
// Log.e(TAG, "onNewData() called inside eventDrivenWrite() :: command = ${command.command}")
// listener.onUsbRead(data)
// }
// override fun onRunError(e: Exception?) {
// Log.e(TAG, "onRunError() called inside eventDrivenWrite()")
// listener.onUsbError(e)
// }
//
// })
// usbIoManager.start();
//
// try { // try {
// mPort.write(command.command.toByteArray(), Constants.WRITE_TIMEOUT_MILLIS) // mPort.write(command.command.toByteArray(), Constants.WRITE_TIMEOUT_MILLIS)
// } catch (e: IOException) { // } catch (e: IOException) {
@@ -96,15 +112,6 @@ class UsbService : Service() {
// } // }
// } // }
fun eventDrivenWrite(command: TestRightCommands, listener: UsbServiceListener) {
this.listener = listener
try {
mPort.write(command.command.toByteArray(), Constants.WRITE_TIMEOUT_MILLIS)
} catch (e: IOException) {
listener.onUsbError(e)
}
}
// fun write(command: TestRightCommands){ // fun write(command: TestRightCommands){
// mPort.write(command.command.toByteArray(), Constants.WRITE_TIMEOUT_MILLIS) // mPort.write(command.command.toByteArray(), Constants.WRITE_TIMEOUT_MILLIS)
// } // }

View File

@@ -6,6 +6,9 @@ import com.example.hpos.R
import com.example.hpos.data.model.patient.PatientDetails import com.example.hpos.data.model.patient.PatientDetails
import java.io.File import java.io.File
import java.net.InetAddress import java.net.InetAddress
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
object MyUtils { object MyUtils {
@@ -34,6 +37,11 @@ object MyUtils {
} }
} }
fun generateTestIdForPatient(patientId: String): String {
val dateFormat = SimpleDateFormat("HHmm_ddMMyyyy", Locale.getDefault())
return patientId + "_" + dateFormat.format(Date())
}
fun String.mapToGender(): PatientDetails.Gender { fun String.mapToGender(): PatientDetails.Gender {
return if (this.lowercase() == "m"|| this.lowercase() == "male") { return if (this.lowercase() == "m"|| this.lowercase() == "male") {
PatientDetails.Gender.MALE PatientDetails.Gender.MALE
@@ -60,6 +68,11 @@ object MyUtils {
return this.substring(startIndex).toInt() return this.substring(startIndex).toInt()
} }
fun Int.calculateAgeFromYOB(): Int {
val currentY = SimpleDateFormat("yyyy_HHmmss").format(Date()).toInt()
return (currentY - this)
}
fun String.mapYesNoStringToBool(): Boolean { fun String.mapYesNoStringToBool(): Boolean {
return this.lowercase() == "yes" return this.lowercase() == "yes"
} }

View File

@@ -1,8 +1,8 @@
package com.example.hpos.util package com.example.hpos.util
import android.content.Context
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.hpos.data.DatabaseRepository
import com.example.hpos.data.LocalFileRepository import com.example.hpos.data.LocalFileRepository
import com.example.hpos.data.datasource.LocalFileDataSource import com.example.hpos.data.datasource.LocalFileDataSource
import com.example.hpos.domain.SaveRawData import com.example.hpos.domain.SaveRawData
@@ -11,16 +11,17 @@ import com.example.hpos.presentation.MainViewModel
import com.example.hpos.presentation.dashboard.DashboardViewModel import com.example.hpos.presentation.dashboard.DashboardViewModel
import com.example.hpos.presentation.testRight.TestRightViewModel import com.example.hpos.presentation.testRight.TestRightViewModel
class MyViewModelFactory(private val context: Context) : ViewModelProvider.Factory { class MyViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T { override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) if (modelClass.isAssignableFrom(MainViewModel::class.java))
return MainViewModel() as T return MainViewModel() as T
else if (modelClass.isAssignableFrom(TestRightViewModel::class.java)) { else if (modelClass.isAssignableFrom(TestRightViewModel::class.java)) {
val repository = LocalFileRepository(LocalFileDataSource()) val repository = LocalFileRepository(LocalFileDataSource())
return TestRightViewModel(SaveRawData(repository), SaveRawDataTest(repository)) as T return TestRightViewModel(SaveRawData(repository), SaveRawDataTest(repository), DatabaseRepository()) as T
} else if (modelClass.isAssignableFrom(DashboardViewModel::class.java)) { } else if (modelClass.isAssignableFrom(DashboardViewModel::class.java)) {
// val repository = LocalFileRepository(LocalFileDataSource()) // val repository = LocalFileRepository(LocalFileDataSource())
// return DashboardViewModel(DatabaseRepository()) as T
return DashboardViewModel() as T return DashboardViewModel() as T
} else } else
throw IllegalArgumentException("Unknown ViewModel class"); throw IllegalArgumentException("Unknown ViewModel class");

View File

@@ -1,12 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true">
tools:openDrawer="start">
<include <include
android:id="@+id/app_bar_dashboard" android:id="@+id/app_bar_dashboard"

View File

@@ -0,0 +1,137 @@
<?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=".presentation.KitScanActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:theme="@style/Theme.HPOS.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/Theme.HPOS.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<TextView
android:id="@+id/tv_title"
style="@style/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="16dp"
android:text="@string/scan_qr_code_of_the_kit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_bar_layout" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_scan_now"
android:layout_width="258dp"
android:layout_height="56dp"
android:layout_margin="24dp"
android:drawableLeft="@drawable/baseline_qr_code_scanner_24"
android:text="@string/scan_now"
android:textColor="@color/black"
app:backgroundTint="@color/blue_app_light"
app:cornerRadius="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_title" />
<RelativeLayout
android:id="@+id/seperator1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="48dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_scan_now">
<TextView
android:id="@+id/tvText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/or"
android:textColor="@color/gray" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_toLeftOf="@id/tvText1"
android:background="@color/gray" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_centerVertical="true"
android:layout_marginRight="16dp"
android:layout_toRightOf="@id/tvText1"
android:background="@color/gray" />
</RelativeLayout>
<TextView
android:id="@+id/tv_title2"
style="@style/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="48dp"
android:text="@string/enter_kit_serial_number_manually"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/seperator1" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/et_abha_id"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toStartOf="@id/btn_go"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title2">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="16"
android:inputType="text"
android:hint="@string/serial_number" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:text="@string/go"
app:cornerRadius="16dp"
app:layout_constraintBottom_toBottomOf="@id/et_abha_id"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@id/et_abha_id"
app:layout_constraintTop_toTopOf="@id/et_abha_id" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -9,7 +9,7 @@
<fragment <fragment
android:id="@+id/nav_host_fragment_content_dashboard" android:id="@+id/nav_host_fragment_content_dashboard"
android:name="androidx.navigation.fragment.NavHostFragment" class="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:defaultNavHost="true" app:defaultNavHost="true"
@@ -17,4 +17,5 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/dashboard_navigation" /> app:navGraph="@navigation/dashboard_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -33,6 +33,7 @@
app:layout_constraintTop_toBottomOf="@id/tv_title" /> app:layout_constraintTop_toBottomOf="@id/tv_title" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_margin="16dp" android:layout_margin="16dp"

View File

@@ -13,7 +13,7 @@
android:id="@+id/tv_title" android:id="@+id/tv_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/Instructions" android:text="@string/baseline_instruction"
android:layout_margin="16dp" android:layout_margin="16dp"
style="@style/title1" style="@style/title1"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@@ -43,160 +43,160 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <!-- <TextView-->
android:id="@+id/tv_subtitle1" <!-- android:id="@+id/tv_subtitle1"-->
style="@style/title2" <!-- style="@style/title2"-->
android:layout_width="0dp" <!-- android:layout_width="0dp"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginHorizontal="24dp" <!-- android:layout_marginHorizontal="24dp"-->
android:layout_marginTop="16dp" <!-- android:layout_marginTop="16dp"-->
android:text="@string/step3" <!-- android:text="@string/step3"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/tv_title" /> <!-- app:layout_constraintTop_toBottomOf="@id/tv_title" />-->
<Button <!-- <Button-->
android:id="@+id/btn_scan_aadhaar" <!-- android:id="@+id/btn_scan_aadhaar"-->
android:layout_width="216dp" <!-- android:layout_width="216dp"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginHorizontal="16dp" <!-- android:layout_marginHorizontal="16dp"-->
android:clickable="false" <!-- android:clickable="false"-->
android:text="@string/scan_aadhaar_card" <!-- android:text="@string/scan_aadhaar_card"-->
android:textColor="@color/white" <!-- android:textColor="@color/white"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/tv_subtitle1" /> <!-- app:layout_constraintTop_toBottomOf="@id/tv_subtitle1" />-->
<com.google.android.material.card.MaterialCardView <!-- <com.google.android.material.card.MaterialCardView-->
android:id="@+id/cv_sample_details" <!-- android:id="@+id/cv_sample_details"-->
android:layout_width="0dp" <!-- android:layout_width="0dp"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginHorizontal="24dp" <!-- android:layout_marginHorizontal="24dp"-->
android:layout_marginTop="16dp" <!-- android:layout_marginTop="16dp"-->
app:cardElevation="8dp" <!-- app:cardElevation="8dp"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/btn_scan_aadhaar"> <!-- app:layout_constraintTop_toBottomOf="@id/btn_scan_aadhaar">-->
<androidx.constraintlayout.widget.ConstraintLayout <!-- <androidx.constraintlayout.widget.ConstraintLayout-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="match_parent"> <!-- android:layout_height="match_parent">-->
<TextView <!-- <TextView-->
android:id="@+id/tv_title_sample" <!-- android:id="@+id/tv_title_sample"-->
style="@style/title2" <!-- style="@style/title2"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_margin="16dp" <!-- android:layout_margin="16dp"-->
android:drawablePadding="8dp" <!-- android:drawablePadding="8dp"-->
android:text="@string/enter_patient_details" <!-- android:text="@string/enter_patient_details"-->
app:drawableStartCompat="@drawable/ic_baseline_create_24" <!-- app:drawableStartCompat="@drawable/ic_baseline_create_24"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toTopOf="parent" /> <!-- app:layout_constraintTop_toTopOf="parent" />-->
<com.google.android.material.textfield.TextInputLayout <!-- <com.google.android.material.textfield.TextInputLayout-->
android:id="@+id/et_name" <!-- android:id="@+id/et_name"-->
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" <!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_margin="16dp" <!-- android:layout_margin="16dp"-->
android:hint="@string/patient_name" <!-- android:hint="@string/patient_name"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/tv_title_sample"> <!-- app:layout_constraintTop_toBottomOf="@id/tv_title_sample">-->
<com.google.android.material.textfield.TextInputEditText <!-- <com.google.android.material.textfield.TextInputEditText-->
android:id="@+id/et_name_block" <!-- android:id="@+id/et_name_block"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:inputType="textPersonName" /> <!-- android:inputType="textPersonName" />-->
</com.google.android.material.textfield.TextInputLayout> <!-- </com.google.android.material.textfield.TextInputLayout>-->
<com.google.android.material.textfield.TextInputLayout <!-- <com.google.android.material.textfield.TextInputLayout-->
android:id="@+id/et_age" <!-- android:id="@+id/et_age"-->
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" <!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_margin="16dp" <!-- android:layout_margin="16dp"-->
android:hint="@string/age" <!-- android:hint="@string/age"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/et_name"> <!-- app:layout_constraintTop_toBottomOf="@id/et_name">-->
<com.google.android.material.textfield.TextInputEditText <!-- <com.google.android.material.textfield.TextInputEditText-->
android:id="@+id/et_age_block" <!-- android:id="@+id/et_age_block"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:inputType="number" /> <!-- android:inputType="number" />-->
</com.google.android.material.textfield.TextInputLayout> <!-- </com.google.android.material.textfield.TextInputLayout>-->
<!-- <com.google.android.material.textfield.TextInputLayout--> <!-- &lt;!&ndash; <com.google.android.material.textfield.TextInputLayout&ndash;&gt;-->
<!-- android:id="@+id/et_gender"--> <!-- &lt;!&ndash; android:id="@+id/et_gender"&ndash;&gt;-->
<!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"--> <!-- &lt;!&ndash; style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"&ndash;&gt;-->
<!-- android:layout_width="match_parent"--> <!-- &lt;!&ndash; android:layout_width="match_parent"&ndash;&gt;-->
<!-- android:layout_height="wrap_content"--> <!-- &lt;!&ndash; android:layout_height="wrap_content"&ndash;&gt;-->
<!-- android:layout_margin="16dp"--> <!-- &lt;!&ndash; android:layout_margin="16dp"&ndash;&gt;-->
<!-- android:hint="@string/gender"--> <!-- &lt;!&ndash; android:hint="@string/gender"&ndash;&gt;-->
<!-- app:layout_constraintBottom_toBottomOf="parent"--> <!-- &lt;!&ndash; app:layout_constraintBottom_toBottomOf="parent"&ndash;&gt;-->
<!-- app:layout_constraintEnd_toEndOf="parent"--> <!-- &lt;!&ndash; app:layout_constraintEnd_toEndOf="parent"&ndash;&gt;-->
<!-- app:layout_constraintStart_toStartOf="parent"--> <!-- &lt;!&ndash; app:layout_constraintStart_toStartOf="parent"&ndash;&gt;-->
<!-- app:layout_constraintTop_toBottomOf="@id/et_age">--> <!-- &lt;!&ndash; app:layout_constraintTop_toBottomOf="@id/et_age">&ndash;&gt;-->
<!-- <com.google.android.material.textfield.TextInputEditText--> <!-- &lt;!&ndash; <com.google.android.material.textfield.TextInputEditText&ndash;&gt;-->
<!-- android:layout_width="match_parent"--> <!-- &lt;!&ndash; android:layout_width="match_parent"&ndash;&gt;-->
<!-- android:layout_height="wrap_content" />--> <!-- &lt;!&ndash; android:layout_height="wrap_content" />&ndash;&gt;-->
<!-- </com.google.android.material.textfield.TextInputLayout>--> <!-- &lt;!&ndash; </com.google.android.material.textfield.TextInputLayout>&ndash;&gt;-->
<!-- style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu"--> <!-- &lt;!&ndash; style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu"&ndash;&gt;-->
<com.google.android.material.textfield.TextInputLayout <!-- <com.google.android.material.textfield.TextInputLayout-->
android:id="@+id/dd_gender" <!-- android:id="@+id/dd_gender"-->
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" <!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_margin="16dp" <!-- android:layout_margin="16dp"-->
android:hint="@string/gender" <!-- android:hint="@string/gender"-->
app:layout_constraintEnd_toEndOf="parent" <!-- app:layout_constraintEnd_toEndOf="parent"-->
app:layout_constraintStart_toStartOf="parent" <!-- app:layout_constraintStart_toStartOf="parent"-->
app:layout_constraintTop_toBottomOf="@id/et_age"> <!-- app:layout_constraintTop_toBottomOf="@id/et_age">-->
<AutoCompleteTextView <!-- <AutoCompleteTextView-->
android:id="@+id/et_gender_block" <!-- android:id="@+id/et_gender_block"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:hint="@string/gender" <!-- android:hint="@string/gender"-->
android:inputType="none" <!-- android:inputType="none"-->
android:labelFor="@id/dd_gender" <!-- android:labelFor="@id/dd_gender"-->
app:simpleItems="@array/gender" /> <!-- app:simpleItems="@array/gender" />-->
</com.google.android.material.textfield.TextInputLayout> <!-- </com.google.android.material.textfield.TextInputLayout>-->
<com.google.android.material.checkbox.MaterialCheckBox <!-- <com.google.android.material.checkbox.MaterialCheckBox-->
android:id="@+id/cb_item1" <!-- android:id="@+id/cb_item1"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginTop="16dp" <!-- android:layout_marginTop="16dp"-->
android:layout_marginHorizontal="16dp" <!-- android:layout_marginHorizontal="16dp"-->
android:text="@string/is_patient_under_any_medication" <!-- android:text="@string/is_patient_under_any_medication"-->
app:layout_constraintTop_toBottomOf="@id/dd_gender" <!-- app:layout_constraintTop_toBottomOf="@id/dd_gender"-->
app:layout_constraintStart_toStartOf="parent"/> <!-- app:layout_constraintStart_toStartOf="parent"/>-->
<com.google.android.material.checkbox.MaterialCheckBox <!-- <com.google.android.material.checkbox.MaterialCheckBox-->
android:id="@+id/cb_item2" <!-- android:id="@+id/cb_item2"-->
android:layout_width="match_parent" <!-- android:layout_width="match_parent"-->
android:layout_height="wrap_content" <!-- android:layout_height="wrap_content"-->
android:layout_marginHorizontal="16dp" <!-- android:layout_marginHorizontal="16dp"-->
android:text="@string/is_patient_undergoing_any_blood_transfusion" <!-- android:text="@string/is_patient_undergoing_any_blood_transfusion"-->
app:layout_constraintTop_toBottomOf="@id/cb_item1" <!-- app:layout_constraintTop_toBottomOf="@id/cb_item1"-->
app:layout_constraintStart_toStartOf="parent"/> <!-- app:layout_constraintStart_toStartOf="parent"/>-->
</androidx.constraintlayout.widget.ConstraintLayout> <!-- </androidx.constraintlayout.widget.ConstraintLayout>-->
</com.google.android.material.card.MaterialCardView> <!-- </com.google.android.material.card.MaterialCardView>-->
<TextView <TextView
android:id="@+id/tv_subtitle2" android:id="@+id/tv_subtitle2"
@@ -204,11 +204,11 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:layout_marginTop="32dp" android:layout_marginTop="16dp"
android:text="@string/step4" android:text="@string/step4"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cv_sample_details" /> app:layout_constraintTop_toBottomOf="@id/tv_title" />
<TextView <TextView
android:id="@+id/tv_subtitle3" android:id="@+id/tv_subtitle3"
@@ -216,7 +216,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:layout_marginTop="24dp" android:layout_marginTop="16dp"
android:text="@string/step5" android:text="@string/step5"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -261,6 +261,22 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_skip"
style="@style/title1_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="36dp"
android:text="@string/set_baseline_reference_again"
android:textColor="@color/blue_app_dark"
android:textStyle="italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_submit" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView> </ScrollView>

View File

@@ -1,133 +0,0 @@
<?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"
tools:context=".presentation.testRight.TestRightExpScanner">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- <Button-->
<!-- android:id="@+id/btn_update_reference"-->
<!-- android:layout_width="216dp"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginHorizontal="24dp"-->
<!-- android:layout_marginTop="24dp"-->
<!-- android:clickable="false"-->
<!-- android:text="@string/update_reference"-->
<!-- android:textColor="@color/white"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toTopOf="parent" />-->
<!-- <androidx.constraintlayout.widget.ConstraintLayout-->
<!-- android:id="@+id/cl_instructions"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toBottomOf="@id/btn_update_reference">-->
<TextView
android:id="@+id/tv_title"
style="@style/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="16dp"
android:text="@string/patient_details"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_scan_aadhaar"
android:layout_width="216dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
android:clickable="false"
android:drawableLeft="@drawable/ic_baseline_camera_alt_24"
android:text="@string/scan_aadhaar_card"
android:textAlignment="center"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
<TextView
android:id="@+id/tv_subtitle1"
style="@style/title2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/or"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_scan_aadhaar" />
<Button
android:id="@+id/btn_scan_abha"
android:layout_width="216dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:clickable="false"
android:drawableLeft="@drawable/ic_baseline_camera_alt_24"
android:text="@string/scan_abha_card"
android:textAlignment="center"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_subtitle1" />
<TextView
android:id="@+id/tv_subtitle2"
style="@style/title2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/or"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_scan_abha" />
<Button
android:id="@+id/btn_enter_manually"
android:layout_width="216dp"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:clickable="false"
android:text="Enter Manually"
android:textAlignment="center"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_subtitle2" />
<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>
</ScrollView>
</layout>

View File

@@ -34,26 +34,39 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView
android:id="@+id/tv_id"
style="@style/title2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="14dp"
android:text="@string/patient_id_in_tv"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/tv_name" android:id="@+id/tv_name"
style="@style/title2" style="@style/title2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/name_in_textview"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_gender"
style="@style/title2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="@string/gender_in_textview" android:text="@string/name_in_textview"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_id"
app:layout_constraintTop_toBottomOf="@id/tv_name" /> app:layout_constraintStart_toStartOf="parent" />
<!-- <TextView-->
<!-- android:id="@+id/tv_gender"-->
<!-- style="@style/title2"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginHorizontal="16dp"-->
<!-- android:layout_marginTop="4dp"-->
<!-- android:text="@string/gender_in_textview"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toBottomOf="@id/tv_name" />-->
<TextView <TextView
android:id="@+id/tv_age" android:id="@+id/tv_age"
@@ -64,7 +77,7 @@
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="@string/age_in_textview" android:text="@string/age_in_textview"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_gender" /> app:layout_constraintTop_toBottomOf="@id/tv_name" />
<View <View
android:id="@+id/line" android:id="@+id/line"

View File

@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height" android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar" android:background="@color/blue_app"
android:gravity="bottom" android:gravity="bottom"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
@@ -18,7 +18,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:contentDescription="@string/nav_header_desc" android:contentDescription="@string/nav_header_desc"
android:paddingTop="@dimen/nav_header_vertical_spacing" android:paddingTop="@dimen/nav_header_vertical_spacing"
app:srcCompat="@mipmap/ic_launcher_round" /> app:srcCompat="@mipmap/hpos_icon" />
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/blue_app_light" android:background="@color/blue_app_light"
android:padding="8dp" android:padding="8dp"
android:layout_margin="8dp"> android:layout_margin="8dp">
<RadioButton <androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/radioButton" android:id="@+id/radioButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="@id/tv_id" app:layout_constraintBottom_toBottomOf="@id/tv_id"
app:layout_constraintTop_toTopOf="@id/tv_name" /> app:layout_constraintTop_toTopOf="@id/tv_name"
tools:checked="true"/>
<TextView <TextView
android:id="@+id/tv_name" android:id="@+id/tv_name"
@@ -33,7 +36,7 @@
style="@style/title1_2" style="@style/title1_2"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="ID: 12345678901234" android:text="ID: 12321312312"
android:textAlignment="center" android:textAlignment="center"
app:layout_constraintStart_toEndOf="@id/radioButton" app:layout_constraintStart_toEndOf="@id/radioButton"
app:layout_constraintTop_toBottomOf="@id/tv_name"/> app:layout_constraintTop_toBottomOf="@id/tv_name"/>
@@ -41,6 +44,7 @@
<TextView <TextView
android:id="@+id/tv_status" android:id="@+id/tv_status"
style="@style/title1_1" style="@style/title1_1"
android:textSize="16sp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/pending" android:text="@string/pending"

View File

@@ -15,6 +15,6 @@
<item <item
android:id="@+id/nav_settings" android:id="@+id/nav_settings"
android:icon="@drawable/baseline_settings_24" android:icon="@drawable/baseline_settings_24"
android:title="@string/menu_slideshow" /> android:title="@string/menu_settings" />
</group> </group>
</menu> </menu>

View File

@@ -21,13 +21,13 @@
<fragment <fragment
android:id="@+id/nav_profile" android:id="@+id/nav_profile"
android:name="com.example.hpos.presentation.dashboard.GalleryFragment" android:name="com.example.hpos.presentation.dashboard.GalleryFragment"
android:label="@string/menu_gallery" android:label="@string/profile"
tools:layout="@layout/fragment_gallery" /> tools:layout="@layout/fragment_gallery" />
<fragment <fragment
android:id="@+id/nav_settings" android:id="@+id/nav_settings"
android:name="com.example.hpos.presentation.dashboard.SlideshowFragment" android:name="com.example.hpos.presentation.dashboard.SlideshowFragment"
android:label="@string/menu_slideshow" android:label="@string/action_settings"
tools:layout="@layout/fragment_slideshow" /> tools:layout="@layout/fragment_slideshow" />
<fragment <fragment
android:id="@+id/registerOneScanAbhaFragment" android:id="@+id/registerOneScanAbhaFragment"
@@ -53,8 +53,8 @@
android:name="com.example.hpos.presentation.dashboard.register.RegisterThreeEnterPatientDetails" android:name="com.example.hpos.presentation.dashboard.register.RegisterThreeEnterPatientDetails"
android:label="Registration (3/3)" > android:label="Registration (3/3)" >
<action <action
android:id="@+id/action_registerThreeEnterPatientDetails_to_mainActivity" android:id="@+id/action_registerThreeEnterPatientDetails_to_nav_home"
app:destination="@id/mainActivity" /> app:destination="@id/nav_home" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/registerOneCreateAbha" android:id="@+id/registerOneCreateAbha"

View File

@@ -57,13 +57,14 @@
<!-- Instructions Text --> <!-- Instructions Text -->
<string name="Instructions">Instructions</string> <string name="Instructions">Testing Instructions</string>
<string name="step1"><b><u>Step 1</u> : </b> Place the cuvette containing reference/baseline sample for referencing.</string> <string name="step1"><b><u>Step 1</u> : </b> Place the cuvette containing reference/baseline sample for referencing.</string>
<string name="step2"><b><u>Step 2</u> : </b> Press the button below to start the device reading values.</string> <string name="step2"><b><u>Step 2</u> : </b> Press the button below to start the device reading values.</string>
<string name="step3"><b><u>Step 1</u> : </b> Enter the sample details to start.</string> <string name="step3"><b><u>Step 1</u> : </b> Enter the sample details to start.</string>
<string name="step4"><b><u>Step 2</u> : </b> Place the cuvette containing sample for experiment.</string> <!-- <string name="step4"><b><u>Step 1</u> : </b> Place the cuvette containing sample for experiment.</string>-->
<string name="step5"><b><u>Step 3</u> : </b> Press the button below to start the device reading values.</string> <string name="step4"><b><u>Step 1</u> : </b> Place the cuvette containing blood sample mixed with kit solution.</string>
<string name="step5"><b><u>Step 2</u> : </b> Press the button below to start the device reading values.</string>
<string name="acquire">Acquire</string> <string name="acquire">Acquire</string>
@@ -77,6 +78,7 @@
<string name="age_error_out_of_bound">Age should be valid</string> <string name="age_error_out_of_bound">Age should be valid</string>
<string name="yob_error">Year of birth can\'t be empty</string> <string name="yob_error">Year of birth can\'t be empty</string>
<string name="yob_error_2">Invalid Year of Birth</string>
<string name="mobile_error">Mobile Number can\'t be empty</string> <string name="mobile_error">Mobile Number can\'t be empty</string>
<string name="this_error">This can\'t be empty</string> <string name="this_error">This can\'t be empty</string>
<!-- <string name="this_error">This can\'t be empty</string>--> <!-- <string name="this_error">This can\'t be empty</string>-->
@@ -125,19 +127,20 @@
<string name="scan_now">Scan Now</string> <string name="scan_now">Scan Now</string>
<string name="enter_abha_number_manualy">Enter ABHA number manualy</string> <string name="enter_abha_number_manualy">Enter ABHA number manualy</string>
<string name="abha_id">ABHA ID</string> <string name="abha_id">ABHA ID</string>
<string name="patient_id_in_tv"><b>Patient ID</b> : %1$s</string>
<string name="go">GO</string> <string name="go">GO</string>
<string name="click_here">Click Here</string> <string name="click_here">Click Here</string>
<string name="title_activity_dashboard">DashboardActivity</string> <string name="title_activity_dashboard">DashboardActivity</string>
<string name="navigation_drawer_open">Open navigation drawer</string> <string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string> <string name="navigation_drawer_close">Close navigation drawer</string>
<string name="nav_header_title">Android Studio</string> <string name="nav_header_title">HPOS</string>
<string name="nav_header_subtitle">android.studio@android.com</string> <string name="nav_header_subtitle">sminnovations.in</string>
<string name="nav_header_desc">Navigation header</string> <string name="nav_header_desc">Navigation header</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="menu_home">Home</string> <string name="menu_home">Home</string>
<string name="menu_gallery">Gallery</string> <string name="menu_gallery">Gallery</string>
<string name="menu_slideshow">Slideshow</string> <string name="menu_settings">Settings</string>
<string name="profile">Profile</string> <string name="profile">Profile</string>
<string name="year_of_birth">Year of Birth</string> <string name="year_of_birth">Year of Birth</string>
<string name="father_s_name_husband_s_name">Father\'s Name / Husband\'s Name</string> <string name="father_s_name_husband_s_name">Father\'s Name / Husband\'s Name</string>
@@ -156,7 +159,14 @@
<string name="scan_patient_aadhaar_card">Scan Patient Aadhaar Card</string> <string name="scan_patient_aadhaar_card">Scan Patient Aadhaar Card</string>
<string name="enter_aadhaar_number_manualy">Enter Aadhaar number manualy</string> <string name="enter_aadhaar_number_manualy">Enter Aadhaar number manualy</string>
<string name="aadhaar_number">Aadhaar Number</string> <string name="aadhaar_number">Aadhaar Number</string>
<string name="aadhaar_in_tv"><b>Aadhaar Number</b></string>
<string name="please_use_official_abha_app_to_create_abha_id_and_come_back">Please use “Official ABHA App" to create ABHA ID, and come back.</string> <string name="please_use_official_abha_app_to_create_abha_id_and_come_back">Please use “Official ABHA App" to create ABHA ID, and come back.</string>
<string name="please_enter_aadhaar">Please Enter Aadhaar Number to continue</string> <string name="please_enter_aadhaar">Please Enter Aadhaar Number to continue</string>
<string name="scan_qr_code_of_the_kit">Scan QR Code of the KIT</string>
<string name="enter_kit_serial_number_manually">Enter KIT Serial Number manually</string>
<string name="serial_number">Serial Number</string>
<string name="set_baseline_reference_again">Set Baseline/Reference again?</string>
<string name="baseline_instruction">Baseline Instruction</string>
</resources> </resources>