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/NfcWreatHelper.kt |  179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 175 insertions(+), 4 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
index 4c5b085..b80183e 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
@@ -2,13 +2,25 @@
 
 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
@@ -26,6 +38,69 @@
         }
     }
 
+    /**
+     * 璁剧疆鍔犺浇鍔ㄧ敾瑙嗗浘
+     */
+    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?) {
+                    // 杩欎釜鍥炶皟鍦↖O绾跨▼涓紝涓嶅鐞哢I鐩稿叧鎿嶄綔
+                }
+            })
+        }
+        .subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+        .subscribe({ result ->
+            hideLoading()
+            callback(result)
+        }, { error ->
+            hideLoading()
+            error.printStackTrace()
+            callback(false)
+        })
+        
+        compositeDisposable.add(disposable)
+        return disposable
+    }
 
     /**
      * 鍐欏崱
@@ -35,13 +110,41 @@
      * @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()
+            // 缁撴灉宸茬粡鍦╳riteUserData涓�氳繃callBack鍥炶皟浜�
+        }, { error ->
+            hideLoading()
+            error.printStackTrace()
+            callBack.isSusses(false, "寮傛鍐欏崱寮傚父: ${error.message}")
+        })
+        
+        compositeDisposable.add(disposable)
+        return disposable
     }
 
     /**
@@ -52,12 +155,80 @@
      */
     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()
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0