| | |
| | | |
| | | 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) { |
| | | 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 |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置加载动画视图 |
| | | */ |
| | | 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 |
| | | } |
| | | |
| | | /** |
| | | * 写卡 |
| | |
| | | * @param b 书写的块(从0开始数) |
| | | * @param |
| | | */ |
| | | fun writeData(str: ByteArray?, a: Int, b: Int,callBack: NFCCallBack): Boolean { |
| | | fun writeData(str: ByteArray?, a: Int, b: Int, callBack: NFCCallBack): Boolean { |
| | | try { |
| | | return adapter.writeData(str, a, b,false,callBack) |
| | | return adapter.writeData(str, a, b, false, callBack) |
| | | } catch (e: Exception) { |
| | | e.printStackTrace() |
| | | } |
| | | return false |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 写卡(异步) |
| | | * |
| | | * @param userCard 用户卡内容 |
| | | * @param callBack 操作结果和消息回调 |
| | | */ |
| | | fun writeUserDataAsync(userCard: UserCard, callBack: NFCCallBack): Disposable { |
| | | showLoading() |
| | | val disposable = Observable.fromCallable { |
| | | writeUserData(userCard, callBack) |
| | | } |
| | | .subscribeOn(Schedulers.io()) |
| | | .observeOn(AndroidSchedulers.mainThread()) |
| | | .subscribe({ result -> |
| | | hideLoading() |
| | | // 结果已经在writeUserData中通过callBack回调了 |
| | | }, { error -> |
| | | hideLoading() |
| | | error.printStackTrace() |
| | | callBack.isSusses(false, "异步写卡异常: ${error.message}") |
| | | }) |
| | | |
| | | compositeDisposable.add(disposable) |
| | | return disposable |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | fun writeUserData(userCard: UserCard): Boolean { |
| | | try { |
| | | return adapter.writeUserData(userCard,7) |
| | | return adapter.writeUserData(userCard, 7) |
| | | } catch (e: java.lang.Exception) { |
| | | e.printStackTrace() |
| | | } |
| | | return false |
| | | } |
| | | |
| | | /** |
| | | * 写卡 |
| | | * |
| | | * @param userCard 用户卡内容 |
| | | * @param callBack 回调接口 |
| | | */ |
| | | fun writeUserData(userCard: UserCard, callBack: NFCCallBack): Boolean { |
| | | try { |
| | | return adapter.writeUserData(userCard, 7, callBack) |
| | | } catch (e: java.lang.Exception) { |
| | | e.printStackTrace() |
| | | callBack.isSusses(false, "写卡异常: ${e.message}") |
| | | } |
| | | return false |
| | | } |
| | | |
| | | /** |
| | | * 修改密码(异步) |
| | | * |
| | | * @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) |
| | | } catch (e: java.lang.Exception) { |
| | | e.printStackTrace() |
| | | } |
| | | return false |
| | | } |
| | | |
| | | /** |
| | | * 清除所有订阅,防止内存泄漏 |
| | | */ |
| | | fun clearDisposables() { |
| | | compositeDisposable.clear() |
| | | } |
| | | } |