From c3edd4a3122b711bc6a0bfef56b6ff6bf5ae03e2 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期二, 13 五月 2025 09:09:23 +0800
Subject: [PATCH] feat(generallibrary): 优化用户开卡流程并添加支付方式功能
---
generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt | 18 +
generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt | 32 +-
generallibrary/src/main/res/layout/fragment_card.xml | 47 ---
generallibrary/src/main/res/drawable/shape_status_bg.xml | 6
generallibrary/src/main/res/values/dimens.xml | 8
generallibrary/src/main/res/drawable/shape_click_tip_bg.xml | 9
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java | 129 ++++++++++-
README.md | 5
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java | 10
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt | 205 +++++++++++++++---
generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt | 2
generallibrary/src/main/res/drawable/xiaoka.xml | 9
generallibrary/src/main/res/layout/activity_new_card_1_ge.xml | 110 ++++-----
generallibrary/src/main/cpp/general-native-lib.cpp | 27 +-
generallibrary/src/main/res/drawable/guashi.xml | 24 ++
15 files changed, 461 insertions(+), 180 deletions(-)
diff --git a/README.md b/README.md
index 5b607f1..f276ded 100644
--- a/README.md
+++ b/README.md
@@ -366,6 +366,11 @@
- 鏁忔劅鏁版嵁闇�瑕佸姞瀵嗗瓨鍌�
- 娉ㄦ剰鐢ㄦ埛鏁版嵁鐨勫畨鍏ㄥ鐞�
+4. 寮傚父澶勭悊
+ - 鎵�鏈塼ry catch鍧椾腑蹇呴』浣跨敤`CrashReport.postCatchedException(e)`涓婃姤寮傚父
+ - 纭繚寮傚父淇℃伅琚纭褰曞拰涓婃姤
+ - 閬垮厤寮傚父淇℃伅娉勯湶鏁忔劅鏁版嵁
+
## 璐$尞鎸囧崡
1. Fork 椤圭洰
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
index 22349c3..ba9a494 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -12,6 +12,7 @@
import com.tencent.bugly.crashreport.CrashReport;
import java.io.IOException;
+import java.util.List;
/**
* author: zuo
@@ -249,12 +250,120 @@
/**
* 淇敼瀵嗙爜
*
- * @param a 涔﹀啓鐨勬墖鍖�
- * // * @param callback 杩斿洖鐩戝惉
+ * @param 涔﹀啓鐨勬墖鍖�
+ * @param passWord 瀵嗙爜
+ * @return
+ */
+ public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
+ if (passWord == null || passWord.size()!=16) {
+ if (callBack != null) {
+ callBack.isSusses(false, "瀵嗙爜鏁扮粍涓虹┖鎴栭暱搴︿笉涓�16");
+ }
+ return false;
+ }
+ try {
+ MifareClassic mfc = MifareClassic.get(tag);
+ if (mfc == null) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鑾峰彇MifareClassic瀹炰緥澶辫触");
+ }
+ return false;
+ }
+
+ try {
+ // 杩炴帴NFC
+ if (isConnect) {
+ mfc.connect();
+ }
+ for (int i = 0; i < passWord.size(); i++) {
+ byte [] passWordItem = passWord.get(i);
+ // 楠岃瘉鎵囧尯瀵嗙爜
+ boolean isAuthenticated = false;
+
+ // 灏濊瘯浣跨敤榛樿瀵嗛挜楠岃瘉
+ if (mfc.authenticateSectorWithKeyA(i, defauleKey)) {
+ isAuthenticated = true;
+ } else if (mfc.authenticateSectorWithKeyA(i, listA_PS.get(i))) {
+ continue;
+ }
+ if (!isAuthenticated) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "瀵嗙爜楠岃瘉澶辫触");
+ }
+ return false;
+ }
+
+ // 鍑嗗鏁版嵁
+ byte[] data = new byte[16];
+
+ if (passWordItem.length == 16) {
+ // 濡傛灉鏄畬鏁寸殑16瀛楄妭鏁版嵁锛岀洿鎺ヤ娇鐢�
+ System.arraycopy(passWordItem, 0, data, 0, 16);
+ } else if (passWordItem.length == 6) {
+ // 濡傛灉鍙槸6瀛楄妭瀵嗛挜锛屾瀯寤哄畬鏁寸殑鎺у埗鍧�
+ // 灏嗗瘑鐮佽浆鎹负keyA
+ System.arraycopy(passWordItem, 0, data, 0, 6);
+ // 杈撳叆鎺у埗浣�
+ data[6] = (byte) 0xFF;
+ data[7] = (byte) 0x07;
+ data[8] = (byte) 0x80;
+ data[9] = (byte) 0x69;
+ // 灏嗗瘑鐮佷綔涓篕eyB
+ System.arraycopy(passWordItem, 0, data, 10, 6);
+ } else {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "瀵嗙爜闀垮害涓嶆纭紝搴斾负6瀛楄妭鎴�16瀛楄妭");
+ }
+ return false;
+ }
+
+ // 鑾峰彇鍐欏叆浣嶇疆
+ int bIndex = mfc.sectorToBlock(i);
+ int bCount = mfc.getBlockCountInSector(i);
+
+ try {
+ // 鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡(鎺у埗鍧�)
+ mfc.writeBlock(bIndex + bCount - 1, data);
+ } catch (IOException e) {
+ if (callBack != null) {
+ callBack.isSusses(false, "鎵囧尯" + i + "鍐欏叆鎺у埗鍧楀け璐�: " + e.getMessage());
+ }
+ return false;
+ }
+ }
+
+ if (callBack != null) {
+ callBack.isSusses(true, "鎵�鏈夋墖鍖哄瘑鐮佷慨鏀规垚鍔�");
+ }
+ return true;
+ } finally {
+ try {
+ if (isClose) {
+ mfc.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ CrashReport.postCatchedException(e);
+ if (callBack != null) {
+ callBack.isSusses(false, "淇敼瀵嗙爜鏃跺彂鐢熷紓甯�: " + e.getMessage());
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 淇敼瀵嗙爜
+ *
+ * @param a 鎵囧尯
+ * @param mfc MifareClassic瀹炰緥
+ * @return
*/
@Override
public boolean changePasword(int a, MifareClassic mfc) {
-
byte[] data = new byte[16];
if (null != mfc) {
try {
@@ -277,26 +386,20 @@
int bCount = mfc.getBlockCountInSector(a);
//鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
mfc.writeBlock(bIndex + bCount - 1, data);
+
return true;
} catch (Exception e) {
e.printStackTrace();
+ CrashReport.postCatchedException(e);
+
return false;
}
}
+
return false;
}
- public boolean changePasword(int a,byte[] passWord, MifareClassic mfc) {
- try {
-
-
- } catch (Exception e) {
- e.printStackTrace();
- CrashReport.postCatchedException(e);
- }
- return false;
- }
/**
* 鍒濆鍖栧崱
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
index d10fedc..14e1e19 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
@@ -8,6 +8,8 @@
import com.dayu.baselibrary.bean.BaseUserCardCard;
import com.dayu.baselibrary.utils.ModelUtils;
+import java.util.List;
+
/**
* author: zuo
* Date: 2024-09-26
@@ -79,4 +81,12 @@
}
return false;
}
+
+ public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
+ switch (BaseNfcActivity.adapterType) {
+ case ModelUtils.defaultType:
+ return nativeNfcWriteHelper.changePasword(passWord,isConnect, isClose,callBack);
+ }
+ return false;
+ }
}
diff --git a/generallibrary/src/main/cpp/general-native-lib.cpp b/generallibrary/src/main/cpp/general-native-lib.cpp
index cf264e2..e961a69 100644
--- a/generallibrary/src/main/cpp/general-native-lib.cpp
+++ b/generallibrary/src/main/cpp/general-native-lib.cpp
@@ -39,7 +39,8 @@
0x8E, 0x93, 0xB5, 0x44, 0x8D, 0x42, 0x22, 0x84, 0x95, 0x33, 0x22, 0x93,
0x42, 0x82, 0xA3, 0x35, 0x91, 0x33, 0x13, 0x93, 0x71, 0x21, 0x01, 0x71,
0x37, 0x9F, 0xA6, 0x68, 0x92, 0x86, 0x46, 0x72, 0x43, 0x62, 0x12, 0x52,
- 0x5D, 0x85, 0x93, 0x86, 0x82, 0x46, 0x31, 0x86, 0x57, 0x48, 0x16, 0x88,
+ // 鎵囧尯14瀵嗙爜 (鍩轰簬鎵囧尯13鐨刋OR瀵嗛挜閲嶆柊璁$畻涓�27562CCFE9F7)
+ 0x5D, 0xE5, 0x93, 0x86, 0x82, 0x46, 0x31, 0x86, 0x57, 0x48, 0x16, 0x88,
0x97, 0x73, 0xB5, 0x47, 0x95, 0x55, 0x36, 0x69, 0x49, 0x58, 0x18, 0x6A,
0xEA, 0x46, 0x84, 0x93, 0x82, 0x19, 0x29, 0x91, 0x31, 0x1C, 0x0C, 0x7D
};
@@ -95,19 +96,19 @@
return nullptr;
}
-// __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypting sector %d", sector);
-// __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Encrypted data: %02X %02X %02X %02X %02X %02X",
-// encrypted_data[0], encrypted_data[1], encrypted_data[2],
-// encrypted_data[3], encrypted_data[4], encrypted_data[5]);
-// __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Using XOR key: %02X %02X %02X %02X %02X %02X",
-// XOR_KEYS[sector][0], XOR_KEYS[sector][1], XOR_KEYS[sector][2],
-// XOR_KEYS[sector][3], XOR_KEYS[sector][4], XOR_KEYS[sector][5]);
+ __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypting sector %d", sector);
+ __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Encrypted data: %02X %02X %02X %02X %02X %02X",
+ encrypted_data[0], encrypted_data[1], encrypted_data[2],
+ encrypted_data[3], encrypted_data[4], encrypted_data[5]);
+ __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Using XOR key: %02X %02X %02X %02X %02X %02X",
+ XOR_KEYS[sector][0], XOR_KEYS[sector][1], XOR_KEYS[sector][2],
+ XOR_KEYS[sector][3], XOR_KEYS[sector][4], XOR_KEYS[sector][5]);
unsigned char decrypted[6];
for (int i = 0; i < 6; i++) {
decrypted[i] = encrypted_data[i] ^ XOR_KEYS[sector][i];
-// __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Byte %d: %02X ^ %02X = %02X",
-// i, encrypted_data[i], XOR_KEYS[sector][i], decrypted[i]);
+ __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Byte %d: %02X ^ %02X = %02X",
+ i, encrypted_data[i], XOR_KEYS[sector][i], decrypted[i]);
}
std::string result;
@@ -118,7 +119,7 @@
result += hex;
}
-// __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypted result: %s", result.c_str());
+ __android_log_print(ANDROID_LOG_INFO, "GeBaseHelper", "Decrypted result: %s", result.c_str());
return env->NewStringUTF(result.c_str());
}
@@ -239,7 +240,7 @@
// 瑙e瘑骞惰浆鎹㈡瘡涓墖鍖哄瘑閽�
for (size_t i = 0; i < numKeys; i++) {
-// __android_log_print(ANDROID_LOG_DEBUG, "M1Card", "澶勭悊鎵囧尯 %zu 鐨勫瘑閽�", i);
+ __android_log_print(ANDROID_LOG_DEBUG, "M1Card", "澶勭悊鎵囧尯 %zu 鐨勫瘑閽�", i);
// 纭繚涓嶄細瓒婄晫璁块棶
if (i * 12 + 6 > sizeof(ENCRYPTED_SECTOR_KEYS)) {
@@ -251,7 +252,7 @@
jstring decrypted_str = decrypt_key(env, ENCRYPTED_SECTOR_KEYS + (i * 12), 6);
if (!decrypted_str) {
-// __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to decrypt key for sector %zu", i);
+ __android_log_print(ANDROID_LOG_ERROR, "M1Card", "Failed to decrypt key for sector %zu", i);
continue;
}
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
index dbaf55e..2ebe743 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -5,9 +5,11 @@
import android.text.Editable
import android.text.TextWatcher
import android.view.View
+import android.widget.RadioButton
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.tools.nfc.NFCCallBack
import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
import com.dayu.general.BaseApplication
import com.dayu.general.R
@@ -17,7 +19,10 @@
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.NfcReadHelper
+import com.dayu.general.tool.NfcWreatHelper
+import com.tencent.bugly.crashreport.CrashReport
import kotlinx.coroutines.launch
+import android.util.TypedValue
/**
* Description: 鐢ㄦ埛寮�鍗$晫闈�(鍚屾淇敼鐧藉崱瀵嗙爜)
@@ -30,6 +35,12 @@
// 鏀粯鏂瑰紡
private var paymentMethod: String = "鐜伴噾"
+
+ // 鏀粯鏂瑰紡ID
+ private var paymentId: Long = 0
+
+ // 鏀粯鏂瑰紡鍒楄〃
+ private var paymentMethodList: List<PaymentMethod> = listOf()
// 鍗$墿鐞咺D
private var cardPhysicalId: String = ""
@@ -41,12 +52,31 @@
private const val TAG = "NewCard2Activity"
}
+ // 鏀粯鏂瑰紡鏁版嵁绫�
+ data class PaymentMethod(
+ val id: Long,
+ val name: String,
+ val remarks: String,
+ val deleted: Int
+ )
+
+ // 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫�
+ data class PaymentMethodResponse(
+ val itemTotal: Any?,
+ val obj: List<PaymentMethod>,
+ val pageCurr: Any?,
+ val pageSize: Any?,
+ val pageTotal: Any?
+ )
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityNewCard1GeBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
+ // 鑾峰彇鏀粯鏂瑰紡
+ getPaymentMethods()
initListener()
}
@@ -75,6 +105,88 @@
// 璁剧疆閲戦杈撳叆闄愬埗涓轰袱浣嶅皬鏁�
binding.newCardRechargeAmount.addTextChangedListener(createDecimalTextWatcher())
binding.newCardCardFee.addTextChangedListener(createDecimalTextWatcher())
+ }
+
+ /**
+ * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+ */
+ private fun getPaymentMethods() {
+ ApiManager.getInstance().requestGetLoading(
+ this,
+ "sell/paymentmethod/get",
+ PaymentMethodResponse::class.java,
+ null,
+ object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
+ override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+ if (response.success) {
+ // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+ val paymentMethods = response.content?.obj ?: listOf()
+ if (paymentMethods.isNotEmpty()) {
+ paymentMethodList = paymentMethods
+ // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+ updatePaymentMethodRadioGroup()
+ }
+ } else {
+ Toast.makeText(
+ this@NewCard2Activity,
+ "鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+
+ override fun onError(e: Throwable?) {
+ super.onError(e)
+ Toast.makeText(
+ this@NewCard2Activity,
+ "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ )
+ }
+
+ /**
+ * 鏇存柊鏀粯鏂瑰紡RadioGroup
+ */
+ private fun updatePaymentMethodRadioGroup() {
+ // 娓呯┖鍘熸湁RadioButton
+ binding.newCardPaymentMethod.removeAllViews()
+
+ // 鍔ㄦ�佹坊鍔燫adioButton
+ paymentMethodList.forEachIndexed { index, method ->
+ val radioButton = RadioButton(this)
+ radioButton.id = View.generateViewId() // 鐢熸垚鍞竴ID
+ radioButton.layoutParams = android.widget.LinearLayout.LayoutParams(
+ 0,
+ resources.getDimensionPixelSize(R.dimen.dimen_40),
+ 1.0f
+ )
+
+ // 濡傛灉涓嶆槸鏈�鍚庝竴涓寜閽紝娣诲姞鍙宠竟璺�
+ if (index < paymentMethodList.size - 1) {
+ (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin =
+ resources.getDimensionPixelSize(R.dimen.dimen_15)
+ }
+
+ radioButton.text = method.name
+ radioButton.background = resources.getDrawable(R.drawable.radio_selector)
+ radioButton.buttonDrawable = null
+ radioButton.gravity = android.view.Gravity.CENTER
+ radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
+ radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
+
+ // 娣诲姞鍒癛adioGroup
+ binding.newCardPaymentMethod.addView(radioButton)
+
+ // 榛樿閫変腑绗竴涓�
+ if (index == 0) {
+ radioButton.isChecked = true
+ paymentMethod = method.name
+ paymentId = method.id
+ }
+ }
}
/**
@@ -109,11 +221,14 @@
private fun initListener() {
// 璁剧疆鏀粯鏂瑰紡閫夋嫨鐩戝惉
binding.newCardPaymentMethod.setOnCheckedChangeListener { group, checkedId ->
- paymentMethod = when (checkedId) {
- R.id.newCard_cashPayment -> "鐜伴噾"
- R.id.newCard_posPayment -> "POS鏈�"
- R.id.newCard_bankTransfer -> "閾惰杞处"
- else -> "鐜伴噾"
+ // 鏍规嵁閫変腑鐨処D鑾峰彇鏀粯鏂瑰紡
+ for (i in 0 until group.childCount) {
+ val radioButton = group.getChildAt(i) as RadioButton
+ if (radioButton.id == checkedId) {
+ paymentMethod = radioButton.text.toString()
+ paymentId = paymentMethodList[i].id
+ break
+ }
}
}
@@ -142,14 +257,6 @@
val formattedRechargeAmount = String.format("%.2f", rechargeAmount)
val formattedCardFee = String.format("%.2f", cardFee)
- // 鑾峰彇鏀粯鏂瑰紡ID
- val paymentId = when (paymentMethod) {
- "鐜伴噾" -> 1
- "POS鏈�" -> 2
- "閾惰杞处" -> 3
- else -> 1
- }
-
val remark = binding.newCardRemark.text.toString()
// 鏋勫缓璇锋眰鍙傛暟
@@ -158,7 +265,7 @@
params["clientNum"] = binding.newCardFarmerCode.text.toString() // 鍐滄埛缂栧彿
params["cardCost"] = (cardFee * 100).toInt() // 璐崱閲戦锛堝伐鏈垂锛夎浆涓哄垎
params["amount"] = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆涓哄垎
- params["paymentId"] = paymentId // 鏀粯鏂瑰紡
+ params["paymentId"] = paymentId // 鏀粯鏂瑰紡ID
params["remarks"] = remark // 澶囨敞
params["operator"] = BaseApplication.userId // 鎿嶄綔浜篒D
@@ -179,20 +286,30 @@
farmerCode = binding.newCardFarmerCode.text.toString(),
cardFee = cardFee,
remark = binding.newCardRemark.text.toString(),
- paymentMethod = paymentId,
+ paymentMethod = paymentId.toInt(),
isReported = true,
isCardWritten = true
)
-
+
// 浣跨敤鍗忕▼鍦ㄥ悗鍙扮嚎绋嬩腑淇濆瓨鏁版嵁
lifecycleScope.launch {
try {
- BaseDaoSingleton.getInstance(this@NewCard2Activity).cardRegistrationDao().insert(cardRegistration)
- Toast.makeText(this@NewCard2Activity, "寮�鍗℃垚鍔�", Toast.LENGTH_SHORT).show()
+ BaseDaoSingleton.getInstance(this@NewCard2Activity)
+ .cardRegistrationDao().insert(cardRegistration)
+ Toast.makeText(
+ this@NewCard2Activity,
+ "寮�鍗℃垚鍔�",
+ Toast.LENGTH_SHORT
+ ).show()
setResult(RESULT_OK)
finish()
} catch (e: Exception) {
- Toast.makeText(this@NewCard2Activity, "淇濆瓨寮�鍗′俊鎭け璐�: ${e.message}", Toast.LENGTH_SHORT).show()
+ CrashReport.postCatchedException(e)
+ Toast.makeText(
+ this@NewCard2Activity,
+ "淇濆瓨寮�鍗′俊鎭け璐�: ${e.message}",
+ Toast.LENGTH_SHORT
+ ).show()
}
}
} else {
@@ -231,23 +348,45 @@
}
override fun onNfcBack(intent: Intent) {
- var cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumber()
+ var cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
if (!cardNumber.isEmpty()) {
- // 淇濆瓨鍗$墿鐞咺D
- cardPhysicalId = cardNumber
- // 鏇存柊UI
- binding.newCardArerNumber.text = cardNumber
- // 闅愯棌NFC璇诲崱鐣岄潰
- binding.nfcContainer.visibility = View.GONE
- binding.centerScroll.visibility = View.VISIBLE
- binding.newCardRegistBtn.visibility = View.VISIBLE
+ try {
+ // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException
+ val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
+
+ NfcWreatHelper.getInstance(intent, this).changePS(keyList, false, true, object :
+ NFCCallBack {
+
+ override fun isSusses(flag: Boolean, msg: String?) {
+ if (flag) {
+ // 淇濆瓨鍗$墿鐞咺D
+ cardPhysicalId = cardNumber
+ // 鏇存柊UI
+ binding.newCardArerNumber.text = cardNumber
+ // 闅愯棌NFC璇诲崱鐣岄潰
+ binding.nfcContainer.visibility = View.GONE
+ binding.centerScroll.visibility = View.VISIBLE
+ binding.newCardRegistBtn.visibility = View.VISIBLE
+ } else {
+ // 瀵嗙爜淇敼澶辫触锛屽鐞嗛敊璇儏鍐�
+ Toast.makeText(
+ this@NewCard2Activity,
+ "鍗$墖鍒濆鍖栧け璐ワ細" + msg,
+ Toast.LENGTH_LONG
+ )
+ .show()
+ }
+ }
+ })
+
+
+ } catch (e: Exception) {
+ // 澶勭悊寮傚父鎯呭喌
+ CrashReport.postCatchedException(e)
+ e.printStackTrace()
+ }
}
}
-
-
-
-
-
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt
index 9f9311c..b66c4df 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt
@@ -160,7 +160,7 @@
// 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
ApiManager.getInstance().requestGetLoading(
this,
- "sell/client/get",
+ "terminal/client/getTermClients",
SearchUserResult::class.java,
map,
object : SubscriberListener<BaseResponse<SearchUserResult>>() {
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
index c2d4b5d..c007a9b 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
@@ -19,27 +19,29 @@
private external fun getM1SectorKeySecure(context: Context, sectorIndex: Int): String
init {
- try {
- // 鑾峰彇鎵�鏈夋墖鍖哄瘑閽�
- val allKeys: String = getM1SectorKeySecure(context, 0)
- if (allKeys.isNotEmpty()) {
- val keys: Array<String> = allKeys.split(",").dropLastWhile { it.isEmpty() }.toTypedArray()
- for (i in keys.indices) {
- val key = keys[i]
- if (key.isNotEmpty()) {
- listA_PS.add(HexUtil.hexToByteArray(key))
+ if(listA_PS.isEmpty()){
+ try {
+ // 鑾峰彇鎵�鏈夋墖鍖哄瘑閽�
+ val allKeys: String = getM1SectorKeySecure(context, 0)
+ if (allKeys.isNotEmpty()) {
+ val keys: Array<String> = allKeys.split(",").dropLastWhile { it.isEmpty() }.toTypedArray()
+ for (i in keys.indices) {
+ val key = keys[i]
+ if (key.isNotEmpty()) {
+ listA_PS.add(HexUtil.hexToByteArray(key))
+ }
}
}
+ defauleKey = HexUtil.hexToByteArray("FFFFFFFFFFFF")
+ } catch (e: Exception) {
+ e.printStackTrace()
+ // 璁剧疆榛樿瀵嗛挜
+ defauleKey = HexUtil.hexToByteArray("FFFFFFFFFFFF")
}
- defauleKey = HexUtil.hexToByteArray("FFFFFFFFFFFF")
- } catch (e: Exception) {
- e.printStackTrace()
- // 璁剧疆榛樿瀵嗛挜
- defauleKey = HexUtil.hexToByteArray("FFFFFFFFFFFF")
}
}
fun getKeyList(): List<ByteArray> {
- return listKeyA
+ return listA_PS
}
}
\ No newline at end of file
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..0a6e18c 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
@@ -6,7 +6,8 @@
import com.dayu.baselibrary.tools.nfc.NfcWriteAdapter
import com.dayu.general.bean.card.UserCard
-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)
@@ -35,9 +36,9 @@
* @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()
}
@@ -52,7 +53,16 @@
*/
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
+ }
+
+ 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()
}
diff --git a/generallibrary/src/main/res/drawable/guashi.xml b/generallibrary/src/main/res/drawable/guashi.xml
new file mode 100644
index 0000000..5837549
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/guashi.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="200dp"
+ android:height="200dp"
+ android:viewportWidth="1024"
+ android:viewportHeight="1024">
+ <path
+ android:pathData="M343.9,215m0,29.4l0,6.4q0,29.4 -29.4,29.4l-71.7,0q-29.4,0 -29.4,-29.4l0,-6.4q0,-29.4 29.4,-29.4l71.7,0q29.4,0 29.4,29.4Z"
+ android:fillColor="#009ad6"/>
+ <path
+ android:pathData="M834.1,759.5m0,32.4l0,0.4q0,32.4 -32.4,32.4l-46.1,0q-32.4,0 -32.4,-32.4l0,-0.4q0,-32.4 32.4,-32.4l46.1,0q32.4,0 32.4,32.4Z"
+ android:fillColor="#009ad6"/>
+ <path
+ android:pathData="M113.5,377.2m0,-30.7l0,-3.8q0,-30.7 30.7,-30.7l726.2,0q30.7,0 30.7,30.7l0,3.8q0,30.7 -30.7,30.7l-726.2,0q-30.7,0 -30.7,-30.7Z"
+ android:fillColor="#009ad6"/>
+ <path
+ android:pathData="M505.6,867.8H175.4A93,93 0,0 1,85.3 771.8V203.1a93,93 0,0 1,89.6 -96h660.5a93,93 0,0 1,89.6 96v272.2a32.4,32.4 0,0 1,-64.9 0V203.1a28.6,28.6 0,0 0,-24.7 -32.4H175.4a28.6,28.6 0,0 0,-24.3 30.7v570.5a28.6,28.6 0,0 0,24.3 30.7h330.2a32.9,32.9 0,0 1,0 65.3z"
+ android:fillColor="#009ad6"/>
+ <path
+ android:pathData="M887.5,922.9h-218a51.2,51.2 0,0 1,-50.8 -50.8v-160a50.8,50.8 0,0 1,50.8 -50.8h218a50.8,50.8 0,0 1,51.2 50.8v160a51.2,51.2 0,0 1,-51.2 50.8zM682.7,857.6h189V725.3H682.7z"
+ android:fillColor="#009ad6"/>
+ <path
+ android:pathData="M845.7,689.5a32.9,32.9 0,0 1,-32.9 -32.9c0,-58 -19.2,-58 -34.1,-58s-34.6,0 -34.6,58a32.9,32.9 0,1 1,-65.3 0c0,-77.2 37.1,-123.3 99.8,-123.3 37.1,0 99.4,15.8 99.4,123.3a32.9,32.9 0,0 1,-32.4 32.9z"
+ android:fillColor="#009ad6"/>
+</vector>
diff --git a/generallibrary/src/main/res/drawable/shape_click_tip_bg.xml b/generallibrary/src/main/res/drawable/shape_click_tip_bg.xml
new file mode 100644
index 0000000..e09c653
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/shape_click_tip_bg.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="10dp" />
+ <stroke
+ android:width="1dp"
+ android:color="@color/colorPrimary" />
+ <solid android:color="#EEFFFFFF" />
+</shape>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/shape_status_bg.xml b/generallibrary/src/main/res/drawable/shape_status_bg.xml
new file mode 100644
index 0000000..811ca2a
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/shape_status_bg.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="12dp" />
+ <solid android:color="@color/colorPrimary" />
+</shape>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/xiaoka.xml b/generallibrary/src/main/res/drawable/xiaoka.xml
new file mode 100644
index 0000000..988c5be
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/xiaoka.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="200dp"
+ android:height="200dp"
+ android:viewportWidth="1024"
+ android:viewportHeight="1024">
+ <path
+ android:pathData="M532.5,726L196.6,726c-2,-2.6 -3.6,-6.7 -3.1,-10.8L193.5,466.4h599L792.6,409.6h-599L193.5,280.6c-0.5,-4.1 1,-8.2 3.1,-10.8h612.9c2,2.6 3.6,6.7 3.1,10.8v218.1c0.5,15.4 13.3,28.2 29.2,27.6 16.4,0.5 29.2,-12.3 29.2,-27.6L870.9,280.6c0,-36.9 -25.6,-69.1 -61.4,-69.1L196.6,211.5c-35.8,0 -61.4,32.3 -61.4,69.1v434.7c0,36.9 25.6,69.1 61.4,69.1L532.5,784.4c15.9,0 28.7,-12.8 29.2,-29.2 -0.5,-15.4 -13.3,-28.7 -29.2,-29.2zM890.4,575.5l-34.8,-34.8 -104.4,104.4 -104.4,-104.4 -34.8,34.8 104.4,104.4 -104.4,104.4 34.8,34.8 104.4,-104.4 104.4,104.4 34.8,-34.8 -104.4,-104.4 104.4,-104.4z"
+ android:fillColor="#009ad6"/>
+</vector>
diff --git a/generallibrary/src/main/res/layout/activity_new_card_1_ge.xml b/generallibrary/src/main/res/layout/activity_new_card_1_ge.xml
index adba47f..4567eec 100644
--- a/generallibrary/src/main/res/layout/activity_new_card_1_ge.xml
+++ b/generallibrary/src/main/res/layout/activity_new_card_1_ge.xml
@@ -24,7 +24,7 @@
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="24dp"
- android:visibility="gone"
+ android:visibility="visible"
app:cardBackgroundColor="@android:color/white"
app:cardCornerRadius="12dp"
app:cardElevation="4dp"
@@ -54,9 +54,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
- android:text="锛堝皢鑾峰彇鐗╃悊鍗″崱鍙凤級"
- android:textColor="#999999"
+ android:text="灏嗚繘琛屽垵濮嬪寲鍗$墖\n鑰楁椂杈冮暱璇蜂笉瑕佺Щ鍔ㄥ崱鐗�"
+ android:textColor="@color/base_blue_bg"
android:textSize="18sp"
+ android:layout_marginTop="20dp"
android:textStyle="bold" />
<ImageView
@@ -84,7 +85,7 @@
android:layout_height="0dp"
android:fillViewport="true"
android:scrollbars="none"
- android:visibility="visible"
+ android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/titleBar">
@@ -246,24 +247,38 @@
<TextView
android:layout_width="105dp"
android:layout_height="wrap_content"
- android:text="宸ユ湰璐癸細"
+ android:text="鍏呭�奸噾棰濓細"
android:textColor="#666666"
android:textSize="@dimen/new_card_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="#FFFFFF"
- android:orientation="vertical">
+ android:background="@drawable/edit_text_bg_selector"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:paddingStart="10dp"
+ android:paddingEnd="10dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
<EditText
android:id="@+id/newCard_rechargeAmount"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@null"
- android:hint="璇疯緭鍏ュ伐鏈垂(閫夊~)"
+ android:hint="璇疯緭鍏ュ厖鍊奸噾棰�(閫夊~)"
android:inputType="numberDecimal"
android:textColor="#333333"
+ android:textColorHint="#BBBBBB"
+ android:textSize="@dimen/new_card_size" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="鍏�"
+ android:textColor="#666666"
android:textSize="@dimen/new_card_size" />
</LinearLayout>
</LinearLayout>
@@ -278,28 +293,41 @@
<TextView
android:layout_width="105dp"
android:layout_height="wrap_content"
- android:text="鍏呭�奸噾棰濓細"
+ android:text="宸ユ湰璐癸細"
android:textColor="#666666"
android:textSize="@dimen/new_card_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="#FFFFFF"
- android:orientation="vertical">
+ android:background="@drawable/edit_text_bg_selector"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:paddingStart="10dp"
+ android:paddingEnd="10dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
<EditText
android:id="@+id/newCard_cardFee"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@null"
- android:hint="璇疯緭鍏ュ厖鍊奸噾棰�(閫夊~)"
+ android:hint="璇疯緭鍏ュ伐鏈垂(閫夊~)"
android:inputType="numberDecimal"
android:textColor="#333333"
+ android:textColorHint="#BBBBBB"
+ android:textSize="@dimen/new_card_size" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="鍏�"
+ android:textColor="#666666"
android:textSize="@dimen/new_card_size" />
</LinearLayout>
</LinearLayout>
-
<LinearLayout
android:layout_width="match_parent"
@@ -318,8 +346,12 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="#FFFFFF"
- android:orientation="vertical">
+ android:background="@drawable/edit_text_bg_selector"
+ android:orientation="vertical"
+ android:paddingStart="10dp"
+ android:paddingEnd="10dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp">
<EditText
android:id="@+id/newCard_remark"
@@ -328,6 +360,7 @@
android:background="@null"
android:hint="璇疯緭鍏ュ娉�(閫夊~)"
android:textColor="#333333"
+ android:textColorHint="#BBBBBB"
android:textSize="@dimen/new_card_size" />
</LinearLayout>
</LinearLayout>
@@ -360,48 +393,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
-
- <RadioButton
- android:id="@+id/newCard_cashPayment"
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginRight="15dp"
- android:layout_weight="1"
- android:background="@drawable/radio_selector"
- android:button="@null"
- android:checked="true"
- android:gravity="center"
-
- android:text="鐜伴噾"
- android:textColor="@color/radio_button_text_color"
- android:textSize="@dimen/new_card_size" />
-
- <RadioButton
- android:id="@+id/newCard_posPayment"
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginRight="15dp"
- android:layout_weight="1"
- android:background="@drawable/radio_selector"
- android:button="@null"
- android:gravity="center"
-
- android:text="POS鏈�"
- android:textColor="@color/radio_button_text_color"
- android:textSize="@dimen/new_card_size" />
-
- <RadioButton
- android:id="@+id/newCard_bankTransfer"
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="1"
- android:background="@drawable/radio_selector"
- android:button="@null"
- android:gravity="center"
-
- android:text="閾惰杞处"
- android:textColor="@color/radio_button_text_color"
- android:textSize="@dimen/new_card_size" />
+ <!-- 鍔ㄦ�佹坊鍔燫adioButton锛岀Щ闄ゅ浐瀹氱殑RadioButton -->
</RadioGroup>
</LinearLayout>
</androidx.cardview.widget.CardView>
diff --git a/generallibrary/src/main/res/layout/fragment_card.xml b/generallibrary/src/main/res/layout/fragment_card.xml
index 70eef09..9323298 100644
--- a/generallibrary/src/main/res/layout/fragment_card.xml
+++ b/generallibrary/src/main/res/layout/fragment_card.xml
@@ -173,7 +173,7 @@
<ImageView
android:layout_width="55dp"
android:layout_height="55dp"
- android:src="@drawable/home_report" />
+ android:src="@drawable/guashi" />
<TextView
android:layout_width="wrap_content"
@@ -264,14 +264,14 @@
<ImageView
android:layout_width="55dp"
android:layout_height="55dp"
- android:src="@drawable/chongzheng" />
+ android:src="@drawable/xiaoka" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:gravity="center"
- android:text="鍐叉"
+ android:text="閿�鍗�"
android:textColor="@color/text_selecter_color"
android:textSize="14sp" />
</LinearLayout>
@@ -316,48 +316,11 @@
</LinearLayout>
</androidx.cardview.widget.CardView>
- <androidx.cardview.widget.CardView
- android:id="@+id/home_rewrite"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="6dp"
- android:layout_marginTop="16dp"
- android:layout_marginEnd="6dp"
- android:clickable="true"
- android:focusable="true"
- android:foreground="?android:attr/selectableItemBackground"
- app:cardCornerRadius="10dp"
- app:cardElevation="3dp"
- app:layout_constraintEnd_toStartOf="@+id/home_manage"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/home_reverse">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:orientation="vertical"
- android:padding="12dp">
-
- <ImageView
- android:layout_width="55dp"
- android:layout_height="55dp"
- android:src="@drawable/fanxie" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="6dp"
- android:gravity="center"
- android:text="鍙嶅啓"
- android:textColor="@color/text_selecter_color"
- android:textSize="14sp" />
- </LinearLayout>
- </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/home_manage"
- android:layout_width="0dp"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginTop="16dp"
@@ -370,7 +333,7 @@
app:cardElevation="3dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toEndOf="@+id/home_rewrite"
+
app:layout_constraintTop_toBottomOf="@+id/home_deduction"
app:layout_constraintVertical_bias="0.0">
diff --git a/generallibrary/src/main/res/values/dimens.xml b/generallibrary/src/main/res/values/dimens.xml
index 73a870b..b4f7b71 100644
--- a/generallibrary/src/main/res/values/dimens.xml
+++ b/generallibrary/src/main/res/values/dimens.xml
@@ -2,5 +2,13 @@
<resources>
<dimen name="title_text_size">20sp</dimen>
+ <dimen name="dimen_40">40dp</dimen>
+ <dimen name="dimen_15">15dp</dimen>
+ <dimen name="new_card_size">14sp</dimen>
+
+ <!-- 杈撳叆妗嗙浉鍏� -->
+ <dimen name="input_padding_horizontal">12dp</dimen>
+ <dimen name="input_padding_vertical">10dp</dimen>
+ <dimen name="input_corner_radius">8dp</dimen>
</resources>
\ No newline at end of file
--
Gitblit v1.8.0