new 124 version

This commit is contained in:
chandrashekhar reddy
2024-06-25 13:06:20 +05:30
parent c41a2f5139
commit 331726682f
16 changed files with 237 additions and 57 deletions

View File

@@ -1,13 +1,51 @@
{ {
"project_info": { "project_info": {
"project_number": "630821402019", "project_number": "243503501547",
"project_id": "iocl-iisc", "project_id": "iocl-iisc-hpos",
"storage_bucket": "iocl-iisc.appspot.com" "storage_bucket": "iocl-iisc-hpos.appspot.com"
}, },
"client": [ "client": [
{ {
"client_info": { "client_info": {
"mobilesdk_app_id": "1:630821402019:android:ed56bae066ac32b51dd616", "mobilesdk_app_id": "1:243503501547:android:f17de652a3524d047feeae",
"android_client_info": {
"package_name": "com.iocl_iisc.hposqc"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyBPxgcDkZfZMr8cFrkMWkVf1a-MstzWC1k"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:243503501547:android:e1bb0f338c8448dd7feeae",
"android_client_info": {
"package_name": "in.sminnovations.hposregistration.iocl"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyBPxgcDkZfZMr8cFrkMWkVf1a-MstzWC1k"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:243503501547:android:18b8b33b2dc3776d7feeae",
"android_client_info": { "android_client_info": {
"package_name": "in.sminnovations.hpostesting.iocl" "package_name": "in.sminnovations.hpostesting.iocl"
} }
@@ -15,7 +53,7 @@
"oauth_client": [], "oauth_client": [],
"api_key": [ "api_key": [
{ {
"current_key": "AIzaSyABIdxI89eTZ8BqU2cIoJOgJ1lS1cFLCtQ" "current_key": "AIzaSyBPxgcDkZfZMr8cFrkMWkVf1a-MstzWC1k"
} }
], ],
"services": { "services": {

View File

@@ -1066,8 +1066,8 @@ object Constants {
), ),
) )
const val INCUBATION_TIME_MIN = 0 const val INCUBATION_TIME_MIN = 15
const val INCUBATION_TIME_MAX = 1400 const val INCUBATION_TIME_MAX = 30
const val BATTERY_LEVEL_MIN = Int.MIN_VALUE const val BATTERY_LEVEL_MIN = Int.MIN_VALUE
const val PQ_MODE = true const val PQ_MODE = true
@@ -1578,7 +1578,7 @@ object Constants {
const val positiveForSickleCellMin10mm = 0.31 const val positiveForSickleCellMin10mm = 0.31
const val positiveForSickleCellMax10mm = 0.43 const val positiveForSickleCellMax10mm = 0.43
const val sickleCellDiseaseMin10mm = 0.43 const val sickleCellDiseaseMin10mm = 0.43
const val sickleCellDiseaseMax10mm = 1.0 const val sickleCellDiseaseMax10mm = 0.7
//Hemocube for 2mm //Hemocube for 2mm
const val positiveBoderLine2mm1 = 0.8 const val positiveBoderLine2mm1 = 0.8
const val positiveBoderLine2mm2 = 1.1 const val positiveBoderLine2mm2 = 1.1
@@ -1593,7 +1593,7 @@ object Constants {
const val positiveForSickleCellMin2mm = 0.31 const val positiveForSickleCellMin2mm = 0.31
const val positiveForSickleCellMax2mm = 0.45 const val positiveForSickleCellMax2mm = 0.45
const val sickleCellDiseaseMin2mm = 0.45 const val sickleCellDiseaseMin2mm = 0.45
const val sickleCellDiseaseMax2mm = 1.0 const val sickleCellDiseaseMax2mm = 0.7

View File

@@ -38,6 +38,8 @@ object DataHolder {
var selectedTest: UserData? = null var selectedTest: UserData? = null
var hemoCubeTestData: HemoCubeTestData? = null var hemoCubeTestData: HemoCubeTestData? = null
var kitSerial: String = "" var kitSerial: String = ""
var centerName: String = ""
var district: String = ""
var location: UserData.Location? = null var location: UserData.Location? = null
var testExp: Boolean = true var testExp: Boolean = true
var hemocubeResult: Double? = null var hemocubeResult: Double? = null

View File

@@ -107,5 +107,7 @@ data class HemoCubeTestData(
var volume: String? = "", var volume: String? = "",
var isCSVCreated: Boolean = false, var isCSVCreated: Boolean = false,
var labName: String? = "", var labName: String? = "",
var cuvetteSize: String? = "" var cuvetteSize: String? = "",
var district: String? = "",
var centerName: String? = ""
) )

View File

@@ -75,7 +75,7 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate {
} }
Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show() Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show()
binding.nameEditText.setText(contents) binding.nameEditText.setText(contents)
}else if(contents.contains("SC-2-D10/")){ }else if(contents.contains("SMI/SC-2-D10/")){
with(sharedPreference.edit()) { with(sharedPreference.edit()) {
putString(Constants.CUVETTE_SIZE, "10mm") putString(Constants.CUVETTE_SIZE, "10mm")
apply() apply()
@@ -178,10 +178,6 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate {
// Optionally, show a user-friendly error message to the user // Optionally, show a user-friendly error message to the user
// Toast.makeText(applicationContext, "An error occurred", Toast.LENGTH_SHORT).show() // Toast.makeText(applicationContext, "An error occurred", Toast.LENGTH_SHORT).show()
} }
binding.nameEditText.setText("SMI/SC/")
setSupportActionBar(binding.toolbar) setSupportActionBar(binding.toolbar)
binding.btnScanNow.setOnClickListener { binding.btnScanNow.setOnClickListener {
@@ -198,7 +194,7 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate {
apply() apply()
} }
Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show() Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show()
}else if(serialNumber.contains("SC-2-D10/")){ }else if(serialNumber.contains("SMI/SC-2-D10/")){
with(sharedPreference.edit()) { with(sharedPreference.edit()) {
putString(Constants.CUVETTE_SIZE, "10mm") putString(Constants.CUVETTE_SIZE, "10mm")
apply() apply()
@@ -322,8 +318,17 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate {
} }
private fun isSerialValid(s: String): Boolean { private fun isSerialValid(s: String): Boolean {
if (s.length != 17) { if (s.contains("SMI/SC/")) {
binding.nameEditText.error = getString(R.string.invalid_kit) if(s.length != 17){
binding.nameEditText.error = getString(R.string.invalid_kit)
return false
}
}else if(s.contains("SMI/SC-2-D10/")){
if(s.length != 27){
binding.nameEditText.error = "Invalid Kit Serial Number, correct example SMI/SC-2-D10/000000/000/000"
return false
}
}else{
return false return false
} }
return true return true

View File

@@ -113,23 +113,22 @@ class OfflineUserListAdapter(private val view: View, private val batLevel: Int,p
view.context.getString(R.string.incubation_not_completed), view.context.getString(R.string.incubation_not_completed),
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
} else } else if (isBetween15And30Minutes(userList.incubationTime) > Constants.INCUBATION_TIME_MAX) {
if (isBetween15And30Minutes(userList.incubationTime) > Constants.INCUBATION_TIME_MAX) { Toast.makeText(
Toast.makeText( view.context,
view.context, view.context.getString(R.string.incubation_crossed_30_minutes),
view.context.getString(R.string.incubation_crossed_30_minutes), Toast.LENGTH_SHORT
Toast.LENGTH_SHORT ).show()
).show() } else {
} else { DataHolder.selectedTest = UserData(
DataHolder.selectedTest = UserData(
sampleid = userList.sampleid, sampleid = userList.sampleid,
_id = userList._id, _id = userList._id,
bloodGroup = userList.bloodGroup, bloodGroup = userList.bloodGroup,
incubationTime = userList.incubationTime incubationTime = userList.incubationTime
) )
view.findNavController() view.findNavController()
.navigate(R.id.action_nav_home_to_mainActivity) .navigate(R.id.action_nav_home_to_mainActivity)
} }
} else { } else {
Toast.makeText( Toast.makeText(
view.context, view.context,

View File

@@ -655,10 +655,9 @@ class HomeFragment : Fragment() {
val version = pInfo.versionName val version = pInfo.versionName
var labname = sharedPreference.getString(Constants.LABNAME,"") var labname = sharedPreference.getString(Constants.LABNAME,"")
return LoginRequest( return LoginRequest(
password = password, serialNumber = userID, username = userID, version = version, lab = labname latitude = DataHolder.location!!.latitude.toString(), longitude = DataHolder.location!!.longitude.toString(), location = DataHolder.location.toString(), password = password, serialNumber = userID, username = userID, version = version, lab = labname
) )
}//latitude = DataHolder.location!!.latitude.toString(), longitude = DataHolder.location!!.longitude.toString(), location = DataHolder.location.toString() }
private fun createCheckUpdateRequestData(): CheckUpdateRequest { private fun createCheckUpdateRequestData(): CheckUpdateRequest {
val pInfo = requireActivity().packageManager.getPackageInfo( val pInfo = requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0 requireActivity().packageName, 0
@@ -1087,15 +1086,15 @@ class HomeFragment : Fragment() {
// dialog.dismiss() // dialog.dismiss()
// } // }
hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { kitDataList -> // hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { kitDataList ->
kitDataList.forEach { userData -> // kitDataList.forEach { userData ->
if (!userData.localFlag) { // if (!userData.localFlag) {
userData.localFlag = true // userData.localFlag = true
hemoCubeViewModel.bulkAddResultKitTestToDb(userData) // hemoCubeViewModel.bulkAddResultKitTestToDb(userData)
} // }
} // }
dialog.dismiss() // dialog.dismiss()
} // }
} }
private fun downloadLocalDBData(dialog: DialogInterface) { private fun downloadLocalDBData(dialog: DialogInterface) {

View File

@@ -34,6 +34,7 @@ import androidx.annotation.RequiresApi
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.Constants
import com.example.hpostesting.data.constant.DataHolder
import com.example.hpostesting.util.AppInitializer import com.example.hpostesting.util.AppInitializer
import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.R
import `in`.sminnovations.hpostesting.databinding.FragmentLoginBinding import `in`.sminnovations.hpostesting.databinding.FragmentLoginBinding
@@ -140,6 +141,14 @@ class LoginFragment : Fragment() {
} }
private fun validateCredentials(username: String, password: String): Boolean { private fun validateCredentials(username: String, password: String): Boolean {
var storedPassword = secureStorage.getPassword() var storedPassword = secureStorage.getPassword()
// if (!checkUserName(binding.etName.text.toString())) {
// binding.etName.error = "Name field can't be empty or less than 3 characters"
// return false
// }
if (!checkCenterName(binding.centerName.text.toString())) {
binding.centerName.error = "Center name can't be empty or less than 3 characters"
return false
}
if(username == "ADMIN"){ if(username == "ADMIN"){
storedPassword = secureStorage.getAdminPassword() storedPassword = secureStorage.getAdminPassword()
} }
@@ -156,6 +165,8 @@ class LoginFragment : Fragment() {
putString(Constants.USER_ID, userId) putString(Constants.USER_ID, userId)
apply() apply()
} }
DataHolder.centerName = binding.centerName.text.toString()
DataHolder.district = binding.etDistrict.text.toString()
} }
override fun onDestroyView() { override fun onDestroyView() {
@@ -283,5 +294,12 @@ class LoginFragment : Fragment() {
// } // }
// } // }
// } // }
private fun checkUserName(userName: String): Boolean {
return userName.isNotEmpty() && userName.length >= 3
}
private fun checkCenterName(centerName: String): Boolean {
return centerName.isNotEmpty() && centerName.length >= 3
}
} }

View File

@@ -142,7 +142,7 @@ class HemoCubeFragment : Fragment() {
if (isBufferValueAvailable()){ if (isBufferValueAvailable()){
binding.btnPlacebuffer.apply { binding.btnPlacebuffer.apply {
setBackgroundColor(Color.GREEN) // Set button background color to green setBackgroundColor(Color.GREEN) // Set button background color to green
text = "Fresh Buffer" // Change button text to "Buffer Exists" text = "Refresh Buffer" // Change button text to "Buffer Exists"
} }
}else{ }else{
binding.btnPlacebuffer.apply { binding.btnPlacebuffer.apply {
@@ -896,11 +896,12 @@ class HemoCubeFragment : Fragment() {
} }
} }
fun handleBackButtonPress() { fun handleBackButtonPress(): Boolean {
if (isTestOngoing) { return if (isTestOngoing) {
showToast(R.string.test_go_noback) showToast(R.string.test_go_noback)
true // Indicate that the back press was handled
} else { } else {
activity?.onBackPressed() false // Indicate that the back press was not handled
} }
} }

View File

@@ -415,7 +415,8 @@ class HemoCubeViewModel @Inject constructor(
testDetails?.filter = DataHolder.hemoCubeTestData?.filter testDetails?.filter = DataHolder.hemoCubeTestData?.filter
testDetails?.labName = DataHolder.hemoCubeTestData?.labName testDetails?.labName = DataHolder.hemoCubeTestData?.labName
testDetails?.cuvetteSize = DataHolder.hemoCubeTestData?.cuvetteSize testDetails?.cuvetteSize = DataHolder.hemoCubeTestData?.cuvetteSize
testDetails?.centerName = DataHolder.centerName
testDetails?.district = DataHolder.district
} }
private fun addResultTestToDb() { private fun addResultTestToDb() {
@@ -488,6 +489,7 @@ class HemoCubeViewModel @Inject constructor(
when (repository.addTestToDatabase(userData)) { when (repository.addTestToDatabase(userData)) {
is Response.Success -> { is Response.Success -> {
fireBaseBulkUpload.postValue("Success") fireBaseBulkUpload.postValue("Success")
userData.localFlag = true
updateLocalFlag(userData._id) updateLocalFlag(userData._id)
} }

View File

@@ -196,14 +196,25 @@ open class HemocubeActivity : AppCompatActivity() {
} }
override fun onBackPressed() { // override fun onBackPressed() {
val fragment = supportFragmentManager.findFragmentById(R.id.fghemocube) // val fragment = supportFragmentManager.findFragmentById(R.id.fghemocube)
if (fragment is HemoCubeFragment) { // if (fragment is HemoCubeFragment) {
fragment.handleBackButtonPress() // fragment.handleBackButtonPress()
} else { // } else {
super.onBackPressed() // super.onBackPressed()
// }
// }
override fun onBackPressed() {
val fragment = supportFragmentManager.findFragmentById(R.id.fghemocube)
if (fragment is HemoCubeFragment) {
if (fragment.handleBackButtonPress()) {
// If the fragment handled the back press, return to avoid calling super.onBackPressed
return
} }
} }
// If the fragment did not handle the back press, call the superclass method
super.onBackPressed()
}
fun onErrorReported(msg: String) { fun onErrorReported(msg: String) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()

View File

@@ -128,7 +128,7 @@
android:id="@+id/name_edit_text" android:id="@+id/name_edit_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLength="17" android:maxLength="27"
android:inputType="text" android:inputType="text"
android:hint="@string/serial_number" /> android:hint="@string/serial_number" />

View File

@@ -60,7 +60,7 @@
app:layout_constraintTop_toBottomOf="@+id/tv_title" /> app:layout_constraintTop_toBottomOf="@+id/tv_title" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/et_aadharID" android:id="@+id/et_login"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -77,7 +77,25 @@
android:inputType="textCapCharacters" android:inputType="textCapCharacters"
android:maxLength="13" /> android:maxLength="13" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/til_name"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_login">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="24"
android:hint="Device user name" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/et_centerName" android:id="@+id/et_centerName"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
@@ -86,7 +104,46 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
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_aadharID"> app:layout_constraintTop_toBottomOf="@id/til_name">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/centerName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="24"
android:hint="Center name"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/til_district"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_centerName">
<AutoCompleteTextView
android:id="@+id/et_district"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/district"
android:inputType="none"
android:text="Mysuru"
android:labelFor="@id/til_district"
app:simpleItems="@array/district" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/et_password"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/til_district">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/password" android:id="@+id/password"
@@ -104,9 +161,10 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/login" android:text="@string/login"
app:cornerRadius="16dp" app:cornerRadius="16dp"
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/et_centerName" /> app:layout_constraintTop_toBottomOf="@+id/et_password" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ // Copyright (c) 2024 ShanMukha Innovations Pvt. Ltd. All rights reserved.
~ // Notice: All information contained herein is, and remains
~ // the property of ShanMukha Innovations Pvt. Ltd. and its suppliers,
~ // if any. The intellectual and technical concepts contained
~ // herein are proprietary to ShanMukha Innovations Pvt. Ltd.
~ // and its suppliers and may be covered by Indian and Foreign Patents,
~ // patents in process, and are protected by trade secret or copyright law.
~ // Dissemination of this information or reproduction of this material
~ // is strictly forbidden unless prior written permission is obtained
~ // from ShanMukha Innovations Pvt. Ltd.
-->
<resources>
<string-array name="district">
<item>Mysuru</item>
<item>Kodagu</item>
<item>Chamarajanagar</item>
</string-array>
</resources>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ // Copyright (c) 2024 ShanMukha Innovations Pvt. Ltd. All rights reserved.
~ // Notice: All information contained herein is, and remains
~ // the property of ShanMukha Innovations Pvt. Ltd. and its suppliers,
~ // if any. The intellectual and technical concepts contained
~ // herein are proprietary to ShanMukha Innovations Pvt. Ltd.
~ // and its suppliers and may be covered by Indian and Foreign Patents,
~ // patents in process, and are protected by trade secret or copyright law.
~ // Dissemination of this information or reproduction of this material
~ // is strictly forbidden unless prior written permission is obtained
~ // from ShanMukha Innovations Pvt. Ltd.
-->
<resources>
<string-array name="district">
<item>Mysuru</item>
<item>Kodagu</item>
<item>Chamarajanagar</item>
</string-array>
</resources>

View File

@@ -25,5 +25,10 @@
<item>ka</item> <item>ka</item>
<!-- Use language codes (e.g., en, kn) as values --> <!-- Use language codes (e.g., en, kn) as values -->
</string-array> </string-array>
<string-array name="district">
<item>Mysuru</item>
<item>Kodagu</item>
<item>Chamarajanagar</item>
</string-array>
</resources> </resources>