MyCustomScannerFragment
unknown
plain_text
3 years ago
28 kB
8
Indexable
package com.android.kepr.ui.scanner.filesRFID
import android.Manifest
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.Bundle
import android.os.Message
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import android.widget.ListView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.android.kepr.R
import com.android.kepr.data.db.AgentDatabase
import com.android.kepr.data.db.dao.DaoAccess
import com.android.kepr.utils.Utils
import com.uk.tsl.rfid.DeviceListActivity
import com.uk.tsl.rfid.asciiprotocol.AsciiCommander
import com.uk.tsl.rfid.asciiprotocol.BuildConfig
import com.uk.tsl.rfid.asciiprotocol.device.ConnectionState
import com.uk.tsl.rfid.asciiprotocol.device.Reader
import com.uk.tsl.rfid.asciiprotocol.device.ReaderManager
import com.uk.tsl.rfid.asciiprotocol.device.TransportType
import com.uk.tsl.rfid.asciiprotocol.enumerations.QuerySession
import com.uk.tsl.rfid.asciiprotocol.responders.LoggerResponder
import com.uk.tsl.utils.Observable
import kotlinx.android.synthetic.main.fragment_scan_via_rfid.*
class MyCustomScannerFragment : Fragment(R.layout.fragment_scan_via_rfid) {
private var myTagArraylist: ArrayList<String> = ArrayList()
private val D = BuildConfig.DEBUG
private lateinit var dao: DaoAccess
var assetsverified = 0
val totalAssets = 0
private lateinit var mGenericModelHandler: GenericHandler
private var mResultsListView: ListView? = null
private var mModel: InventoryModel? = null
private var mReader: Reader? = null
private var mLastUserDisconnectedReader: Reader? = null
private var mIsSelectingReader = false
private var requestBluetooth = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == AppCompatActivity.RESULT_OK) {
//granted
}else{
//deny
}
}
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.d("test006", "${it.key} = ${it.value}")
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
requestMultiplePermissions.launch(arrayOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_CONNECT,Manifest.permission.BLUETOOTH_SCAN,Manifest.permission.BLUETOOTH_ADMIN,Manifest.permission.BLUETOOTH_ADVERTISE,))
}
else{
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
requestBluetooth.launch(enableBtIntent)
}
txt_waiting_for_scan.text = "hey its working..."
mGenericModelHandler = GenericHandler(this)
dao = AgentDatabase.getInstance(activity).daoAccess()
val totalAssets = dao.getAllAssetsAccordingToCount(myTagArraylist).size
tv_assets_count.textSize = 18F
tv_assets_count.text = "$assetsverified/$totalAssets Assets verified"
iv_scanner.setOnClickListener {
}
tv_connectdevice.setOnClickListener {
mIsSelectingReader = true
var index = -1
if (mReader != null) {
index = ReaderManager.sharedInstance().readerList.list().indexOf(mReader)
}
val selectIntent: Intent = Intent(
activity,
DeviceListActivity::class.java
)
if (index >= 0) {
selectIntent.putExtra(DeviceListActivity.EXTRA_DEVICE_INDEX, index)
}
startActivityForResult(selectIntent, DeviceListActivity.SELECT_DEVICE_REQUEST)
UpdateUI()
}
AsciiCommander.createSharedInstance(requireContext())
val commander: AsciiCommander = getCommander()
commander.clearResponders()
commander.addResponder(LoggerResponder())
commander.addSynchronousResponder()
ReaderManager.create(requireContext())
// Add observers for changes
// Add observers for changes
ReaderManager.sharedInstance().readerList.readerAddedEvent().addObserver(mAddedObserver)
ReaderManager.sharedInstance().readerList.readerUpdatedEvent().addObserver(mUpdatedObserver)
ReaderManager.sharedInstance().readerList.readerRemovedEvent().addObserver(mRemovedObserver)
//Create a (custom) model and configure its commander and handler
//Create a (custom) model and configure its commander and handler
mModel = InventoryModel()
mModel!!.commander = getCommander()
mModel!!.handler = mGenericModelHandler
}
companion object {
fun newInstance(): MyCustomScannerFragment {
return MyCustomScannerFragment()
}
}
override fun onDestroy() {
super.onDestroy()
// Remove observers for changes
ReaderManager.sharedInstance().readerList.readerAddedEvent().removeObserver(mAddedObserver)
ReaderManager.sharedInstance().readerList.readerUpdatedEvent()
.removeObserver(mUpdatedObserver)
ReaderManager.sharedInstance().readerList.readerRemovedEvent()
.removeObserver(mRemovedObserver)
}
//----------------------------------------------------------------------------------------------
// Pause & Resume life cycle
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Pause & Resume life cycle
//----------------------------------------------------------------------------------------------
@Synchronized
override fun onPause() {
super.onPause()
mModel!!.setEnabled(false)
// Unregister to receive notifications from the AsciiCommander
LocalBroadcastManager.getInstance(context!!).unregisterReceiver(mCommanderMessageReceiver)
// Disconnect from the reader to allow other Apps to use it
// unless pausing when USB device attached or using the DeviceListActivity to select a Reader
if (!mIsSelectingReader && !ReaderManager.sharedInstance()
.didCauseOnPause() && mReader != null
) {
mReader!!.disconnect()
}
ReaderManager.sharedInstance().onPause()
}
@Synchronized
override fun onResume() {
super.onResume()
mModel!!.setEnabled(true)
// Register to receive notifications from the AsciiCommander
LocalBroadcastManager.getInstance(activity!!).registerReceiver(
mCommanderMessageReceiver,
IntentFilter(AsciiCommander.STATE_CHANGED_NOTIFICATION)
)
// Remember if the pause/resume was caused by ReaderManager - this will be cleared when ReaderManager.onResume() is called
val readerManagerDidCauseOnPause = ReaderManager.sharedInstance().didCauseOnPause()
// The ReaderManager needs to know about Activity lifecycle changes
ReaderManager.sharedInstance().onResume()
// The Activity may start with a reader already connected (perhaps by another App)
// Update the ReaderList which will add any unknown reader, firing events appropriately
ReaderManager.sharedInstance().updateList()
// Locate a Reader to use when necessary
AutoSelectReader(!readerManagerDidCauseOnPause)
mIsSelectingReader = false
displayReaderState()
UpdateUI()
}
//----------------------------------------------------------------------------------------------
// ReaderList Observers
//----------------------------------------------------------------------------------------------
var mAddedObserver: Observable.Observer<Reader> =
Observable.Observer { observable, reader -> // See if this newly added Reader should be used
AutoSelectReader(true)
}
var mUpdatedObserver =
Observable.Observer<Reader> { observable, reader ->
// Is this a change to the last actively disconnected reader
if (reader === mLastUserDisconnectedReader) {
// Things have changed since it was actively disconnected so
// treat it as new
mLastUserDisconnectedReader = null
}
// Was the current Reader disconnected i.e. the connected transport went away or disconnected
if (reader === mReader && !reader.isConnected) {
// No longer using this reader
mReader = null
// Stop using the old Reader
getCommander().reader = mReader
} else {
// See if this updated Reader should be used
// e.g. the Reader's USB transport connected
AutoSelectReader(true)
}
}
var mRemovedObserver =
Observable.Observer<Reader> { observable, reader ->
// Is this a change to the last actively disconnected reader
if (reader === mLastUserDisconnectedReader) {
// Things have changed since it was actively disconnected so
// treat it as new
mLastUserDisconnectedReader = null
}
// Was the current Reader removed
if (reader === mReader) {
mReader = null
// Stop using the old Reader
getCommander().reader = mReader
}
}
private fun AutoSelectReader(attemptReconnect: Boolean) {
val readerList = ReaderManager.sharedInstance().readerList
var usbReader: Reader? = null
if (readerList.list().size >= 1) {
// Currently only support a single USB connected device so we can safely take the
// first CONNECTED reader if there is one
for (reader in readerList.list()) {
if (reader.hasTransportOfType(TransportType.USB)) {
usbReader = reader
break
}
}
}
if (mReader == null) {
if (usbReader != null && usbReader !== mLastUserDisconnectedReader) {
// Use the Reader found, if any
mReader = usbReader
getCommander().reader = mReader
}
} else {
// If already connected to a Reader by anything other than USB then
// switch to the USB Reader
val activeTransport = mReader!!.activeTransport
if (activeTransport != null && activeTransport.type() != TransportType.USB && usbReader != null) {
mReader!!.disconnect()
mReader = usbReader
// Use the Reader found, if any
getCommander().reader = mReader
}
}
// Reconnect to the chosen Reader
if (mReader != null && !mReader!!.isConnecting
&& (mReader!!.activeTransport == null || mReader!!.activeTransport
.connectionStatus().value() == ConnectionState.DISCONNECTED)
) {
// Attempt to reconnect on the last used transport unless the ReaderManager is cause of OnPause (USB device connecting)
if (attemptReconnect) {
if (mReader!!.allowMultipleTransports() || mReader!!.lastTransportType == null) {
// Reader allows multiple transports or has not yet been connected so connect to it over any available transport
mReader!!.connect()
} else {
// Reader supports only a single active transport so connect to it over the transport that was last in use
mReader!!.connect(mReader!!.lastTransportType)
}
}
}
}
private var mConnectMenuItem: MenuItem? = null
private var mDisconnectMenuItem: MenuItem? = null
private var mResetMenuItem: MenuItem? = null
override fun onPrepareOptionsMenu(menu: Menu) {
val isConnecting = getCommander().connectionState == ConnectionState.CONNECTING
val isConnected = getCommander().isConnected
mDisconnectMenuItem!!.isEnabled = isConnected
mConnectMenuItem!!.isEnabled = true
mConnectMenuItem!!.title =
if (mReader != null && mReader!!.isConnected) "Change Reader" else "Change Reader"
mResetMenuItem!!.isEnabled = isConnected
super.onPrepareOptionsMenu(menu)
}
private class GenericHandler(t: MyCustomScannerFragment?) :
WeakHandler<MyCustomScannerFragment?>(t) {
override fun handleMessage(msg: Message?, t: MyCustomScannerFragment?) {
try {
when (msg?.what) {
ModelBase.BUSY_STATE_CHANGED_NOTIFICATION -> {}
ModelBase.MESSAGE_NOTIFICATION -> {
// Examine the message for prefix
val message = msg.obj as String
if (message.startsWith("ER:")) {
val value2 = message.substring(3).replaceFirst("^0+(?!$)".toRegex(), "")
Log.v("scanner that i want to edit", value2)
t?.myTagArraylist?.add(value2.toString())
} else if (message.startsWith("BC:")) {
val value2 = message.substring(3).replaceFirst("^0+(?!$)".toRegex(), "")
Log.v("scanner that i want to edit", value2)
t?.myTagArraylist?.add(value2.toString())
} else {
Log.v(
"scanner that i want to edit",
"${Utils.removefirstNchars(message, 4)}",
)
val value = message.substring(4)
val value2 = value.replaceFirst("^0+(?!$)".toRegex(), "")
Log.v("scanner that i want to edit 2", value2)
t?.myTagArraylist?.add(value2.toString())
updateUi(t?.myTagArraylist, t?.context!!, t)
}
t?.UpdateUI()
}
else -> {}
}
} catch (e: Exception) {
}
}
private fun updateUi(
myTagArraylist: ArrayList<String>?,
context: Context,
t: MyCustomScannerFragment
) {
val dao = AgentDatabase.getInstance(context).daoAccess()
t.iv_scanner.setOnClickListener { if (myTagArraylist!!.isNotEmpty()) {
Toast.makeText(t.requireActivity(), myTagArraylist.toString(), Toast.LENGTH_SHORT)
.show()
Log.v("tag", myTagArraylist.toString())
} else {
Toast.makeText(t.requireActivity(), myTagArraylist.toString(), Toast.LENGTH_SHORT)
.show()
}}
val count = dao.getAllAssetsAccordingToCount(myTagArraylist!!).size
val verified = dao.getAllAssetsAccordingToCountViaVerified(myTagArraylist,"Y").size
Log.v("crossCheck", dao.getAllAssetsAccordingToCount(myTagArraylist).toString())
t.tv_assets_count.text = "${verified}/${count} Assets verified"
}
}
private fun displayReaderState() {
var connectionMsg: String? = "Reader: "
connectionMsg += when (getCommander().connectionState) {
ConnectionState.CONNECTED -> getCommander().connectedDeviceName
ConnectionState.CONNECTING -> "Connecting..."
else -> "Disconnected"
}
txt_waiting_for_scan.text = connectionMsg
}
//
// Set the state for the UI controls
//
private fun UpdateUI() {
//boolean isConnected = getCommander().isConnected();
//TODO: configure UI control state
}
protected fun getCommander(): AsciiCommander {
return AsciiCommander.sharedInstance()
}
//
// Handle the messages broadcast from the AsciiCommander
//
private val mCommanderMessageReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (D) {
Log.d(
javaClass.name,
"AsciiCommander state changed - isConnected: " + getCommander().isConnected
)
}
val connectionStateMsg = intent.getStringExtra(AsciiCommander.REASON_KEY)
displayReaderState()
/* if (getCommander().isConnected) {
// Update for any change in power limits
setPowerBarLimits()
// This may have changed the current power level setting if the new range is smaller than the old range
// so update the model's inventory command for the new power value
mModel!!.command.outputPower = mPowerLevel
mModel!!.resetDevice()
mModel!!.updateConfiguration()
}*/
UpdateUI()
}
}
//----------------------------------------------------------------------------------------------
// Power seek bar
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Power seek bar
//----------------------------------------------------------------------------------------------
//
// Set the seek bar to cover the range of the currently connected device
// The power level is set to the new maximum power
//
/* private fun setPowerBarLimits() {
val deviceProperties = getCommander().deviceProperties
mPowerSeekBar!!.max =
deviceProperties.maximumCarrierPower - deviceProperties.minimumCarrierPower
mPowerLevel = deviceProperties.maximumCarrierPower
mPowerSeekBar!!.progress = mPowerLevel - deviceProperties.minimumCarrierPower
}*/
//
// Handle events from the power level seek bar. Update the mPowerLevel member variable for use in other actions
//
/*
private val mPowerSeekBarListener: SeekBar.OnSeekBarChangeListener =
object : SeekBar.OnSeekBarChangeListener {
override fun onStartTrackingTouch(seekBar: SeekBar) {
// Nothing to do here
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
// Update the reader's setting only after the user has finished changing the value
updatePowerSetting(getCommander().deviceProperties.minimumCarrierPower + seekBar.progress)
mModel!!.command.outputPower = mPowerLevel
mModel!!.updateConfiguration()
}
override fun onProgressChanged(
seekBar: SeekBar, progress: Int,
fromUser: Boolean
) {
updatePowerSetting(getCommander().deviceProperties.minimumCarrierPower + progress)
}
}
*/
/* private fun updatePowerSetting(level: Int) {
mPowerLevel = level
mPowerLevelTextView!!.text = "$mPowerLevel dBm"
}
*/
//----------------------------------------------------------------------------------------------
// Button event handlers
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Button event handlers
//----------------------------------------------------------------------------------------------
// Scan (Start) action
/* private val mScanButtonListener = View.OnClickListener {
try {
mResultTextView!!.text = ""
// Start the continuous inventory
mModel!!.scanStart()
mStartButton!!.isEnabled = false
mStopButton!!.isEnabled = true
mBarcodeResultsListView!!.visibility = View.GONE
UpdateUI()
} catch (e: Exception) {
e.printStackTrace()
}
}*/
// Scan Stopaction
/* private val mScanStopButtonListener = View.OnClickListener {
try {
mResultTextView!!.text = ""
// Stop the continuous inventory
mModel!!.scanStop()
mStartButton!!.isEnabled = true
mStopButton!!.isEnabled = false
UpdateUI()
} catch (e: Exception) {
e.printStackTrace()
}
}*/
// Clear action
/*private val mClearButtonListener = View.OnClickListener {
try {
// Clear the list
mResultsArrayAdapter!!.clear()
mResultTextView!!.text = ""
mResultTextView!!.setBackgroundColor(0x00FFFFFF)
mBarcodeResultsArrayAdapter!!.clear()
mModel!!.clearUniques()
mBarcodeResultsListView!!.visibility = View.VISIBLE
UpdateUI()
} catch (e: Exception) {
e.printStackTrace()
}
}*/
//----------------------------------------------------------------------------------------------
// Handler for changes in session
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Handler for changes in session
//----------------------------------------------------------------------------------------------
private val mActionSelectedListener: AdapterView.OnItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
if (mModel!!.command != null) {
val targetSession = parent.getItemAtPosition(pos) as QuerySession
mModel!!.command.querySession = targetSession
mModel!!.updateConfiguration()
}
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
//----------------------------------------------------------------------------------------------
// Handler for changes in Uniques Only
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Handler for changes in Uniques Only
//----------------------------------------------------------------------------------------------
/* private val mUniquesCheckBoxListener =
View.OnClickListener { v ->
try {
val uniquesCheckBox = v as CheckBox
mModel!!.setUniquesOnly(uniquesCheckBox.isChecked)
UpdateUI()
} catch (e: Exception) {
e.printStackTrace()
}
}*/
//----------------------------------------------------------------------------------------------
// Handler for changes in FastId
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Handler for changes in FastId
//----------------------------------------------------------------------------------------------
/* private val mFastIdCheckBoxListener =
View.OnClickListener { v ->
try {
val fastIdCheckBox = v as CheckBox
mModel!!.command.usefastId =
if (fastIdCheckBox.isChecked) TriState.YES else TriState.NO
mModel!!.updateConfiguration()
UpdateUI()
} catch (e: Exception) {
e.printStackTrace()
}
}
*/
//----------------------------------------------------------------------------------------------
// Handler for DeviceListActivity
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// Handler for DeviceListActivity
//----------------------------------------------------------------------------------------------
//
// Handle Intent results
//
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
DeviceListActivity.SELECT_DEVICE_REQUEST -> // When DeviceListActivity returns with a device to connect
if (resultCode == Activity.RESULT_OK) {
val readerIndex = data?.extras!!.getInt(DeviceListActivity.EXTRA_DEVICE_INDEX)
val chosenReader = ReaderManager.sharedInstance().readerList.list()[readerIndex]
val action = data.extras!!.getInt(DeviceListActivity.EXTRA_DEVICE_ACTION)
// If already connected to a different reader then disconnect it
if (mReader != null) {
if (action == DeviceListActivity.DEVICE_CHANGE || action == DeviceListActivity.DEVICE_DISCONNECT) {
mReader!!.disconnect()
if (action == DeviceListActivity.DEVICE_DISCONNECT) {
mLastUserDisconnectedReader = mReader
mReader = null
}
}
}
// Use the Reader found
if (action == DeviceListActivity.DEVICE_CHANGE || action == DeviceListActivity.DEVICE_CONNECT) {
mReader = chosenReader
mLastUserDisconnectedReader = null
getCommander().reader = mReader
}
displayReaderState()
}
}
}
/* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
}*/
}Editor is loading...