diff --git a/app/build.gradle b/app/build.gradle index c30314c..d755fd5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -170,5 +170,6 @@ dependencies { implementation 'io.nats:jnats:2.11.4' implementation 'org.apache.commons:commons-math3:3.6.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17' + implementation 'androidx.security:security-crypto:1.1.0-alpha03' } \ No newline at end of file diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 14fde68..bd0f6e5 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -4,15 +4,15 @@ "type": "APK", "kind": "Directory" }, - "applicationId": "in.sminnovations.hpostesting.quality", + "applicationId": "in.sminnovations.hpostesting.iocl", "variantName": "release", "elements": [ { "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 101, - "versionName": "2.1.101", + "versionCode": 124, + "versionName": "2.1.124", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 858168f..1d17348 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + @@ -34,12 +37,29 @@ android:supportsRtl="true" android:theme="@style/Theme.HPOSTesting" tools:targetApi="31"> + + + + + + + + - - - - - - - + + + + + + + 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 b69fd0d..e2761c2 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 @@ -37,7 +37,7 @@ object Constants { const val TEST_RIGHT_TOTAL_PIXEL = 3694 - const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE = 40 + const val MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE = 35 const val RANGE_IN_RESULT_CALCULATIONS = 10 @@ -78,178 +78,6 @@ object Constants { // jig const val NAVIGATE_TO_TEST_JIG_DIRECTLY = false - val STATICID = listOf( - "FACTORY", - "ADMIN", - "PQUSER", - "QCUSER", - "VIZ-1000-0004", - "VIZ-1000-0005", - "VIZ-1000-0006", - "HC-V1-001", - "HC-V1-002", - "HC-V1-003", - "HC-V1-004", - "HC-V1-005", - "HC-V1-006", - "HC-V1-007", - "HC-V1-008", - "HC-V1-009", - "HC-V1-010", - "HC-V1-011", - "HC-V1-012", - "HC-V1-013", - "HC-V1-014", - "HC-V1-015", - "HC-V1-016", - "HC-V1-017", - "HC-V1-018", - "HC-V1-019", - "HC-V1-020", - "HCV-000-1015", - "HCV-000-3002", - "HCV-000-3003", - "HCV-000-3004", - "HCV-000-3005", - "HCV-000-3006", - "HCV-000-3007", - "HCV-000-3008", - "HCV-000-3009", - "HCV-000-3010", - "HCV-000-3011", - "HCV-000-3012", - "HCV-000-3013", - "HCV-000-3014", - "HCV-000-3015", - "HCV-000-3016", - "HCV-000-3017", - "HCV-000-3018", - "HCV-000-3019", - "HCV-000-3020", - "HCV-000-3021", - "HCV-000-3022", - "HCV-000-3023", - "HCV-000-3024", - "HCV-000-3025", - "HCV-000-3026", - "HCV-000-3027", - "HCV-000-3028", - "HCV-000-3029", - "HCV-000-3030", - "HPP1-0124-0001", - "HPP1-0124-0002", - "HPP1-0124-0003", - "HPP1-0124-0004", - "HPP1-0124-0005", - "HPP1-0124-0006", - "HPP1-0124-0007", - "HPP1-0124-0008", - "HPP1-0124-0009", - "HPP1-0124-0010", - "HPP1-0124-0011", - "HPP1-0124-0012", - "HPP1-0124-0013", - "HPP1-0124-0014", - "HPP1-0124-0015", - "HPP1-0124-0016", - "HPP1-0124-0017", - "HPP1-0124-0018", - "HPP1-0124-0019", - "HPP1-0124-0020", - "HPP1-0124-0021", - "HPP1-0124-0022", - "HPP1-0124-0023", - "HPP1-0124-0024", - "HPP1-0124-0025", - "HPP1-0124-0026", - "HPP1-0124-0027", - "HPP1-0124-0028", - "HPP1-0124-0029", - "HPP1-0124-0030", - "HPP1-0124-0031", - "HPP1-0124-0032", - "HPP1-0124-0033", - "HPP1-0124-0034", - "HPP1-0124-0035", - "HPP1-0124-0036", - "HPP1-0124-0037", - "HPP1-0124-0038", - "HPP1-0124-0039", - "HPP1-0124-0040", - "HPP1-0124-0041", - "HPP1-0124-0042", - "HPP1-0124-0043", - "HPP1-0124-0044", - "HPP1-0124-0045", - "HPP1-0124-0046", - "HPP1-0124-0047", - "HPP1-0124-0048", - "HPP1-0124-0049", - "HPP1-0124-0050", - "HCV-001-0001", - "HCV-001-0002", - "HCV-001-0003", - "HCV-001-0004", - "HCV-001-0005", - "HCV-001-0006", - "HCV-001-0007", - "HCV-001-0008", - "HCV-001-0009", - "HCV-001-0010", - "HCV-001-0011", - "HCV-001-0012", - "HCV-001-0013", - "HCV-001-0014", - "HCV-001-0015", - "HCV-001-0016", - "HCV-001-0017", - "HCV-001-0018", - "HCV-001-0019", - "HCV-001-0020", - "HCV-001-0021", - "HCV-001-0022", - "HCV-001-0023", - "HCV-001-0024", - "HCV-001-0025", - "HCV-001-0026", - "HCV-001-0027", - "HCV-001-0028", - "HCV-001-0029", - "HCV-001-0030", - "HCV-001-0031", - "HCV-001-0032", - "HCV-001-0033", - "HCV-001-0034", - "HCV-001-0003", - "HCV-001-0035", - "HCV-001-0036", - "HCV-001-0037", - "HCV-001-0038", - "HCV-001-0039", - "HCV-001-0040", - "HCV-001-0041", - "HCV-001-0042", - "HCV-001-0043", - "HCV-001-0044", - "HCV-001-0045", - "HCV-001-0046", - "HCV-001-0047", - "HCV-001-0048", - "HCV-001-0049", - "HCV-001-0050", - "HCV-000-6001", - "HCV-000-6002", - "HCV-000-6003", - "HCV-000-6004", - "HCV-000-6005", - "HCV-000-6006", - "HCV-000-6007", - "HCV-000-6008", - "HCV-000-6009", - "HCV-000-6010", - ) - - const val password = "SMI@12345" const val KIT_NUMBER = "KitNumber" const val KIT_COUNT = "KitCount" @@ -1763,4 +1591,178 @@ object Constants { const val positiveForSickleCellMax2mm = 0.39 const val sickleCellDiseaseMin2mm = 0.39 const val sickleCellDiseaseMax2mm = 1.0 + + + + // val STATICID = listOf( +// "FACTORY", +// "ADMIN", +// "PQUSER", +// "QCUSER", +// "VIZ-1000-0004", +// "VIZ-1000-0005", +// "VIZ-1000-0006", +// "HC-V1-001", +// "HC-V1-002", +// "HC-V1-003", +// "HC-V1-004", +// "HC-V1-005", +// "HC-V1-006", +// "HC-V1-007", +// "HC-V1-008", +// "HC-V1-009", +// "HC-V1-010", +// "HC-V1-011", +// "HC-V1-012", +// "HC-V1-013", +// "HC-V1-014", +// "HC-V1-015", +// "HC-V1-016", +// "HC-V1-017", +// "HC-V1-018", +// "HC-V1-019", +// "HC-V1-020", +// "HCV-000-1015", +// "HCV-000-3002", +// "HCV-000-3003", +// "HCV-000-3004", +// "HCV-000-3005", +// "HCV-000-3006", +// "HCV-000-3007", +// "HCV-000-3008", +// "HCV-000-3009", +// "HCV-000-3010", +// "HCV-000-3011", +// "HCV-000-3012", +// "HCV-000-3013", +// "HCV-000-3014", +// "HCV-000-3015", +// "HCV-000-3016", +// "HCV-000-3017", +// "HCV-000-3018", +// "HCV-000-3019", +// "HCV-000-3020", +// "HCV-000-3021", +// "HCV-000-3022", +// "HCV-000-3023", +// "HCV-000-3024", +// "HCV-000-3025", +// "HCV-000-3026", +// "HCV-000-3027", +// "HCV-000-3028", +// "HCV-000-3029", +// "HCV-000-3030", +// "HPP1-0124-0001", +// "HPP1-0124-0002", +// "HPP1-0124-0003", +// "HPP1-0124-0004", +// "HPP1-0124-0005", +// "HPP1-0124-0006", +// "HPP1-0124-0007", +// "HPP1-0124-0008", +// "HPP1-0124-0009", +// "HPP1-0124-0010", +// "HPP1-0124-0011", +// "HPP1-0124-0012", +// "HPP1-0124-0013", +// "HPP1-0124-0014", +// "HPP1-0124-0015", +// "HPP1-0124-0016", +// "HPP1-0124-0017", +// "HPP1-0124-0018", +// "HPP1-0124-0019", +// "HPP1-0124-0020", +// "HPP1-0124-0021", +// "HPP1-0124-0022", +// "HPP1-0124-0023", +// "HPP1-0124-0024", +// "HPP1-0124-0025", +// "HPP1-0124-0026", +// "HPP1-0124-0027", +// "HPP1-0124-0028", +// "HPP1-0124-0029", +// "HPP1-0124-0030", +// "HPP1-0124-0031", +// "HPP1-0124-0032", +// "HPP1-0124-0033", +// "HPP1-0124-0034", +// "HPP1-0124-0035", +// "HPP1-0124-0036", +// "HPP1-0124-0037", +// "HPP1-0124-0038", +// "HPP1-0124-0039", +// "HPP1-0124-0040", +// "HPP1-0124-0041", +// "HPP1-0124-0042", +// "HPP1-0124-0043", +// "HPP1-0124-0044", +// "HPP1-0124-0045", +// "HPP1-0124-0046", +// "HPP1-0124-0047", +// "HPP1-0124-0048", +// "HPP1-0124-0049", +// "HPP1-0124-0050", +// "HCV-001-0001", +// "HCV-001-0002", +// "HCV-001-0003", +// "HCV-001-0004", +// "HCV-001-0005", +// "HCV-001-0006", +// "HCV-001-0007", +// "HCV-001-0008", +// "HCV-001-0009", +// "HCV-001-0010", +// "HCV-001-0011", +// "HCV-001-0012", +// "HCV-001-0013", +// "HCV-001-0014", +// "HCV-001-0015", +// "HCV-001-0016", +// "HCV-001-0017", +// "HCV-001-0018", +// "HCV-001-0019", +// "HCV-001-0020", +// "HCV-001-0021", +// "HCV-001-0022", +// "HCV-001-0023", +// "HCV-001-0024", +// "HCV-001-0025", +// "HCV-001-0026", +// "HCV-001-0027", +// "HCV-001-0028", +// "HCV-001-0029", +// "HCV-001-0030", +// "HCV-001-0031", +// "HCV-001-0032", +// "HCV-001-0033", +// "HCV-001-0034", +// "HCV-001-0003", +// "HCV-001-0035", +// "HCV-001-0036", +// "HCV-001-0037", +// "HCV-001-0038", +// "HCV-001-0039", +// "HCV-001-0040", +// "HCV-001-0041", +// "HCV-001-0042", +// "HCV-001-0043", +// "HCV-001-0044", +// "HCV-001-0045", +// "HCV-001-0046", +// "HCV-001-0047", +// "HCV-001-0048", +// "HCV-001-0049", +// "HCV-001-0050", +// "HCV-000-6001", +// "HCV-000-6002", +// "HCV-000-6003", +// "HCV-000-6004", +// "HCV-000-6005", +// "HCV-000-6006", +// "HCV-000-6007", +// "HCV-000-6008", +// "HCV-000-6009", +// "HCV-000-6010", +// ) +// } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/constant/DataHolder.kt b/app/src/main/java/com/example/hpostesting/data/constant/DataHolder.kt index f86f27a..29b88b3 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/DataHolder.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/DataHolder.kt @@ -27,6 +27,7 @@ object DataHolder { var isAppFolderCreated = false var appFolderPath = "" var isReferenceTaken = false + var isToken = false var sampleReadCounter = 0 var deviceConstant: TestRightDeviceConstants? = null diff --git a/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt b/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt index ff07fad..4664153 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/HemoCubeCommands.kt @@ -30,4 +30,5 @@ enum class HemoCubeCommands(val command: String) { FORTH_GAIN_COMMAND("W\r"), CHECK_CUVETTE_COMMAND("L\r"), CHECK_TEMP_COMMAND("A\r"), + J_COMMAND("J\r"), } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt b/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt index 801a948..bc1b3bb 100644 --- a/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt +++ b/app/src/main/java/com/example/hpostesting/data/dao/MyDataBase.kt @@ -23,7 +23,7 @@ import com.example.hpostesting.data.model.patient.UserData @Database( entities = [UserData::class, HemoCubeTestData::class, DeviceData::class, BufferCheckData::class], - version = 33, + version = 34, exportSchema = false ) @TypeConverters(Converters::class) 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 ed06ade..15e8515 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/KitScanActivity.kt @@ -67,8 +67,24 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { } } - private fun processScannedData(contents: String) { - binding.nameEditText.setText(contents) + private fun processScannedData(contents: String) {//edited auto selection of cuvette size + if(contents.contains("SMI/SC/")){ + 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 if(contents.contains("SC-2-D10/")){ + 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{ + Toast.makeText(this, R.string.invalid_kit, Toast.LENGTH_LONG).show() + } } override fun attachBaseContext(newBase: Context?) { @@ -112,8 +128,9 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate { binding = ActivityKitScanBinding.inflate(layoutInflater) sharedPreference = this.getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) setContentView(binding.root) + binding.toolbar.title = "Kit Serial Number" - if (DataHolder.sampleReadCounter <= Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE && DataHolder.isReferenceTaken) { + if (DataHolder.sampleReadCounter <= Constants.MAXIMUM_TEST_ALLOWED_BEFORE_REFERENCE && DataHolder.isToken) { DataHolder.selectedTest!!.kitSerial = DataHolder.kitSerial moveToNext() } diff --git a/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt index 215c942..6d1ce11 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/MainActivity.kt @@ -75,7 +75,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - + binding.myToolbar.title = "Test Type" setSupportActionBar(binding.myToolbar) setupListeners() diff --git a/app/src/main/java/com/example/hpostesting/presentation/adapter/OfflineUserListAdapter.kt b/app/src/main/java/com/example/hpostesting/presentation/adapter/OfflineUserListAdapter.kt index 8c4fd16..27916fc 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/adapter/OfflineUserListAdapter.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/adapter/OfflineUserListAdapter.kt @@ -72,7 +72,7 @@ class OfflineUserListAdapter(private val view: View, private val batLevel: Int,p override fun onBindViewHolder(holder: OfflineUserListViewHolder, position: Int) { val userList = differ.currentList[position] holder.binding.apply { - userID.text = "User ID: ${userList._id}" + userID.text = "Sample ID: ${userList._id}" bloodGroup.text = "Blood group: ${userList.bloodGroup}" time.text = "Time: ${isBetween15And30Minutes(userList.incubationTime)} \n Started at: ${ SimpleDateFormat("HH:mm:ss").format( diff --git a/app/src/main/java/com/example/hpostesting/presentation/autodac/AutoDacFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/autodac/AutoDacFragment.kt index b42e956..57dbe66 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/autodac/AutoDacFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/autodac/AutoDacFragment.kt @@ -16,6 +16,7 @@ package com.example.hpostesting.presentation.autodac import android.content.Context import android.content.SharedPreferences import android.os.Bundle +import android.text.method.ScrollingMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -36,13 +37,14 @@ import java.util.Calendar import java.util.Locale class AutoDacFragment : Fragment() { - + private var readClick = false + private var testStatusCode = 0.0 private lateinit var binding: FragmentAutoDacBinding private val autoDacViewModel: AutoDacViewModel by activityViewModels() private lateinit var sharedPreferences: SharedPreferences private var currentDeviceData: DeviceData? = null private var resultData: String = "" - private val messages = MutableLiveData() + // private val messages = MutableLiveData() private var startListening = MutableLiveData(false) override fun onCreateView( @@ -64,14 +66,23 @@ class AutoDacFragment : Fragment() { binding.btnSubmit.visibility = View.GONE listenToHemoCube() getDeviceId() + binding.tvSubtitle4.movementMethod = ScrollingMovementMethod() binding.btnSubmit.setOnClickListener { + testStatusCode = 0.5 binding.btnSubmit.visibility = View.GONE - runAutoDacCommand() + runJCommand() } binding.btnReadDac.setOnClickListener { + readClick = true binding.btnReadDac.visibility = View.GONE - readCurrentDACValuesCommand() + runECommand() } + if (sharedPreferences.getString(Constants.USER_ID, "").toString() == "ADMIN") { + binding.btnReadDac.visibility = View.VISIBLE + }else{ + binding.btnReadDac.visibility = View.GONE + } + } private fun observeViewModel() { @@ -80,7 +91,7 @@ class AutoDacFragment : Fragment() { currentDeviceData = it } - messages.observe(viewLifecycleOwner) { + autoDacViewModel.messages.observe(viewLifecycleOwner) { binding.tvSubtitle4.text = it } @@ -114,8 +125,33 @@ class AutoDacFragment : Fragment() { } }) } + private fun runJCommand() { + autoDacViewModel.progressBar.postValue(true) + (activity as AutoDacActivity).mService.sendAndListenToHemoCube( + HemoCubeCommands.J_COMMAND, + object : UsbServiceListener { + override fun onUsbRead(data: ByteArray?) { + } - private fun runAutoDacCommand() { + override fun onUsbError(e: Exception?) { + autoDacViewModel.progressBar.postValue(false) + } + }) + } + private fun runDCommand() { + autoDacViewModel.progressBar.postValue(true) + (activity as AutoDacActivity).mService.sendAndListenToHemoCube( + HemoCubeCommands.DIAGNOSTICS_COMMAND, + object : UsbServiceListener { + override fun onUsbRead(data: ByteArray?) { + } + + override fun onUsbError(e: Exception?) { + autoDacViewModel.progressBar.postValue(false) + } + }) + } + private fun runCCommand() { autoDacViewModel.progressBar.postValue(true) (activity as AutoDacActivity).mService.sendAndListenToHemoCube( HemoCubeCommands.AUTO_DAC_COMMAND, @@ -128,6 +164,33 @@ class AutoDacFragment : Fragment() { } }) } + private fun runGCommand() { + autoDacViewModel.progressBar.postValue(true) + (activity as AutoDacActivity).mService.sendAndListenToHemoCube( + HemoCubeCommands.SET_AUTO_DAC_TO_EPROM_COMMAND, + object : UsbServiceListener { + override fun onUsbRead(data: ByteArray?) { + } + + override fun onUsbError(e: Exception?) { + autoDacViewModel.progressBar.postValue(false) + } + }) + } + private fun runECommand() { + autoDacViewModel.progressBar.postValue(true) + (activity as AutoDacActivity).mService.sendAndListenToHemoCube( + HemoCubeCommands.LOAD_DAC_VALUES, + object : UsbServiceListener { + override fun onUsbRead(data: ByteArray?) { + } + + override fun onUsbError(e: Exception?) { + autoDacViewModel.progressBar.postValue(false) + } + }) + } + private fun setAutoDacValuesCommand() { autoDacViewModel.progressBar.postValue(true) @@ -168,10 +231,13 @@ class AutoDacFragment : Fragment() { override fun onUsbRead(data: ByteArray?) { data?.let { val stringData = String(it) - autoDacViewModel.messages.postValue(stringData) fullReadOutput.append(stringData) resultData += stringData - binding.tvSubtitle4.text = resultData + if (sharedPreferences.getString(Constants.USER_ID, "").toString() == "ADMIN") { + autoDacViewModel.messages.postValue(resultData) + } + + // binding.tvSubtitle4.text = resultData if (stringData.contains("SN")) { val slData = stringData.split(" ") if (slData.size > 1) { @@ -186,9 +252,47 @@ class AutoDacFragment : Fragment() { } } } + if (resultData.contains("#JC") && testStatusCode < 1.0) { + testStatusCode = 1.1 + runDCommand() + } + if (resultData.contains("#DC") && testStatusCode < 1.2) { + testStatusCode = 1.3 + runCCommand() + } + if (resultData.contains("#GC") && testStatusCode < 1.6) { + testStatusCode = 1.7 + runECommand() + } + if (resultData.contains("#EC") && testStatusCode < 1.8) { + testStatusCode = 1.9 + if(resultData.contains("#CS")){ + val pattern = "#CS(.*?)#CC".toRegex() + val matchResult = pattern.find(resultData) + resultData = matchResult?.groups?.get(1)?.value?.trim().toString() + } + resultData += "Calibration Completed\n" + autoDacViewModel.messages.postValue(resultData) + activity?.runOnUiThread { + Toast.makeText(requireActivity(), "Calibration completed", Toast.LENGTH_LONG).show() + binding.ivCheck.visibility = View.VISIBLE + } + } + if (resultData.contains("#EC") && readClick && testStatusCode < 2.1) { + testStatusCode = 2.2 + readCurrentDACValuesCommand() + } + if (resultData.contains("#CC") && testStatusCode < 1.4) { + testStatusCode = 1.5 + if(validateDacValues()){ + setAutoDacValuesCommand() + }else{ + activity?.runOnUiThread { + Toast.makeText(requireActivity(), "use fresh buffer with clean cuvette and restart", Toast.LENGTH_LONG).show() + binding.btnReadDac.visibility = View.GONE + } + } - if (resultData.contains("#CC")) { - setAutoDacValuesCommand() autoDacViewModel.addAutoDacDataToDb( DiagnosticsData( @@ -212,9 +316,7 @@ class AutoDacFragment : Fragment() { ).format(Calendar.getInstance().time) ) ) - activity?.runOnUiThread { - binding.ivCheck.visibility = View.VISIBLE - } + } if (resultData.contains("#WC")) { @@ -231,6 +333,11 @@ class AutoDacFragment : Fragment() { } } + private fun validateDacValues(): Boolean { + + return true + } + fun parseData(inputData: List): List> { val pattern = Regex("([A-Z]+)\\s(\\d+)") val parsedData = mutableListOf>() diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt index ab67eb9..72fd714 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/GalleryFragment.kt @@ -28,6 +28,7 @@ import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.presentation.autodac.AutoDacActivity import com.example.hpostesting.presentation.buffercheck.HemocubeBufferCheckActivity import com.example.hpostesting.presentation.calibration.CalibrationActivity +import com.example.hpostesting.presentation.dashboard.ui.PasswordResetActivity import com.example.hpostesting.presentation.deviceinfo.DeviceActivity import com.example.hpostesting.presentation.deviceprovision.DeviceProvisionActivity import com.example.hpostesting.presentation.diagnostics.DiagnosticsActivity @@ -86,9 +87,11 @@ class GalleryFragment : Fragment() { binding.btnUsbTerminal.visibility = View.VISIBLE binding.btnSubmit.visibility = View.VISIBLE binding.btnDeviceInfo.visibility = View.VISIBLE + binding.btnResetPassword.visibility = View.VISIBLE }else{ + binding.btnResetPassword.visibility = View.GONE binding.btnDeviceProvision.visibility = View.GONE - binding.btnAutoDac.visibility = View.GONE + binding.btnAutoDac.visibility = View.VISIBLE binding.btnDeviceProvision.visibility = View.GONE binding.btnDiagnostics.visibility = View.VISIBLE binding.btnFiles.visibility = View.GONE @@ -99,6 +102,9 @@ class GalleryFragment : Fragment() { binding.btnDeviceInfo.visibility = View.VISIBLE } + binding.btnResetPassword.setOnClickListener{ + startActivity(Intent(requireContext(), PasswordResetActivity::class.java)) + } binding.btnDeviceProvision.setOnClickListener { startActivity(Intent(requireContext(), DeviceProvisionActivity::class.java)) } diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index e0fe2ea..264295c 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -37,6 +37,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.annotation.RequiresApi +import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.FileProvider import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -168,17 +169,17 @@ class HomeFragment : Fragment() { .show() } } - binding.btnLogout.setOnClickListener { - logoutUser(requireContext()) - } +// binding.btnLogout.setOnClickListener { +// logoutUser(requireContext()) +// } binding.btnLogout1.setOnClickListener { logoutUser(requireContext()) } - binding.uploadData.setOnClickListener { -// showUploadDialog(requireContext()) - } +// binding.uploadData.setOnClickListener { +//// showUploadDialog(requireContext()) +// } hemoCubeViewModel.allUserData.observe(viewLifecycleOwner) { userData -> if (sharedPreference.getString(Constants.USER_ID, "").toString() == "ADMIN") { val btnSaveLocalVisibility = @@ -203,15 +204,15 @@ class HomeFragment : Fragment() { } - binding.btnNewKit.setOnClickListener { - with(sharedPreference.edit()) { - putString(Constants.KIT_NUMBER, "") - putInt(Constants.KIT_COUNT, 0) - apply() - } - startActivity(Intent(requireContext(), KitScanActivity::class.java)) - // requireActivity().finish() - } +// binding.btnNewKit.setOnClickListener { +// with(sharedPreference.edit()) { +// putString(Constants.KIT_NUMBER, "") +// putInt(Constants.KIT_COUNT, 0) +// apply() +// } +// startActivity(Intent(requireContext(), KitScanActivity::class.java)) +// // requireActivity().finish() +// } binding.btnNewKitoffline.setOnClickListener { @@ -239,18 +240,20 @@ class HomeFragment : Fragment() { checkNetworkStatus() } - @RequiresApi(Build.VERSION_CODES.P) private fun checkNetworkStatus() { hemoCubeViewModel.networkStatusLiveData.observe(viewLifecycleOwner) { isConnected -> // Toast.makeText(requireContext(),"connected"+isConnected+wasConnected, Toast.LENGTH_SHORT).show() if (isConnected != wasConnected) { if (isConnected) { - binding.internetAvailableCL.visibility = View.VISIBLE - binding.internetNotAvailableCL.visibility = View.GONE - binding.pendingTest.visibility = View.VISIBLE - loadUserData() - setSearch() + binding.tvTitleNoInternet.text = "Please enter the user id and select blood group to start the test." + //binding.internetAvailableCL.visibility = View.VISIBLE + binding.internetIcon.setImageDrawable(AppCompatResources.getDrawable(requireContext(),R.drawable.internet)) + binding.internetNotAvailableCL.visibility = View.VISIBLE + binding.pendingTest.visibility = View.GONE + setUserId() + // loadUserData() + // setSearch() checkForLocalDBData() if (Constants.MOLBIO_INTEGRATION) { checkForTokenAndUpdate() @@ -326,7 +329,9 @@ class HomeFragment : Fragment() { hemoCubeViewModel.sendDataToFirebase() } else { - binding.internetAvailableCL.visibility = View.GONE + binding.tvTitleNoInternet.text = getString(R.string.internet_not_available_please_enter_the_user_id_manually) + // binding.internetAvailableCL.visibility = View.GONE + binding.internetIcon.setImageDrawable(AppCompatResources.getDrawable(requireContext(),R.drawable.off)) binding.pendingTest.visibility = View.GONE binding.internetNotAvailableCL.visibility = View.VISIBLE setUserId() @@ -334,7 +339,9 @@ class HomeFragment : Fragment() { wasConnected = isConnected }else{ if(!wasConnected){ - binding.internetAvailableCL.visibility = View.GONE + binding.internetIcon.setImageDrawable(AppCompatResources.getDrawable(requireContext(),R.drawable.off)) + binding.tvTitleNoInternet.text = getString(R.string.internet_not_available_please_enter_the_user_id_manually) + // binding.internetAvailableCL.visibility = View.GONE binding.pendingTest.visibility = View.GONE binding.internetNotAvailableCL.visibility = View.VISIBLE setUserId() @@ -834,7 +841,7 @@ class HomeFragment : Fragment() { requireActivity() ) }!! - binding.rvOrder.adapter = rvAdapter + // binding.rvOrder.adapter = rvAdapter rvAdapter.startListening() } catch (e: Exception) { @@ -903,50 +910,54 @@ class HomeFragment : Fragment() { requireActivity() ) }!! - binding.rvOrder.adapter = rvAdapter + // binding.rvOrder.adapter = rvAdapter rvAdapter.startListening() userSearchTrace.stop() } - private fun setSearch() { - binding.searchProduct.setOnQueryTextListener(object : - androidx.appcompat.widget.SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String?): Boolean { - return if (!query.isNullOrEmpty()) { - val field = when { - binding.userIdRadioButton.isChecked -> "_id" - binding.abhaIdRadioButton.isChecked -> "abhaId" - binding.aadharIdRadioButton.isChecked -> "aadharId" - else -> null - } - - field?.let { getData(query, it) } - false - - } else { - loadUserData() - false - } - } - - override fun onQueryTextChange(query: String?): Boolean { - return if (!query.isNullOrEmpty()) { - val field = when { - binding.userIdRadioButton.isChecked -> "_id" - binding.abhaIdRadioButton.isChecked -> "abhaId" - binding.aadharIdRadioButton.isChecked -> "aadharId" - else -> null - } - field?.let { getData(query, it) } - false - } else { - loadUserData() - false - } - } - }) - } +// private fun setSearch() { +// binding.searchProduct.setOnQueryTextListener(object : +// androidx.appcompat.widget.SearchView.OnQueryTextListener { +// override fun onQueryTextSubmit(query: String?): Boolean { +// return if (!query.isNullOrEmpty()) { +// val field = when { +// binding.userIdRadioButton.isChecked -> "_id" +// binding.abhaIdRadioButton.isChecked -> "abhaId" +// binding.aadharIdRadioButton.isChecked -> "aadharId" +// else -> null +// } +// +// field?.let { +// //getData(query, it) } +// } +// false +// +// } else { +// // loadUserData() +// false +// } +// } +// +// override fun onQueryTextChange(query: String?): Boolean { +// return if (!query.isNullOrEmpty()) { +// val field = when { +// binding.userIdRadioButton.isChecked -> "_id" +// binding.abhaIdRadioButton.isChecked -> "abhaId" +// binding.aadharIdRadioButton.isChecked -> "aadharId" +// else -> null +// } +// field?.let { +// //getData(query, it) +// } +// false +// } else { +// // loadUserData() +// false +// } +// } +// }) +// } private fun checkForLocalDBData() { // viewModel.allUserData.observe(viewLifecycleOwner) { userDataList -> @@ -963,7 +974,7 @@ class HomeFragment : Fragment() { hemoCubeViewModel.allKitTestData.observe(viewLifecycleOwner) { bufferData -> val uploadDataVisibility = if (bufferData.any { !it.localFlag }) View.VISIBLE else View.GONE - binding.uploadData.visibility = uploadDataVisibility + // binding.uploadData.visibility = uploadDataVisibility } } diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/LoginFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/LoginFragment.kt index 8170264..daa8e9a 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/LoginFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/LoginFragment.kt @@ -13,15 +13,16 @@ package com.example.hpostesting.presentation.dashboard.ui +import com.example.hpostesting.util.SecureStorage +import android.accounts.Account +import android.accounts.AccountManager import android.annotation.SuppressLint import android.content.Context -import android.content.Context.WIFI_SERVICE import android.content.SharedPreferences import android.location.Location import android.location.LocationListener import android.location.LocationManager import android.net.ConnectivityManager -import android.net.wifi.WifiManager import android.os.Build import android.os.Bundle import android.util.Log @@ -30,23 +31,19 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.annotation.RequiresApi -import androidx.core.content.ContextCompat.getSystemService import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.example.hpostesting.data.constant.Constants +import com.example.hpostesting.util.AppInitializer import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.FragmentLoginBinding -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import java.net.HttpURLConnection -import java.net.URL -import java.util.Scanner class LoginFragment : Fragment() { var latitude = 0.0 var longitude = 0.0 + private lateinit var accountManager: AccountManager + private lateinit var secureStorage: SecureStorage var TAG = "LoginFragmentCheck" private var _binding: FragmentLoginBinding? = null private val binding get() = _binding!! @@ -58,6 +55,11 @@ class LoginFragment : Fragment() { _binding = FragmentLoginBinding.inflate(inflater, container, false) sharedPreference = requireContext().getSharedPreferences("HEMOCUBE", Context.MODE_PRIVATE) + accountManager = AccountManager.get(requireActivity()) + secureStorage = SecureStorage(requireActivity()) + + // Initialize user roles and credentials if not already done + AppInitializer.initialize(requireActivity()) return binding.root } @@ -75,9 +77,8 @@ class LoginFragment : Fragment() { binding.btnLogin.setOnClickListener { // Toast.makeText(requireContext(), "$latitude/$longitude",Toast.LENGTH_SHORT).show() - - val loginId = binding.loginId.text.toString() - val password = binding.password.text.toString() + val loginId = binding.loginId.text.toString().trim() + val password = binding.password.text.toString().trim() if (loginId.isNotBlank() && password.isNotBlank()) { performLogin(loginId, password) @@ -104,21 +105,52 @@ class LoginFragment : Fragment() { } private fun performLogin(loginId: String, password: String) { - val matchingId = Constants.STATICID.firstOrNull { it == loginId } - if (matchingId != null) { - if (password == Constants.password) { - saveUserId(loginId) - navigateToHomeFragment() - return - } else { - Log.d("LoginFragment","wrong password") - Toast.makeText(requireContext(), R.string.wrong_password, Toast.LENGTH_SHORT).show() - } + if (validateCredentials(loginId, password)) { + addAccount(loginId, password) + val role = getRoleForUser(loginId) + saveUserId(role) + navigateToHomeFragment() + return + } else { + Toast.makeText(requireActivity(), "Invalid credentials", Toast.LENGTH_SHORT).show() } - Log.d("LoginFragment","wrong password") - Toast.makeText(requireContext(), R.string.wrong_user_id, Toast.LENGTH_SHORT).show() +// val matchingId = Constants.STATICID.firstOrNull { it == loginId } +// if (matchingId != null) { +// if (password == Constants.password) { +// saveUserId(loginId) +// navigateToHomeFragment() +// return +// } else { +// Log.d("LoginFragment","wrong password") +// Toast.makeText(requireContext(), R.string.wrong_password, Toast.LENGTH_SHORT).show() +// } +// } + // Log.d("LoginFragment","wrong password") + // Toast.makeText(requireContext(), R.string.wrong_user_id, Toast.LENGTH_SHORT).show() + } + private fun getRoleForUser(username: String): String { + // Replace this with your actual logic to determine the role for the user + return when (username) { + "FACTORY" -> "FACTORY" + "ADMIN" -> "ADMIN" + "PQUSER" -> "PQUSER" + "QCUSER" -> "QCUSER" + else -> "HPOSUSER" + } + } + private fun validateCredentials(username: String, password: String): Boolean { + var storedPassword = secureStorage.getPassword() + if(username == "ADMIN"){ + storedPassword = secureStorage.getAdminPassword() + } + return storedPassword != null && + password == storedPassword && + (username == "HPOSUSER" || username == "ADMIN" || username == "FACTORY" || username == "PQUSER" || username == "QCUSER") + } + private fun addAccount(username: String, password: String) { + val account = Account(username, "com.example.account") + accountManager.addAccountExplicitly(account, password, null) } - private fun saveUserId(userId: String) { with(sharedPreference.edit()) { putString(Constants.USER_ID, userId) diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/PasswordResetActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/PasswordResetActivity.kt new file mode 100644 index 0000000..d7f65b0 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/ui/PasswordResetActivity.kt @@ -0,0 +1,42 @@ +package com.example.hpostesting.presentation.dashboard.ui + +import com.example.hpostesting.util.SecureStorage +import android.os.Bundle +import android.widget.Button +import android.widget.EditText +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import `in`.sminnovations.hpostesting.R + +class PasswordResetActivity : AppCompatActivity() { + + private lateinit var editTextNewPassword: EditText + private lateinit var buttonResetPassword: Button + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_password_reset) + + editTextNewPassword = findViewById(R.id.editTextNewPassword) + buttonResetPassword = findViewById(R.id.buttonResetPassword) + + buttonResetPassword.setOnClickListener { + val newPassword = editTextNewPassword.text.toString().trim() + if (newPassword.isNotEmpty()) { + resetPassword(newPassword) + } else { + Toast.makeText(this, "Please enter a new password", Toast.LENGTH_SHORT).show() + } + } + } + + private fun resetPassword(newPassword: String) { + // Implement password reset logic here + // For example, you can store the new password securely + // and update it in the authentication system + val secureStorage = SecureStorage(this) + secureStorage.storePassword(newPassword) + Toast.makeText(this, "Password reset successfully", Toast.LENGTH_SHORT).show() + finish() + } +} diff --git a/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceActivity.kt index 7bf5457..b8bc962 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceActivity.kt @@ -29,6 +29,7 @@ import android.os.Bundle import android.os.IBinder import android.util.Log import android.view.Menu +import android.view.MenuItem import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -105,8 +106,7 @@ class DeviceActivity : AppCompatActivity(), DeviceCommunicationHandler { super.onCreate(savedInstanceState) binding = ActivityDeviceBinding.inflate(layoutInflater) setContentView(binding.root) -// setSupportActionBar(binding.myToolbar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) + binding.myToolbar.title = "Device Information" setupListener() connectUsb(false) } diff --git a/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceFragment.kt index 6dc688e..e67a9a8 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/deviceinfo/DeviceFragment.kt @@ -141,7 +141,8 @@ class DeviceFragment : Fragment() { val lines = resultData.split("\n") var temp = lines[2] val temp1 = resultData.substringAfter("#AS").substringBefore("#AC") - binding.tvSubtitleNew.text = "Device ID : "+hardwareId+"\nTemperature : $temp\n"+temp1 + binding.tvSubtitleNew.text = + "Device ID : $hardwareId\nTemperature : $temp\n$temp1" } } diff --git a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt index 57c6860..c563b60 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/diagnostics/DiagnosticsFragment.kt @@ -30,13 +30,10 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.MutableLiveData import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.HemoCubeCommands -import com.example.hpostesting.data.constant.TestStatus import com.example.hpostesting.data.model.devicediagnostics.AdditionalDetails import com.example.hpostesting.data.model.devicediagnostics.DeviceDiagnosticsRequest import com.example.hpostesting.data.model.diagnostics.DiagnosticsData import com.example.hpostesting.data.model.patient.DeviceData -import com.example.hpostesting.presentation.autodac.AutoDacActivity -import com.example.hpostesting.presentation.hemocube.HemocubeActivity import com.example.hpostesting.presentation.utils.UsbServiceListener import com.example.hpostesting.util.Result import com.example.hpostesting.util.Result.Success diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 28d0865..c83abd4 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -115,6 +115,7 @@ class HemoCubeFragment : Fragment() { @SuppressLint("SetTextI18n") private fun initViews() { binding.btnSubmit.setOnClickListener { + DataHolder.sampleReadCounter++ binding.btnSubmit.isEnabled = false binding.btnSubmit.isClickable = false activity?.runOnUiThread { diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt index 0c97970..700f7f9 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt @@ -485,7 +485,7 @@ class TestRightViewModel @Inject constructor( val csvUri = csvUploadTask.storage.downloadUrl.await().toString() val logUri = logUploadTask.storage.downloadUrl.await().toString() - val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber } + // val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber } testDetails?.csvPath = csvUri testDetails?.reportPath = logUri diff --git a/app/src/main/java/com/example/hpostesting/util/AppInitializer.kt b/app/src/main/java/com/example/hpostesting/util/AppInitializer.kt new file mode 100644 index 0000000..63f68b1 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/util/AppInitializer.kt @@ -0,0 +1,14 @@ +package com.example.hpostesting.util + +import android.content.Context + +object AppInitializer { + fun initialize(context: Context) { + val secureStorage = SecureStorage(context) + if (secureStorage.getPassword() == null || secureStorage.getAdminPassword() == null) { + // Store the shared password securely + secureStorage.storePassword("SMI@12345") + secureStorage.storeAdminPassword("SMI@Admin$") + } + } +} diff --git a/app/src/main/java/com/example/hpostesting/util/MyAuthenticator.kt b/app/src/main/java/com/example/hpostesting/util/MyAuthenticator.kt new file mode 100644 index 0000000..da739fe --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/util/MyAuthenticator.kt @@ -0,0 +1,44 @@ +package com.example.hpostesting.util + +import android.accounts.AbstractAccountAuthenticator +import android.accounts.Account +import android.accounts.AccountAuthenticatorResponse +import android.accounts.NetworkErrorException +import android.content.Context +import android.os.Bundle + +class MyAuthenticator(context: Context) : AbstractAccountAuthenticator(context) { + override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?): Bundle { + throw UnsupportedOperationException() + } + + override fun addAccount(response: AccountAuthenticatorResponse?, accountType: String?, authTokenType: String?, requiredFeatures: Array?, options: Bundle?): Bundle? { + // Add your logic to add an account + return null + } + + override fun confirmCredentials(response: AccountAuthenticatorResponse?, account: Account?, options: Bundle?): Bundle? { + // Add your logic to confirm credentials + return null + } + + override fun getAuthToken(response: AccountAuthenticatorResponse?, account: Account?, authTokenType: String?, options: Bundle?): Bundle? { + // Add your logic to get an authentication token + return null + } + + override fun getAuthTokenLabel(authTokenType: String?): String? { + // Label for the auth token type + return null + } + + override fun updateCredentials(response: AccountAuthenticatorResponse?, account: Account?, authTokenType: String?, options: Bundle?): Bundle? { + // Add your logic to update credentials + return null + } + + override fun hasFeatures(response: AccountAuthenticatorResponse?, account: Account?, features: Array?): Bundle? { + // Add your logic to check for specific account features + return null + } +} diff --git a/app/src/main/java/com/example/hpostesting/util/MyAuthenticatorService.kt b/app/src/main/java/com/example/hpostesting/util/MyAuthenticatorService.kt new file mode 100644 index 0000000..14c2e7e --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/util/MyAuthenticatorService.kt @@ -0,0 +1,12 @@ +package com.example.hpostesting.util + +import android.app.Service +import android.content.Intent +import android.os.IBinder + +class MyAuthenticatorService : Service() { + override fun onBind(intent: Intent?): IBinder? { + val authenticator = MyAuthenticator(this) + return authenticator.iBinder + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/util/SecureStorage.kt b/app/src/main/java/com/example/hpostesting/util/SecureStorage.kt new file mode 100644 index 0000000..d1ebbc3 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/util/SecureStorage.kt @@ -0,0 +1,33 @@ +package com.example.hpostesting.util + +import android.content.Context +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKey + +class SecureStorage(context: Context) { + private val masterKey = MasterKey.Builder(context) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build() + + private val sharedPreferences = EncryptedSharedPreferences.create( + context, + "secure_prefs", + masterKey, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + + fun storePassword(password: String) { + sharedPreferences.edit().putString("shared_password", password).apply() + } + fun storeAdminPassword(password: String) { + sharedPreferences.edit().putString("admin_password", password).apply() + } + fun getAdminPassword(): String? { + return sharedPreferences.getString("admin_password", null) + } + fun getPassword(): String? { + return sharedPreferences.getString("shared_password", null) + } + +} diff --git a/app/src/main/res/drawable-v24/internet.png b/app/src/main/res/drawable-v24/internet.png new file mode 100644 index 0000000..4032a34 Binary files /dev/null and b/app/src/main/res/drawable-v24/internet.png differ diff --git a/app/src/main/res/drawable-v24/off.png b/app/src/main/res/drawable-v24/off.png new file mode 100644 index 0000000..229b44b Binary files /dev/null and b/app/src/main/res/drawable-v24/off.png differ diff --git a/app/src/main/res/layout/activity_device.xml b/app/src/main/res/layout/activity_device.xml index 458cb98..c44bb01 100644 --- a/app/src/main/res/layout/activity_device.xml +++ b/app/src/main/res/layout/activity_device.xml @@ -23,18 +23,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - - - - - - - - + + > + + + + + + +