From 465c8abaa982fba6868a900d25316c70afc20fb7 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期三, 18 六月 2025 13:59:46 +0800
Subject: [PATCH] feat(card): 优化销卡功能并添加写卡操作

---
 generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt |  257 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 254 insertions(+), 3 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
index 7f2d7ab..2466055 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
@@ -2,8 +2,17 @@
 
 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.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
 
 /**
  * NFC璇诲彇宸ュ叿绫荤殑Kotlin瀹炵幇
@@ -11,6 +20,9 @@
 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
@@ -18,16 +30,92 @@
         /**
          * 鍗曚緥鍒濆鍖�
          */
-        @JvmStatic
         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
+    }
 
     /**
      * 鑾峰彇鍗″彿
@@ -41,16 +129,88 @@
         }
     }
 
+    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
+            adapter.getCradTypeAndCardNumber(7,0,8)
         } 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)
     }
 
     /**
@@ -62,6 +222,29 @@
         } 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
     }
 
     /**
@@ -77,6 +260,46 @@
     }
 
     /**
+     * 璇诲彇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) {
@@ -87,5 +310,33 @@
         }
     }
 
+    /**
+     * 娓呴櫎鎵�鏈夎闃咃紝闃叉鍐呭瓨娉勬紡
+     */
+    fun clearDisposables() {
+        compositeDisposable.clear()
+    }
 
-}
\ No newline at end of file
+    /**
+     * 璇诲彇鐢ㄦ埛鍗℃暟鎹�
+     * @return UserCard瀵硅薄锛屽鏋滆鍙栧け璐ュ垯杩斿洖null
+     */
+    fun getUserCardData(): UserCard? {
+        return try {
+            // 鑾峰彇鍩虹鍗℃暟鎹�
+            val baseCard = adapter.getUserCardData(7,UserCard())
+            // 濡傛灉鑾峰彇鎴愬姛涓旀槸UserCard绫诲瀷锛屽垯杩斿洖
+            if (baseCard is UserCard) {
+                baseCard
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+    }
+
+
+}
+

--
Gitblit v1.8.0