add refresh and qr code scan - jig
This commit is contained in:
@@ -14,13 +14,13 @@ android {
|
|||||||
compileSdk 34
|
compileSdk 34
|
||||||
namespace 'in.sminnovations.hpostesting'
|
namespace 'in.sminnovations.hpostesting'
|
||||||
|
|
||||||
// dev - development, quality - qc, uat - User Acceptance Test, preprod - preproduction, prod - production
|
// dev -> development, quality -> qc, uat -> User Acceptance Testing, preprod -> preproduction, prod -> production, iocl -> iocl-iisc production
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "in.sminnovations.hpostesting.dev"
|
applicationId "in.sminnovations.hpostesting.quality"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 111
|
versionCode 114
|
||||||
versionName "2.1.111"
|
versionName "2.1.114"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,6 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpostesting.presentation.jig.JigActivity"
|
android:name="com.example.hpostesting.presentation.jig.JigActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:screenOrientation="landscape"
|
|
||||||
android:theme="@style/Theme.HPOS.NoActionBar" />
|
android:theme="@style/Theme.HPOS.NoActionBar" />
|
||||||
<activity
|
<activity
|
||||||
android:name="com.example.hpostesting.presentation.deviceprovision.DeviceProvisionActivity"
|
android:name="com.example.hpostesting.presentation.deviceprovision.DeviceProvisionActivity"
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.example.hpostesting.data.model.jig
|
||||||
|
|
||||||
|
data class JigData (
|
||||||
|
var deviceId: String = "",
|
||||||
|
var appVersion: String? = "",
|
||||||
|
var deviceType: String = "JIG",
|
||||||
|
var scanData: String = "",
|
||||||
|
var createdAt: String = ""
|
||||||
|
)
|
||||||
@@ -9,6 +9,7 @@ import com.example.hpostesting.data.model.Response
|
|||||||
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest
|
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest
|
||||||
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse
|
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse
|
||||||
import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
|
import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
|
||||||
|
import com.example.hpostesting.data.model.jig.JigData
|
||||||
import com.example.hpostesting.data.model.log.UploadLogsResponse
|
import com.example.hpostesting.data.model.log.UploadLogsResponse
|
||||||
import com.example.hpostesting.data.model.login.LoginRequest
|
import com.example.hpostesting.data.model.login.LoginRequest
|
||||||
import com.example.hpostesting.data.model.login.LoginResponse
|
import com.example.hpostesting.data.model.login.LoginResponse
|
||||||
@@ -137,6 +138,16 @@ class DatabaseRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun addTestJigData(data: JigData?): Response<String> {
|
||||||
|
return try {
|
||||||
|
db.collection("jigs").add(data!!).await()
|
||||||
|
Response.Success(data.deviceId)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Firebase.crashlytics.recordException(e)
|
||||||
|
Response.Error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun uploadFileToStorage(
|
override suspend fun uploadFileToStorage(
|
||||||
patientID: String, filePath: String
|
patientID: String, filePath: String
|
||||||
): Response<Boolean> {
|
): Response<Boolean> {
|
||||||
@@ -216,9 +227,6 @@ class DatabaseRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override suspend fun uploadDeviceId(data: DeviceData): Response<String>? {
|
override suspend fun uploadDeviceId(data: DeviceData): Response<String>? {
|
||||||
return try {
|
return try {
|
||||||
db.collection("devices").add(data!!).await()
|
db.collection("devices").add(data!!).await()
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.example.hpostesting.data.model.Response
|
|||||||
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest
|
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionRequest
|
||||||
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse
|
import com.example.hpostesting.data.model.deviceprovision.DeviceProvisionResponse
|
||||||
import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
|
import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
|
||||||
|
import com.example.hpostesting.data.model.jig.JigData
|
||||||
import com.example.hpostesting.data.model.log.UploadLogsResponse
|
import com.example.hpostesting.data.model.log.UploadLogsResponse
|
||||||
import com.example.hpostesting.data.model.login.LoginRequest
|
import com.example.hpostesting.data.model.login.LoginRequest
|
||||||
import com.example.hpostesting.data.model.login.LoginResponse
|
import com.example.hpostesting.data.model.login.LoginResponse
|
||||||
@@ -29,6 +30,8 @@ interface Repository {
|
|||||||
|
|
||||||
suspend fun addDiagnostics(data: DiagnosticsData?): Response<String>
|
suspend fun addDiagnostics(data: DiagnosticsData?): Response<String>
|
||||||
|
|
||||||
|
suspend fun addTestJigData(data: JigData?): Response<String>
|
||||||
|
|
||||||
suspend fun uploadFileToStorage(patientID: String, filePath: String): Response<Boolean>
|
suspend fun uploadFileToStorage(patientID: String, filePath: String): Response<Boolean>
|
||||||
|
|
||||||
suspend fun getDeviceDataById(deviceId: String): DeviceData?
|
suspend fun getDeviceDataById(deviceId: String): DeviceData?
|
||||||
|
|||||||
@@ -229,7 +229,6 @@ class KitScanActivity : AppCompatActivity(), IDcsSdkApiDelegate {
|
|||||||
} else {
|
} else {
|
||||||
Toast.makeText(this,"Error", Toast.LENGTH_LONG).show()
|
Toast.makeText(this,"Error", Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun pullTrigger() {
|
private fun pullTrigger() {
|
||||||
|
|||||||
@@ -94,11 +94,11 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
|||||||
// val apkUrl = "https://dl.dropboxusercontent.com/s/fi/1c3nn7t0co431hicl3hrt/app-debug.apk?rlkey=e4uf13ty1dpcked614vy1aaqp&dl=0"
|
// val apkUrl = "https://dl.dropboxusercontent.com/s/fi/1c3nn7t0co431hicl3hrt/app-debug.apk?rlkey=e4uf13ty1dpcked614vy1aaqp&dl=0"
|
||||||
initiateUpdate(apkUrl.toString())
|
initiateUpdate(apkUrl.toString())
|
||||||
Log.d("ApI", "APK URL: $apkUrl")
|
Log.d("ApI", "APK URL: $apkUrl")
|
||||||
Toast.makeText(
|
// Toast.makeText(
|
||||||
this,
|
// this,
|
||||||
"APK UPLOAD ${result.data}",
|
// "APK UPLOAD ${result.data}",
|
||||||
Toast.LENGTH_SHORT
|
// Toast.LENGTH_SHORT
|
||||||
).show()
|
// ).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
is Result.Error -> {
|
is Result.Error -> {
|
||||||
|
|||||||
@@ -320,11 +320,11 @@ class HomeFragment : Fragment() {
|
|||||||
hemoCubeViewModel.uploadLogs.observe(viewLifecycleOwner) { response ->
|
hemoCubeViewModel.uploadLogs.observe(viewLifecycleOwner) { response ->
|
||||||
when (response) {
|
when (response) {
|
||||||
is Result.Success -> {
|
is Result.Success -> {
|
||||||
Toast.makeText(
|
// Toast.makeText(
|
||||||
requireContext(),
|
// requireContext(),
|
||||||
"Log uploaded ${response.data.data?.filename}",
|
// "Log uploaded ${response.data.data?.filename}",
|
||||||
Toast.LENGTH_SHORT
|
// Toast.LENGTH_SHORT
|
||||||
).show()
|
// ).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
is Result.Error -> {
|
is Result.Error -> {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.content.ServiceConnection
|
import android.content.ServiceConnection
|
||||||
|
import android.content.pm.ActivityInfo
|
||||||
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
|
||||||
@@ -90,6 +91,8 @@ class JigActivity: AppCompatActivity(){
|
|||||||
// setupListener()
|
// setupListener()
|
||||||
// connectUsb(false)
|
// connectUsb(false)
|
||||||
|
|
||||||
|
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE)
|
||||||
|
|
||||||
moveToNext()
|
moveToNext()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package com.example.hpostesting.presentation.jig
|
package com.example.hpostesting.presentation.jig
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@@ -13,6 +15,8 @@ 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.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.example.hpostesting.data.constant.Constants
|
||||||
|
import com.example.hpostesting.data.model.jig.JigData
|
||||||
import com.example.hpostesting.data.model.patient.DeviceData
|
import com.example.hpostesting.data.model.patient.DeviceData
|
||||||
import com.journeyapps.barcodescanner.ScanContract
|
import com.journeyapps.barcodescanner.ScanContract
|
||||||
import com.journeyapps.barcodescanner.ScanIntentResult
|
import com.journeyapps.barcodescanner.ScanIntentResult
|
||||||
@@ -23,8 +27,11 @@ import com.zebra.scannercontrol.FirmwareUpdateEvent
|
|||||||
import com.zebra.scannercontrol.IDcsSdkApiDelegate
|
import com.zebra.scannercontrol.IDcsSdkApiDelegate
|
||||||
import com.zebra.scannercontrol.SDKHandler
|
import com.zebra.scannercontrol.SDKHandler
|
||||||
import `in`.sminnovations.hpostesting.databinding.FragmentJigBinding
|
import `in`.sminnovations.hpostesting.databinding.FragmentJigBinding
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Calendar
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
class JigFragment : Fragment(), IDcsSdkApiDelegate {
|
||||||
private lateinit var binding: FragmentJigBinding
|
private lateinit var binding: FragmentJigBinding
|
||||||
private val jigViewModel: JigViewModel by activityViewModels()
|
private val jigViewModel: JigViewModel by activityViewModels()
|
||||||
private lateinit var sharedPreferences: SharedPreferences
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
@@ -44,16 +51,54 @@ class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
|||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
initScanner()
|
||||||
initViews()
|
initViews()
|
||||||
observeViewModel()
|
observeViewModel()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initViews() {
|
private fun initScanner() {
|
||||||
binding.btnSubmit.visibility = View.GONE
|
//Setting up the SDK handler
|
||||||
|
sdkHandler = SDKHandler(requireContext())
|
||||||
|
//Registers a particular object which conforms to IDcsSdkApiDelegate interface as a receiver of SDK notifications.
|
||||||
|
sdkHandler!!.dcssdkSetDelegate(this)
|
||||||
|
//this command is telling the sdk that we're going to be connecting to the scanner via USB
|
||||||
|
sdkHandler!!.dcssdkSetOperationalMode(DCSSDKDefs.DCSSDK_MODE.DCSSDK_OPMODE_SNAPI)
|
||||||
|
|
||||||
|
//deciding what kind of notifications we want to receive. Explained more in the function
|
||||||
|
//first we use bitmapping to set these values into the notifications_mask.
|
||||||
|
var notifications_mask = 0
|
||||||
|
// We would like to subscribe to all barcode events
|
||||||
|
notifications_mask =
|
||||||
|
notifications_mask or DCSSDKDefs.DCSSDK_EVENT.DCSSDK_EVENT_BARCODE.value
|
||||||
|
sdkHandler!!.dcssdkSubsribeForEvents(notifications_mask)
|
||||||
|
mScannerInfoList.addAll(sdkHandler!!.dcssdkGetAvailableScannersList())
|
||||||
|
Log.e("scannersize", sdkHandler!!.dcssdkGetAvailableScannersList().size.toString())
|
||||||
|
if (mScannerInfoList.isNotEmpty()) {
|
||||||
|
sdkHandler!!.dcssdkEstablishCommunicationSession(mScannerInfoList[0].scannerID)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(requireContext(), "Scanner Error", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
private fun initViews() {
|
||||||
binding.btnScanNow.setOnClickListener {
|
binding.btnScanNow.setOnClickListener {
|
||||||
pullTrigger()
|
pullTrigger()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.btnRefresh.setOnClickListener {
|
||||||
|
activity?.recreate()
|
||||||
|
initScanner()
|
||||||
|
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
binding.tvScanText.text = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
activity?.runOnUiThread {
|
||||||
|
binding.tvAppVersion.text =
|
||||||
|
getAppVersion(requireContext()) + " [ " + getAppEnvironment(requireContext()) + " ]"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun observeViewModel() {
|
private fun observeViewModel() {
|
||||||
@@ -68,29 +113,32 @@ class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
|||||||
|
|
||||||
jigViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
|
jigViewModel.fireBaseUpload.observe(viewLifecycleOwner) { result ->
|
||||||
if (result == "Success") {
|
if (result == "Success") {
|
||||||
showToast("Auto Dac data uploaded successfully")
|
showToast("Data uploaded successfully")
|
||||||
}
|
}
|
||||||
if (result == "Local") {
|
if (result == "Local") {
|
||||||
showToast("Auto Dac uploading failed, note it down manually")
|
showToast("Data uploading failed, note it down manually")
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.progressBar.visibility = View.GONE
|
binding.progressBar.visibility = View.GONE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun parseData(inputData: List<String>): List<Pair<String, String>> {
|
private fun getAppVersion(context: Context): String {
|
||||||
val pattern = Regex("([A-Z]+)\\s(\\d+)")
|
return try {
|
||||||
val parsedData = mutableListOf<Pair<String, String>>()
|
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
|
||||||
|
pInfo.versionName
|
||||||
for (item in inputData) {
|
} catch (e: PackageManager.NameNotFoundException) {
|
||||||
val matchResult = pattern.find(item)
|
"N/A"
|
||||||
if (matchResult != null) {
|
|
||||||
val (letters, numbers) = matchResult.destructured
|
|
||||||
parsedData.add(Pair(letters, numbers))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return parsedData
|
private fun getAppEnvironment(context: Context): String {
|
||||||
|
return try {
|
||||||
|
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
|
||||||
|
pInfo.packageName.substringAfterLast('.')
|
||||||
|
} catch (e: PackageManager.NameNotFoundException) {
|
||||||
|
"N/A"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showToast(message: String) {
|
private fun showToast(message: String) {
|
||||||
@@ -127,7 +175,10 @@ class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
|||||||
val outXML = StringBuilder()
|
val outXML = StringBuilder()
|
||||||
val result: DCSSDKDefs.DCSSDK_RESULT =
|
val result: DCSSDKDefs.DCSSDK_RESULT =
|
||||||
sdkHandler!!.dcssdkExecuteCommandOpCodeInXMLForScanner(
|
sdkHandler!!.dcssdkExecuteCommandOpCodeInXMLForScanner(
|
||||||
DCSSDKDefs.DCSSDK_COMMAND_OPCODE.DCSSDK_DEVICE_PULL_TRIGGER, inXML, outXML, mScannerInfoList[0].scannerID // Ensure you're using the correct scanner ID
|
DCSSDKDefs.DCSSDK_COMMAND_OPCODE.DCSSDK_DEVICE_PULL_TRIGGER,
|
||||||
|
inXML,
|
||||||
|
outXML,
|
||||||
|
mScannerInfoList[0].scannerID // Ensure you're using the correct scanner ID
|
||||||
)
|
)
|
||||||
if (result == DCSSDKDefs.DCSSDK_RESULT.DCSSDK_RESULT_SUCCESS) {
|
if (result == DCSSDKDefs.DCSSDK_RESULT.DCSSDK_RESULT_SUCCESS) {
|
||||||
Log.d("Scanning", "Success")
|
Log.d("Scanning", "Success")
|
||||||
@@ -145,7 +196,17 @@ class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
|||||||
Log.d("BARCODE", result)
|
Log.d("BARCODE", result)
|
||||||
activity?.runOnUiThread {
|
activity?.runOnUiThread {
|
||||||
val editableResult: Editable = Editable.Factory.getInstance().newEditable(result)
|
val editableResult: Editable = Editable.Factory.getInstance().newEditable(result)
|
||||||
binding.tvScanText.text = editableResult
|
binding.tvScanText.text = result
|
||||||
|
|
||||||
|
jigViewModel.addScanDataToDb(
|
||||||
|
JigData(
|
||||||
|
deviceId = sharedPreferences.getString(Constants.DEVICE_ID, "").toString(),
|
||||||
|
scanData = result,
|
||||||
|
createdAt = SimpleDateFormat(
|
||||||
|
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
|
||||||
|
).format(Calendar.getInstance().time)
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +232,7 @@ class JigFragment: Fragment(), IDcsSdkApiDelegate {
|
|||||||
|
|
||||||
override fun dcssdkEventAuxScannerAppeared(
|
override fun dcssdkEventAuxScannerAppeared(
|
||||||
dcsScannerInfo: DCSScannerInfo?,
|
dcsScannerInfo: DCSScannerInfo?,
|
||||||
dcsScannerInfo1: DCSScannerInfo?
|
dcsScannerInfo1: DCSScannerInfo?,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.example.hpostesting.data.dao.HemoCubeDao
|
import com.example.hpostesting.data.dao.HemoCubeDao
|
||||||
import com.example.hpostesting.data.model.Response
|
import com.example.hpostesting.data.model.Response
|
||||||
import com.example.hpostesting.data.model.diagnostics.DiagnosticsData
|
import com.example.hpostesting.data.model.jig.JigData
|
||||||
import com.example.hpostesting.data.model.patient.DeviceData
|
import com.example.hpostesting.data.model.patient.DeviceData
|
||||||
import com.example.hpostesting.data.repository.Repository
|
import com.example.hpostesting.data.repository.Repository
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
@@ -29,10 +29,10 @@ class JigViewModel @Inject constructor(
|
|||||||
val deviceData = MutableLiveData<DeviceData?>()
|
val deviceData = MutableLiveData<DeviceData?>()
|
||||||
val fireBaseUpload = MutableLiveData<String>()
|
val fireBaseUpload = MutableLiveData<String>()
|
||||||
|
|
||||||
fun addAutoDacDataToDb(data: DiagnosticsData) {
|
fun addScanDataToDb(data: JigData) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
try {
|
try {
|
||||||
when (val response = repository.addDiagnostics(data)) {
|
when (val response = repository.addTestJigData(data)) {
|
||||||
is Response.Success -> {
|
is Response.Success -> {
|
||||||
fireBaseUpload.postValue("Success")
|
fireBaseUpload.postValue("Success")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,18 @@
|
|||||||
app:layout_constraintTop_toBottomOf="parent"
|
app:layout_constraintTop_toBottomOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_app_version"
|
||||||
|
style="@style/title2"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="0.0.0"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/tv_subtitle2"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tv_subtitle2"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_title"
|
android:id="@+id/tv_title"
|
||||||
style="@style/title1"
|
style="@style/title1"
|
||||||
@@ -70,19 +82,19 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/btn_scan_now" />
|
app:layout_constraintTop_toBottomOf="@id/btn_scan_now" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/btn_submit"
|
android:id="@+id/btn_refresh"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="16dp"
|
android:layout_marginHorizontal="16dp"
|
||||||
android:layout_marginTop="24dp"
|
android:layout_marginTop="24dp"
|
||||||
android:clickable="false"
|
android:clickable="false"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="Start"
|
android:text="Refresh"
|
||||||
android:visibility="gone"
|
android:visibility="visible"
|
||||||
android:textColor="@color/white"
|
android:textColor="@color/white"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="@id/btn_scan_now"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tv_scan_text" />
|
app:layout_constraintTop_toBottomOf="@id/btn_scan_now" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/iv_check"
|
android:id="@+id/iv_check"
|
||||||
|
|||||||
Reference in New Issue
Block a user