MyCustomScannerFragment

 avatar
unknown
plain_text
2 years ago
28 kB
4
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...