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