From d773ab0295feba24ae4fc14f61e8aa310e40f4ba Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期五, 06 六月 2025 16:55:57 +0800
Subject: [PATCH] refactor(nfc): 优化写卡流程和状态更新

---
 generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt |  231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 229 insertions(+), 2 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..84d7111 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,16 @@
 
 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瀹炵幇
@@ -11,6 +19,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 +29,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
+    }
 
     /**
      * 鑾峰彇鍗″彿
@@ -39,6 +126,38 @@
             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
     }
 
     /**
@@ -54,6 +173,46 @@
     }
 
     /**
+     * 璇诲彇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) {
@@ -62,6 +221,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 +259,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 +309,10 @@
         }
     }
 
-
+    /**
+     * 娓呴櫎鎵�鏈夎闃咃紝闃叉鍐呭瓨娉勬紡
+     */
+    fun clearDisposables() {
+        compositeDisposable.clear()
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0