左晓为主开发手持机充值管理机
zuoxiao
2025-05-13 1330e783aa3d187360324cd7d7ed6eb48642cfff
generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
@@ -2,14 +2,25 @@
import android.app.Activity
import android.content.Intent
import android.view.View
import android.widget.RelativeLayout
import com.dayu.baselibrary.tools.nfc.NFCCallBack
import com.dayu.baselibrary.tools.nfc.NfcWriteAdapter
import com.dayu.general.bean.card.UserCard
import com.pnikosis.materialishprogress.ProgressWheel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
class NfcWreatHelper private constructor(intent: Intent, activity: Activity) :
    GeBaseHelper(activity) {
    private val adapter: NfcWriteAdapter = NfcWriteAdapter(intent, activity)
    private val compositeDisposable = CompositeDisposable()
    private var loadingContainer: RelativeLayout? = null
    private var progressWheel: ProgressWheel? = null
    companion object {
        private var helper: NfcWreatHelper? = null
@@ -27,6 +38,69 @@
        }
    }
    /**
     * 设置加载动画视图
     */
    fun setLoadingView(loadingContainer: RelativeLayout, progressWheel: ProgressWheel) {
        this.loadingContainer = loadingContainer
        this.progressWheel = progressWheel
    }
    /**
     * 显示加载动画
     */
    private fun showLoading() {
        loadingContainer?.let {
            it.visibility = View.VISIBLE
        }
        progressWheel?.let {
            it.spin()
        }
    }
    /**
     * 隐藏加载动画
     */
    private fun hideLoading() {
        loadingContainer?.let {
            it.visibility = View.GONE
        }
        progressWheel?.let {
            it.stopSpinning()
        }
    }
    /**
     * 写卡(异步)
     *
     * @param str 书写内容,16个字节
     * @param a   书写的扇区 (从0开始数)
     * @param b   书写的块(从0开始数)
     * @param callback 操作结果回调
     */
    fun writeDataAsync(str: ByteArray?, a: Int, b: Int, callback: (Boolean) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            writeData(str, a, b, object : NFCCallBack {
                override fun isSusses(flag: Boolean, msg: String?) {
                    // 这个回调在IO线程中,不处理UI相关操作
                }
            })
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback(false)
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
     * 写卡
@@ -46,6 +120,32 @@
    }
    /**
     * 写卡(异步)
     *
     * @param userCard 用户卡内容
     * @param callback 操作结果回调
     */
    fun writeUserDataAsync(userCard: UserCard, callback: (Boolean) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            writeUserData(userCard)
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback(false)
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
     * 写卡
     *
     * @param userCard 用户卡内容
@@ -60,14 +160,57 @@
        return false
    }
    fun changePS( ps: List<ByteArray>, isConnect: Boolean, isClose: Boolean,nfcCallBack: NFCCallBack): Boolean {
    /**
     * 修改密码(异步)
     *
     * @param ps 密码列表
     * @param isConnect 是否保持连接
     * @param isClose 是否关闭
     * @param callback 结果回调
     */
    fun changePSAsync(ps: List<ByteArray>, isConnect: Boolean, isClose: Boolean, callback: (Boolean, String?) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            var resultSuccess = false
            var resultMessage: String? = null
            changePS(ps, isConnect, isClose, object : NFCCallBack {
                override fun isSusses(flag: Boolean, msg: String?) {
                    resultSuccess = flag
                    resultMessage = msg
                }
            })
            Pair(resultSuccess, resultMessage)
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result.first, result.second)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback(false, error.message)
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    fun changePS(ps: List<ByteArray>, isConnect: Boolean, isClose: Boolean, nfcCallBack: NFCCallBack): Boolean {
        try {
            return adapter.changePasword( ps, isConnect, isClose,nfcCallBack)
            return adapter.changePasword(ps, isConnect, isClose, nfcCallBack)
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
        return false
    }
    /**
     * 清除所有订阅,防止内存泄漏
     */
    fun clearDisposables() {
        compositeDisposable.clear()
    }
}