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.BaseNfcReadHelper
|
import com.dayu.baselibrary.tools.nfc.NfcReadAdapter
|
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
|
|
/**
|
* NFC读取工具类的Kotlin实现
|
*/
|
class NfcReadHelper private constructor(intent: Intent, activity: Activity) : GeBaseHelper(activity) {
|
|
private val adapter: NfcReadAdapter = NfcReadAdapter(intent, activity)
|
private val compositeDisposable = CompositeDisposable()
|
private var loadingContainer: RelativeLayout? = null
|
private var progressWheel: ProgressWheel? = null
|
|
companion object {
|
private var helper: NfcReadHelper? = null
|
|
/**
|
* 单例初始化
|
*/
|
fun getInstance(intent: Intent, activity: Activity): NfcReadHelper {
|
if (helper == null) {
|
helper = NfcReadHelper(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()
|
}
|
}
|
|
/**
|
* 获取卡号(异步)
|
*/
|
fun getCardNumberAsync(callback: (String) -> Unit): Disposable {
|
showLoading()
|
val disposable = Observable.fromCallable {
|
getCardNumber()
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ result ->
|
hideLoading()
|
callback(result)
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback("")
|
})
|
|
compositeDisposable.add(disposable)
|
return disposable
|
}
|
|
/**
|
* 获取卡号(不关闭连接,异步)
|
*/
|
fun getCardNumberNoCloseAsync(callback: (String) -> Unit): Disposable {
|
showLoading()
|
val disposable = Observable.fromCallable {
|
getCardNumberNoClose()
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ result ->
|
hideLoading()
|
callback(result)
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback("")
|
})
|
|
compositeDisposable.add(disposable)
|
return disposable
|
}
|
|
/**
|
* 获取卡号
|
*/
|
fun getCardNumber(): String {
|
return try {
|
adapter.cardNumber
|
} catch (e: Exception) {
|
e.printStackTrace()
|
""
|
}
|
}
|
|
fun getCardNumberNoClose():String{
|
return try {
|
adapter.cardNumberNoClose
|
} catch (e: Exception) {
|
e.printStackTrace()
|
""
|
}
|
}
|
|
/**
|
* 获取卡片类型和卡号(异步)
|
*/
|
fun getCardTypeAndCardNumberAsync(callback: (String) -> Unit): Disposable {
|
showLoading()
|
val disposable = Observable.fromCallable {
|
getCardTypeAndCardNumber()
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ result ->
|
hideLoading()
|
callback(result)
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback("")
|
})
|
|
compositeDisposable.add(disposable)
|
return disposable
|
}
|
|
/**
|
* 获取卡片类型和卡号
|
*/
|
fun getCardTypeAndCardNumber(): String {
|
return try {
|
adapter.cradTypeAndCardNumber
|
} catch (e: Exception) {
|
e.printStackTrace()
|
""
|
}
|
}
|
|
/**
|
* 读取NFC卡的全部信息(异步)
|
*/
|
fun getAllDataAsync(callback: BaseNfcReadHelper.NFCCallMapback) {
|
showLoading()
|
val disposable = Observable.fromCallable {
|
try {
|
adapter.getAllData(object : BaseNfcReadHelper.NFCCallMapback {
|
override fun callBack(data: Map<String, List<ByteArray>>) {
|
hideLoading()
|
callback.callBack(data)
|
}
|
|
override fun error(code: Int) {
|
hideLoading()
|
callback.error(code)
|
}
|
})
|
true
|
} catch (e: Exception) {
|
e.printStackTrace()
|
false
|
}
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ success ->
|
if (!success) {
|
hideLoading()
|
callback.error(-1)
|
}
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback.error(-1)
|
})
|
|
compositeDisposable.add(disposable)
|
}
|
|
/**
|
* 读取NFC卡的全部信息
|
*/
|
fun getAllData(callback: BaseNfcReadHelper.NFCCallMapback) {
|
try {
|
adapter.getAllData(callback)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
}
|
|
/**
|
* 获取一个扇区的数据(异步)
|
*/
|
fun getOneSectorDataAsync(callback: (List<ByteArray>?) -> Unit): Disposable {
|
showLoading()
|
val disposable = Observable.fromCallable<Any> {
|
getOneSectorData() as Any
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ result ->
|
hideLoading()
|
callback(result as? List<ByteArray>)
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback(null)
|
})
|
|
compositeDisposable.add(disposable)
|
return disposable
|
}
|
|
/**
|
* 获取一个扇区的数据
|
*/
|
fun getOneSectorData(): List<ByteArray>? {
|
return try {
|
adapter.onesectorData
|
} catch (e: Exception) {
|
e.printStackTrace()
|
null
|
}
|
}
|
|
/**
|
* 读取NFC卡的特定扇区信息(异步)
|
*/
|
fun getDataAsync(a: Int, b: Int, callback: BaseNfcReadHelper.NFCCallByteback) {
|
showLoading()
|
val disposable = Observable.fromCallable {
|
try {
|
adapter.getData(a, b, object : BaseNfcReadHelper.NFCCallByteback {
|
override fun callBack(data: ByteArray) {
|
hideLoading()
|
callback.callBack(data)
|
}
|
|
override fun error(code: Int) {
|
hideLoading()
|
callback.error(code)
|
}
|
})
|
true
|
} catch (e: Exception) {
|
e.printStackTrace()
|
false
|
}
|
}
|
.subscribeOn(Schedulers.io())
|
.observeOn(AndroidSchedulers.mainThread())
|
.subscribe({ success ->
|
if (!success) {
|
hideLoading()
|
callback.error(-1)
|
}
|
}, { error ->
|
hideLoading()
|
error.printStackTrace()
|
callback.error(-1)
|
})
|
|
compositeDisposable.add(disposable)
|
}
|
|
/**
|
* 读取NFC卡的特定扇区信息
|
*/
|
fun getData(a: Int, b: Int, callback: BaseNfcReadHelper.NFCCallByteback) {
|
try {
|
adapter.getData(a, b, callback)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
}
|
|
/**
|
* 清除所有订阅,防止内存泄漏
|
*/
|
fun clearDisposables() {
|
compositeDisposable.clear()
|
}
|
}
|