From 2fbc280b4acda1f6e525538834ee3f36d3310c29 Mon Sep 17 00:00:00 2001 From: sathwik Date: Thu, 19 Jun 2025 11:58:47 +0530 Subject: [PATCH] implementing the secure storage --- app/build.gradle | 13 +++- app/release/output-metadata.json | 37 ---------- app/src/main/AndroidManifest.xml | 4 -- .../hpostesting/HPOSTestingApplication.kt | 9 +++ .../hpostesting/data/constant/Constants.kt | 2 +- .../hpostesting/firebase/FirebaseManage.kt | 16 ++--- .../presentation/KitScanActivity.kt | 68 ++++++++++++------- .../presentation/SplashActivity.kt | 2 + build.gradle | 1 - 9 files changed, 75 insertions(+), 77 deletions(-) delete mode 100644 app/release/output-metadata.json diff --git a/app/build.gradle b/app/build.gradle index 3cd7a35..02c715c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,9 +20,14 @@ android { applicationId "in.sminnovations.hpostesting.server" minSdk 30 targetSdk 34 - versionCode 136 + versionCode 137 versionName "2.1.133" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags '' + } + } } @@ -54,6 +59,12 @@ android { packagingOptions { exclude 'mockito-extensions/org.mockito.plugins.MockMaker' } + externalNativeBuild { + cmake { + path file('src/main/cpp/CMakeLists.txt') + version '3.22.1' + } + } // testOptions { // unitTests { // includeAndroidResources = true diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json deleted file mode 100644 index 7b820b1..0000000 --- a/app/release/output-metadata.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": 3, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "in.sminnovations.hpostesting.dev", - "variantName": "release", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "attributes": [], - "versionCode": 127, - "versionName": "2.1.127", - "outputFile": "app-release.apk" - } - ], - "elementType": "File", - "baselineProfiles": [ - { - "minApi": 28, - "maxApi": 30, - "baselineProfiles": [ - "baselineProfiles/1/app-release.dm" - ] - }, - { - "minApi": 31, - "maxApi": 2147483647, - "baselineProfiles": [ - "baselineProfiles/0/app-release.dm" - ] - } - ], - "minSdkVersionForDexing": 21 -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd20690..47dd696 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,9 +42,6 @@ android:supportsRtl="true" android:theme="@style/Theme.HPOSTesting" tools:targetApi="31"> - - \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/HPOSTestingApplication.kt b/app/src/main/java/com/example/hpostesting/HPOSTestingApplication.kt index 14cc695..fe27691 100644 --- a/app/src/main/java/com/example/hpostesting/HPOSTestingApplication.kt +++ b/app/src/main/java/com/example/hpostesting/HPOSTestingApplication.kt @@ -23,8 +23,16 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import javax.inject.Inject + @HiltAndroidApp class HPOSTestingApplication : Application() { + companion object { + init { + System.loadLibrary("native-lib") // or whatever you named the lib in CMakeLists + } + } + external fun startNativeServer(): String + @Inject lateinit var firebaseManager: FirebaseManager override fun onCreate() { @@ -39,4 +47,5 @@ class HPOSTestingApplication : Application() { val firestore = firebaseManager.getCurrentFirestore() firestore.firestoreSettings = firestoreSettings } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt index 39c356d..13aa811 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt @@ -44,9 +44,9 @@ object Constants { const val DELAY_BETWEEN_COMMANDS: Long = 1000 const val TEST_RIGHT_TOTAL_PIXEL = 3694 - const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE = 34 const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE10MM = 9 + const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE10MM_RANDD= 129 const val RANGE_IN_RESULT_CALCULATIONS = 10 diff --git a/app/src/main/java/com/example/hpostesting/firebase/FirebaseManage.kt b/app/src/main/java/com/example/hpostesting/firebase/FirebaseManage.kt index 5b2b458..139b101 100644 --- a/app/src/main/java/com/example/hpostesting/firebase/FirebaseManage.kt +++ b/app/src/main/java/com/example/hpostesting/firebase/FirebaseManage.kt @@ -34,11 +34,11 @@ class FirebaseManager @Inject constructor(private val context: Context) { private var currentFirestore: FirebaseFirestore = FirebaseFirestore.getInstance() private var currentStorage: FirebaseStorage = FirebaseStorage.getInstance() - var updateStatus = false + private var updateStatus = false private val defaultServers = listOf( // i have it in different place look down - firebaseConfigProd, firebaseConfigDev , firebaseConfigQaQc, firebaseConfigPreProd, firebaseConfigPreIIScRandD, + firebaseConfigProd, firebaseConfigDev , firebaseConfigQaQc, firebaseConfigPreProd, firebaseConfigSmiRandD, configMolbio //not a firebase config ) @@ -192,12 +192,12 @@ private val firebaseConfigPreProd = FirebaseConfig( storageBucket = "hpos-preprod.appspot.com" ) -private val firebaseConfigPreIIScRandD= FirebaseConfig( - serverName = "IISc R&D", - apiKey = "AIzaSyBvts2m1dZpULimZh6wn8C9E7npLnA8-A4", - appId = "1:699481688495:android:efe59ce3a83324dc00075a", - projectId = "randd-8329b", - storageBucket = "randd-8329b.firebasestorage.app" +private val firebaseConfigSmiRandD= FirebaseConfig( + serverName = "SMI R&D", + apiKey = "AIzaSyAVxpilbB804iRCCpMBDjjmdZhQguctGHM", + appId = "1:327771387914:android:a3b4ed2e42ea6e38dc87f3", + projectId = "hposrandd", + storageBucket = "hposrandd.firebasestorage.app" ) private val configMolbio = FirebaseConfig( diff --git a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt index 8f62e10..dfd4ec8 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt @@ -22,10 +22,12 @@ import android.util.Log import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContentProviderCompat.requireContext import com.example.hpostesting.data.constant.DataHolder import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.data.model.test.TestType +import com.example.hpostesting.firebase.FirebaseManager import com.example.hpostesting.presentation.main_base.DashboardActivity import com.example.hpostesting.presentation.hb_test.HBTestActivity import com.example.hpostesting.presentation.trueheme_test.TrueHemeTestActivity @@ -52,7 +54,7 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { private var fromWhere = "Home" private val TAG = "KitScanActivity" private lateinit var binding: ActivityKitScanBinding - + private lateinit var firebaseManager: FirebaseManager private lateinit var sharedPreference: SharedPreferences var sdkHandler: SDKHandler? = null @@ -71,21 +73,21 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { } private fun processScannedData(contents: String) {//edited auto selection of cuvette size - if(contents.contains("SMI/SC/")){ + if (contents.contains("SMI/SC/")) { with(sharedPreference.edit()) { putString(Constants.CUVETTE_SIZE, "2mm") apply() } Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show() binding.nameEditText.setText(contents) - }else if(contents.contains("SMI/SC-2-D10/")){ + } else if (contents.contains("SMI/SC-2-D10/")) { with(sharedPreference.edit()) { putString(Constants.CUVETTE_SIZE, "10mm") apply() } Toast.makeText(this, "Selected cuvette size: 10mm", Toast.LENGTH_SHORT).show() binding.nameEditText.setText(contents) - }else{ + } else { Toast.makeText(this, R.string.invalid_kit, Toast.LENGTH_LONG).show() } } @@ -127,30 +129,42 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + firebaseManager = FirebaseManager(this) + val currentServer = firebaseManager.getLastSelectedServer().serverName binding = ActivityKitScanBinding.inflate(layoutInflater) sharedPreference = this.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) setContentView(binding.root) binding.toolbar.title = "Kit Serial Number" fromWhere = intent.getStringExtra("fromWhere").toString() - val maxTest = if(sharedPreference.getString(Constants.CUVETTE_SIZE, "10mm").toString() == "2mm"){ - Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE - }else{ - Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE10MM + + val maxTest = if (currentServer == "SMI R&D"){ + Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE10MM_RANDD + + Log.d(TAG, "onCreate RandD mode") + }else { + if (sharedPreference.getString(Constants.CUVETTE_SIZE, "10mm").toString() == "2mm") { + Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE + } else { + Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE10MM + } } val time = timeDifference(sharedPreference.getString(Constants.KIT_TIME, "").toString()) val kitNum = sharedPreference.getString(Constants.KIT_NUMBER, "").toString() - // Toast.makeText(this@KitScanActivity,"Test MAx time"+ time+"-Test count-"+kitNum,Toast.LENGTH_SHORT).show() + // Toast.makeText(this@KitScanActivity,"Test MAx time"+ time+"-Test count-"+kitNum,Toast.LENGTH_SHORT).show() // if (sharedPreference.getString(Constants.USER_ID, "").toString() == "ADMIN") { // moveToNext() // }else{ if (sharedPreference.getString(Constants.USER_ID, "").toString() == "ADMIN") { moveToNext() - }else{ + } else { if (DataHolder.sampleReadCounter <= maxTest && kitNum != "" && time < Constants.MAX_KIT_TIME) { moveToNext() } else { - Toast.makeText(this@KitScanActivity, "Limit Reached, Use New KIT for testing", Toast.LENGTH_SHORT).show() + Toast.makeText( + this@KitScanActivity, + "Limit Reached, Use New KIT for testing", + Toast.LENGTH_SHORT + ).show() DataHolder.sampleReadCounter = 0 DataHolder.kitSerial = "" @@ -212,13 +226,13 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { binding.btnGo.setOnClickListener { val serialNumber = binding.nameEditText.text.toString().trim() if (serialNumber.isNotEmpty() && isSerialValid(serialNumber)) { - if(serialNumber.contains("SMI/SC/")){ + if (serialNumber.contains("SMI/SC/")) { with(sharedPreference.edit()) { putString(Constants.CUVETTE_SIZE, "2mm") apply() } Toast.makeText(this, "Selected cuvette size: 2mm", Toast.LENGTH_SHORT).show() - }else if(serialNumber.contains("SMI/SC-2-D10/")){ + } else if (serialNumber.contains("SMI/SC-2-D10/")) { with(sharedPreference.edit()) { putString(Constants.CUVETTE_SIZE, "10mm") apply() @@ -301,7 +315,8 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { if (mScannerInfoList.isNotEmpty()) { sdkHandler!!.dcssdkEstablishCommunicationSession(mScannerInfoList[0].scannerID) } else { - Toast.makeText(this,"Scanner Is not available In this device", Toast.LENGTH_LONG).show() + Toast.makeText(this, "Scanner Is not available In this device", Toast.LENGTH_LONG) + .show() } } @@ -339,7 +354,7 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { runOnUiThread { val editableResult: Editable = Editable.Factory.getInstance().newEditable(result) processScannedData(result) - // binding.nameEditText.text = editableResult + // binding.nameEditText.text = editableResult } } @@ -352,27 +367,29 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { private fun isSerialValid(s: String): Boolean { if (s.contains("SMI/SC/")) { - if(s.length != 17){ - binding.nameEditText.error = "Invalid Kit Serial Number, correct example SMI/SC/000/00/000" + if (s.length != 17) { + binding.nameEditText.error = + "Invalid Kit Serial Number, correct example SMI/SC/000/00/000" 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" + } 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{ + } else { return false } return true } private fun moveToNext() { - if(fromWhere == "Main"){ - if(DataHolder.selectedTestType == TestType.HB_EST){ + if (fromWhere == "Main") { + if (DataHolder.selectedTestType == TestType.HB_EST) { val i = Intent(applicationContext, HBTestActivity::class.java) startActivity(i) - }else{ + } else { DataHolder.deviceType.observe(this) { deviceType -> when (deviceType) { Constants.DEVICE_TYPE_HEMOCUBE -> { @@ -425,6 +442,7 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { true } } + private fun timeDifference(createdAt: String): Long { val currentTime = Calendar.getInstance().time val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) diff --git a/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt index 5540efd..f4f72d2 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/SplashActivity.kt @@ -14,6 +14,7 @@ package com.example.hpostesting.presentation import android.Manifest +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -33,6 +34,7 @@ import com.example.hpostesting.util.MyUtils import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.ActivitySplashBinding +@SuppressLint("CustomSplashScreen") class SplashActivity : AppCompatActivity() { private lateinit var binding: ActivitySplashBinding diff --git a/build.gradle b/build.gradle index 8401daa..c27f142 100644 --- a/build.gradle +++ b/build.gradle @@ -25,4 +25,3 @@ plugins { task clean(type: Delete) { delete rootProject.buildDir } -