package com.dayu.general.tool
|
|
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
|
|
/**
|
* 单例初始化
|
*/
|
@JvmStatic
|
fun getInstance(intent: Intent, activity: Activity): NfcWreatHelper {
|
if (helper == null) {
|
helper = NfcWreatHelper(intent, activity)
|
}
|
helper!!.adapter.setIntent(intent)
|
return helper!!
|
}
|
}
|
|
/**
|
* 设置加载动画视图
|
*/
|
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 str 书写内容,16个字节
|
* @param a 书写的扇区 (从0开始数)
|
* @param b 书写的块(从0开始数)
|
* @param
|
*/
|
fun writeData(str: ByteArray?, a: Int, b: Int, callBack: NFCCallBack): Boolean {
|
try {
|
return adapter.writeData(str, a, b, false, callBack)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return false
|
}
|
|
/**
|
* 写卡(异步)
|
*
|
* @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 用户卡内容
|
* @param
|
*/
|
fun writeUserData(userCard: UserCard): Boolean {
|
try {
|
return adapter.writeUserData(userCard, 7)
|
} catch (e: java.lang.Exception) {
|
e.printStackTrace()
|
}
|
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()
|
}
|
}
|