From 0ec9693c39a910233fc186a8cefab9f61030df78 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期五, 07 三月 2025 18:09:32 +0800
Subject: [PATCH] refactor(generallibrary):重构网络请求模块
---
generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt | 1
generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserBeanRequest.kt | 70 +++++
qiheonlinelibrary/build.gradle | 4
qihealonelibrary/build.gradle | 4
pickerviewlibrary/build.gradle | 4
generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt | 28 ++
easysocket/src/main/AndroidManifest.xml | 2
baselibrary/build.gradle | 10
gradlew.bat | 1
generallibrary/src/main/java/com/dayu/general/net/ApiService.kt | 10
build.gradle | 7
generallibrary/src/main/AndroidManifest.xml | 3
generallibrary/src/main/java/com/dayu/general/net/MyJsonParser.kt | 259 ++++++++++++++++++
henanlibrary/build.gradle | 4
generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt | 2
generallibrary/src/main/java/com/dayu/general/bean/net/BaseResult.kt | 9
gradlew | 35 +
henanlibrary/src/main/AndroidManifest.xml | 3
app/src/main/AndroidManifest.xml | 2
generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt | 21
generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt | 86 ++++-
easysocket/build.gradle | 6
generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt | 8
baselibrary/src/main/AndroidManifest.xml | 6
generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt | 247 +++++++++--------
ocridcardlibrary/build.gradle | 3
baselibrary/src/main/java/com/dayu/baselibrary/tools/print/ShangMiAidlUtil.java | 2
27 files changed, 642 insertions(+), 195 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 451c135..880e013 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.dayu.henanlibrary">
+ >
<uses-permission android:name="android.permission.NFC" />
<!--鐢ㄤ簬璁块棶缃戠粶锛岀綉缁滃畾浣嶉渶瑕佷笂缃�-->
diff --git a/baselibrary/build.gradle b/baselibrary/build.gradle
index a2a0dfa..cbf5578 100644
--- a/baselibrary/build.gradle
+++ b/baselibrary/build.gradle
@@ -1,7 +1,8 @@
apply plugin: 'com.android.library'
android {
- compileSdk 33
+ namespace 'com.dayu.baselibrary'
+ compileSdk 34
defaultConfig {
minSdk 23
targetSdk 26
@@ -26,12 +27,17 @@
viewBinding {
enabled = true;
}
+ sourceSets {
+ main {
+ aidl.srcDirs = ['src/main/aidl']
+ }
+ }
}
dependencies {
- compileOnly fileTree(include: ['*.jar'], dir: 'exlibs')
+ implementation fileTree(include: ['*.jar'], dir: 'exlibs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
diff --git a/baselibrary/src/main/AndroidManifest.xml b/baselibrary/src/main/AndroidManifest.xml
index 894f91e..3179967 100644
--- a/baselibrary/src/main/AndroidManifest.xml
+++ b/baselibrary/src/main/AndroidManifest.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.dayu.baselibrary">
-
+ >
+ <queries>
+ <package android:name="woyou.aidlservice.jiuiv5" />
+ </queries>
<application
android:allowBackup="true"
android:supportsRtl="true"
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/print/ShangMiAidlUtil.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/print/ShangMiAidlUtil.java
index 4ff30e0..c643e29 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/print/ShangMiAidlUtil.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/print/ShangMiAidlUtil.java
@@ -25,6 +25,8 @@
import woyou.aidlservice.jiuiv5.ICallback;
import woyou.aidlservice.jiuiv5.IWoyouService;
+
+
/**
* 鍟嗙背鎵撳嵃妯″潡鐩稿叧浠g爜
*/
diff --git a/build.gradle b/build.gradle
index 10e4aeb..b590da7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,4 +1,9 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ ext {
+ agp_version = '8.2.0'
+ agp_version1 = '7.2.2'
+ }
+}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.2' apply false
id 'com.android.library' version '7.2.2' apply false
diff --git a/easysocket/build.gradle b/easysocket/build.gradle
index bd5fdf8..54e0968 100644
--- a/easysocket/build.gradle
+++ b/easysocket/build.gradle
@@ -1,6 +1,7 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 27
+ namespace 'com.easysocket'
+ compileSdk 34
//buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
@@ -26,5 +27,4 @@
compileOnly 'com.tencent.bugly:crashreport:4.1.9.3'
}
-sourceCompatibility = "7"
-targetCompatibility = "7"
+
diff --git a/easysocket/src/main/AndroidManifest.xml b/easysocket/src/main/AndroidManifest.xml
index e18d960..07f0047 100644
--- a/easysocket/src/main/AndroidManifest.xml
+++ b/easysocket/src/main/AndroidManifest.xml
@@ -1,4 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.socket" >
+ >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 593d0cb..5f247eb 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.dayu.henanlibrary">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.NFC" />
<!--鐢ㄤ簬璁块棶缃戠粶锛岀綉缁滃畾浣嶉渶瑕佷笂缃�-->
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt
index c0fb6d5..1a655b0 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/SearchUserActivity.kt
@@ -1,11 +1,15 @@
package com.dayu.general.activity
import android.os.Bundle
-import android.widget.Toast
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
import com.dayu.baselibrary.view.TitleBar.ClickType_RIGHT_IMAGE
+import com.dayu.general.bean.net.SearchUserResult
import com.dayu.general.databinding.ActivitySearchUserGeBinding
import com.dayu.general.dialog.SearchDialog
+import com.dayu.general.net.BaseResponse
+import com.dayu.qiheonlinelibrary.net.ApiManager
/**
* @author: zuo
@@ -44,31 +48,69 @@
searchDialog.show()
}
}
+
/**
* 鎵ц鎼滅储閫昏緫
* 杩欓噷鍙槸涓�涓ず渚嬫柟娉曪紝瀹為檯搴旂敤涓渶瑕佹牴鎹叿浣撻渶姹傚疄鐜�
*/
private fun performSearch(farmerId: String, farmerName: String, cardNumber: String) {
- // 杩欓噷鍙互瀹炵幇瀹為檯鐨勬悳绱㈤�昏緫
- // 渚嬪锛氳皟鐢ˋPI銆佹煡璇㈡暟鎹簱绛�
-
- // 绀轰緥锛氭瀯寤烘悳绱㈡潯浠�
- val searchConditions = mutableMapOf<String, String>()
-
- if (farmerId.isNotEmpty()) {
- searchConditions["farmerId"] = farmerId
- }
-
- if (farmerName.isNotEmpty()) {
- searchConditions["farmerName"] = farmerName
- }
-
- if (cardNumber.isNotEmpty()) {
- searchConditions["cardNumber"] = cardNumber
- }
-
- // 鏍规嵁鎼滅储鏉′欢鎵ц鎼滅储
- // 瀹為檯搴旂敤涓紝杩欓噷鍙兘鏄綉缁滆姹傛垨鏁版嵁搴撴煡璇�
- // searchRepository.search(searchConditions)
+ // 璋冪敤瀹為檯鐨勬悳绱PI
+ searchUser(farmerId, farmerName, cardNumber)
}
+
+ private fun searchUser(farmerId: String, farmerName: String, cardNumber: String) {
+ val map = mutableMapOf<String, String>()
+
+ if (farmerId.isNotEmpty()) {
+ map["farmerId"] = farmerId
+ }
+
+ if (farmerName.isNotEmpty()) {
+ map["farmerName"] = farmerName
+ }
+
+ if (cardNumber.isNotEmpty()) {
+ map["cardNumber"] = cardNumber
+ }
+
+ // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
+ ApiManager.getInstance().requestGetLoading(
+ this,
+ "searchUser",
+ SearchUserResult::class.java,
+ map,
+ object : SubscriberListener<BaseResponse<SearchUserResult>>() {
+ override fun onNext(t: BaseResponse<SearchUserResult>) {
+ if (t.success) {
+ // 澶勭悊鎼滅储鎴愬姛鐨勬儏鍐�
+ val result = t.content
+ if (result != null) {
+ // 澶勭悊鎼滅储缁撴灉
+ handleSearchResult(result)
+ } else {
+ ToastUtil.show("鏈壘鍒板尮閰嶇殑鐢ㄦ埛")
+ }
+ } else {
+ // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
+ ToastUtil.show(t.msg)
+ }
+ }
+
+ override fun onError(e: Throwable?) {
+ super.onError(e)
+ ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+ }
+ }
+ )
+ }
+
+ /**
+ * 澶勭悊鎼滅储缁撴灉
+ */
+ private fun handleSearchResult(result: SearchUserResult) {
+ // 鍦ㄨ繖閲屽疄鐜版悳绱㈢粨鏋滅殑澶勭悊閫昏緫
+ // 渚嬪锛氭洿鏂癠I鏄剧ず鎼滅储缁撴灉鍒楄〃
+ // 鎴栬�呰烦杞埌缁撴灉璇︽儏椤甸潰
+ }
+
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/BaseResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/BaseResult.kt
new file mode 100644
index 0000000..2ab6b24
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/BaseResult.kt
@@ -0,0 +1,9 @@
+package com.dayu.general.bean.net
+
+/**
+ * Description:
+ * Author: zuo
+ * Date: 2025/3/7
+ */
+class BaseResult<T> {
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserBeanRequest.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserBeanRequest.kt
new file mode 100644
index 0000000..1950d26
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserBeanRequest.kt
@@ -0,0 +1,70 @@
+package com.dayu.general.bean.net
+
+/**
+ * Description:鎼滅储
+ * Author: zuo
+ * Date: 2025/3/7
+ */
+class SearchUserBeanRequest {
+
+
+ /**
+ * 鍐滄埛濮撳悕锛屾敮鎸佹ā绯婃煡璇�
+ * 绀轰緥鍊�: 鐮旂┒闄�
+ */
+ var name: String? = null
+
+ /**
+ * 鍐滄埛缂栧彿锛屾敮鎸佹ā绯婃煡璇�
+ * 绀轰緥鍊�: 281012090001
+ */
+ var clientNum: String? = null
+
+ /**
+ * 鎵嬫満鍙凤紝鏀寔妯$硦鏌ヨ
+ * 绀轰緥鍊�: 18633333333
+ */
+ var phone: String? = null
+
+ /**
+ * 璇︾粏鍦板潃锛屾敮鎸佹ā绯婃煡璇�
+ * 绀轰緥鍊�: 铚�
+ */
+ var address: String? = null
+
+ /**
+ * 鎵�鍦ㄦ潙
+ * 绀轰緥鍊�: 2024062709530800002
+ */
+ var villageId: String? = null
+
+ /**
+ * 鎵�鍦ㄧ墖鍖�
+ */
+ var blockId: String? = null
+
+ /**
+ * 鎵�鍦ㄥ垎姘存埧
+ */
+ var divideId: String? = null
+
+ /**
+ * 姘村崱缂栧彿锛屾敮鎸佹ā绯婃煡璇�
+ * 绀轰緥鍊�: 53232810100600001
+ */
+ var cardNum: String? = null
+
+ /**
+ * 褰撳墠椤电爜锛屽繀闇�
+ * 绀轰緥鍊�: 1
+ */
+ var pageCurr: Int = 1
+
+ /**
+ * 姣忛〉璁板綍鏁帮紝蹇呴渶
+ * 绀轰緥鍊�: 10
+ */
+ var pageSize: Int = 10
+
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt
new file mode 100644
index 0000000..9a70342
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt
@@ -0,0 +1,28 @@
+package com.dayu.general.bean.net
+
+/**
+ * Description: 鎼滅储鐢ㄦ埛缁撴灉Bean
+ * Author: zuo
+ * Date: 2025/3/7
+ */
+data class SearchUserResult(
+ val itemTotal: Int, // 鎬绘潯鐩暟
+ val obj: List<UserInfo>, // 鐢ㄦ埛淇℃伅鍒楄〃
+ val pageCurr: Int, // 褰撳墠椤电爜
+ val pageSize: Int, // 姣忛〉澶у皬
+ val pageTotal: Int // 鎬婚〉鏁�
+) {
+ /**
+ * 鐢ㄦ埛淇℃伅
+ */
+ data class UserInfo(
+ val address: String? = null, // 鍦板潃
+ val cardCount: Int? = null, // 鍗℃暟閲�
+ val clientNum: String? = null, // 瀹㈡埛缂栧彿
+ val id: Int? = null, // ID
+ val idCard: String? = null, // 韬唤璇�
+ val name: String? = null, // 濮撳悕
+ val operateDt: String? = null, // 鎿嶄綔鏃ユ湡
+ val phone: String? = null // 鐢佃瘽
+ )
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
index 6dab3dc..8837b74 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
@@ -1,66 +1,96 @@
-package com.dayu.general.net
+package com.dayu.qiheonlinelibrary.net
import android.content.Context
-import android.text.TextUtils
-import com.dayu.baselibrary.business.BusinessProvider
-import com.dayu.baselibrary.net.subscribers.BaseProgressSubscriber
+import android.util.Log
+import com.dayu.baselibrary.net.subscribers.ProgressSubscriber
import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.general.net.ApiService
+import com.dayu.general.net.BaseResponse
+import com.dayu.general.net.MyJsonParser
+import com.dayu.general.net.NetConstans
+import com.dayu.general.net.RetrofitClient
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.functions.Function
import io.reactivex.rxjava3.schedulers.Schedulers
/**
+ * Copyright (C), 2023,
+ * Author: zuot
+ * Date: 2023-04-12 9:11
* Description:
- * Author: zuo
- * Date: 2025-03-06
*/
-class ApiManager {
+class ApiManager private constructor() {
- var apiService: ApiService? = null
+ companion object {
+ private const val TAG = "ApiManager"
- fun init() {
- if (apiManager == null) {
- apiManager =
- com.dayu.qiheonlinelibrary.net.ApiManager()
+ @Volatile
+ private var apiManager: ApiManager? = null
+
+ fun init() {
+ if (apiManager == null) {
+ synchronized(ApiManager::class) {
+ if (apiManager == null) {
+ apiManager = ApiManager()
+ }
+ }
+ }
+ }
+
+ fun getInstance(): ApiManager {
+ return apiManager ?: throw IllegalStateException("ApiManager not initialized")
}
}
- fun ApiManager() {
- apiService = RetrofitClient.getInstance().getApiService()
+ private val apiService: ApiService = RetrofitClient.getInstance().getApiService()
+
+ fun <T> requestGetLoading(
+ context: Context,
+ path: String,
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
+ ) {
+ request(context, false, path, true, tClass, params, listener)
}
- fun getInstance(): com.dayu.qiheonlinelibrary.net.ApiManager {
- return apiManager
+ fun <T> requestGetHideLoading(
+ context: Context,
+ path: String,
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
+ ) {
+ request(context, true, path, true, tClass, params, listener)
}
fun <T> requestPostLoading(
- context: Context?,
- path: String?,
- tClass: Class<T>?,
- params: Map<String?, Any?>?,
- listener: SubscriberListener<*>?
+ context: Context,
+ path: String,
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
) {
request(context, false, path, false, tClass, params, listener)
}
fun <T> requestPostHideLoading(
- context: Context?,
- path: String?,
- tClass: Class<T>?,
- params: Map<String?, Any?>?,
- listener: SubscriberListener<*>?
+ context: Context,
+ path: String,
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
) {
request(context, true, path, false, tClass, params, listener)
}
fun <T> requestPost(
- context: Context?,
- path: String?,
- tClass: Class<T>?,
- params: Map<String?, Any?>?,
- listener: SubscriberListener<*>?
+ context: Context,
+ path: String,
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
) {
request(context, false, path, false, tClass, params, listener)
}
@@ -76,22 +106,20 @@
* @param params Post璇锋眰鏃讹紝瀵瑰簲鐨勫弬鏁�
* @param listener 鍥炶皟璇锋眰
* @param <T>
- </T> */
+ */
fun <T> request(
- context: Context?,
+ context: Context,
hideLoading: Boolean,
- path: String?,
+ path: String,
isGet: Boolean,
- tClass: Class<T>?,
- params: Map<String?, Any?>?,
- listener: SubscriberListener<*>?
+ tClass: Class<T>,
+ params: Map<String, Any>?,
+ listener: SubscriberListener<BaseResponse<T>>
) {
- val observable: Observable<*>=if (isGet) {
- if (params == null) {
- apiService.requestGet(path)
- } else {
- apiService.requestGet(path, params)
- }
+
+ val observable = if (isGet) {
+ if (params == null) apiService.requestGet(path)
+ else apiService.requestGet(path, params)
} else {
if (params != null) {
apiService.requestPost(path, params)
@@ -100,77 +128,68 @@
}
}
- val mySubscriber: BaseProgressSubscriber<*>=ProgressSubscriber<Any?>(context, hideLoading, listener)
- observable.subscribeOn(Schedulers.io()).map
- object : Function<Any?, com.dayu.qiheonlinelibrary.net.BaseResponse<T>?> {
- override fun apply(o: Any): com.dayu.qiheonlinelibrary.net.BaseResponse<T> {
- if (o is com.dayu.qiheonlinelibrary.net.BaseResponse) {
- val tem: com.dayu.qiheonlinelibrary.net.BaseResponse =
- o as com.dayu.qiheonlinelibrary.net.BaseResponse
- val response: com.dayu.qiheonlinelibrary.net.BaseResponse<T> =
- com.dayu.qiheonlinelibrary.net.BaseResponse<T>()
- //鏈櫥褰曟垨鐧诲綍瓒呮椂锛岃閲嶆柊鐧诲綍
- if (tem.getCode() == 100401) {
- if (BusinessProvider.getBusinessProvider() != null) {
- BusinessProvider.getBusinessProvider().startLoginNavigotor.navigateToLogin(
- context
- )
- }
- }
- response.setCode(tem.getCode())
- response.setMsg(tem.getMsg())
- if (tClass != null) {
- if (TextUtils.isEmpty(
- tem.getData().toString()
- ) && BaseResult::class.java.isAssignableFrom(tClass)
- ) {
- response.setData(null)
- return response
- }
- if (tem.getData() is Map<*, *>) {
- try {
-// response.setData(MyJsonParser.getBeanFromMap((Map<String, Object>) tem.getData(), tClass));
- val jsonData: String =
- MyJsonParser.getJsontoMap(tem.getData() as Map<*, *>)
- response.setData(MyJsonParser.getBeanFromJson<T>(jsonData, tClass))
- } catch (e: Exception) {
- e.printStackTrace()
- }
- } else if (tem.getData() is List<*>) {
- try {
- response.setData(
- MyJsonParser.getListByJson<T>(
- MyJsonParser.getJsonbyList<Any>(
- tem.getData() as List<*>
- ), tClass
- ) as T
- )
- } catch (e: Exception) {
- e.printStackTrace()
- }
- } else if (tem.getData() is Int) {
- response.setData(tem.getData() as T)
- } else if (tem.getData() is Boolean) {
- response.setData(tem.getData() as T)
- }
- if (tClass.name is String && tem.getData() is String) {
- try {
- response.setData(tem.getData() as T)
- } catch (e: Exception) {
- e.printStackTrace()
- }
- }
- return response
- }
- }
+ // 浣跨敤BaseResponse<T>浣滀负ProgressSubscriber鐨勬硾鍨嬬被鍨�
+ val mySubscriber = ProgressSubscriber<BaseResponse<T>>(context, hideLoading, listener);
- return null
+ observable
+ ?.subscribeOn(Schedulers.io())
+ ?.map(mapResponse(tClass))
+ ?.unsubscribeOn(Schedulers.newThread())
+ ?.observeOn(AndroidSchedulers.mainThread())
+ ?.subscribe(mySubscriber)
+ }
+
+ private fun <T> mapResponse(tClass: Class<T>): Function<Any, BaseResponse<T>> {
+ return Function { rawResponse ->
+ when (rawResponse) {
+ is BaseResponse<*> -> {
+ val temp = rawResponse
+
+ // 鍒涘缓鏂扮殑鍝嶅簲瀵硅薄骞惰缃熀鏈睘鎬�
+ val response = BaseResponse<T>().apply {
+ code = temp.code
+ msg = temp.msg ?: ""
+ }
+
+ // 澶勭悊token澶辨晥鐨勬儏鍐�
+ if (temp.code == NetConstans.TOKEN_INVALID) {
+ // 鍙互鍦ㄨ繖閲屾坊鍔犻噸瀹氬悜鍒扮櫥褰曢〉闈㈢殑閫昏緫
+ // redirectToLogin()
+ return@Function response
+ }
+
+ // 鏍规嵁鍐呭绫诲瀷杩涜澶勭悊
+ when (val content = temp.content) {
+ is Map<*, *> -> {
+ try {
+ val jsonData = MyJsonParser.getJsontoMap(content as Map<String, Any>)
+ response.content = MyJsonParser.getBeanFromJson(jsonData, tClass)
+ } catch (e: Exception) {
+ Log.e(TAG, "Error parsing map content", e)
+ }
+ }
+ is List<*> -> {
+ try {
+ @Suppress("UNCHECKED_CAST")
+ response.content = MyJsonParser.getListByJson(
+ MyJsonParser.getJsonbyList(content),
+ tClass
+ ) as T
+ } catch (e: Exception) {
+ Log.e(TAG, "Error parsing list content", e)
+ }
+ }
+ is Int, is String, is Boolean -> {
+ @Suppress("UNCHECKED_CAST")
+ response.content = content as T
+ }
+ }
+
+ response
+ }
+ else -> throw IllegalArgumentException("Unexpected response type")
}
}
- .unsubscribeOn(Schedulers.newThread())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(mySubscriber)
}
-
-
-}
\ No newline at end of file
+
+}
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt
index 3992cc1..7aac48b 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiService.kt
@@ -13,8 +13,8 @@
@POST
fun requestPost(
- @Url url: String?,
- @Body params: Map<String?, Any?>?
+ @Url url: String,
+ @Body params: Map<String, Any?>?
): Observable<BaseResponse<Any?>>?
@POST
@@ -22,11 +22,11 @@
@GET("{url}")
fun requestGet(
- @Path("url") url: String?,
- @QueryMap params: Map<String?, Any?>?
+ @Path("url") url: String,
+ @QueryMap params: Map<String, Any?>?
): Observable<BaseResponse<Any?>>?
@GET("{url}")
- fun requestGet(@Path("url") url: String?): Observable<BaseResponse<Any?>>?
+ fun requestGet(@Path("url") url: String): Observable<BaseResponse<Any?>>?
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt b/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt
index 3097c10..d6aae48 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/BaseResponse.kt
@@ -6,7 +6,7 @@
* Date: 2025-03-06
*/
class BaseResponse<T> {
- var code: Int = 0
+ var code: String = ""
var msg: String? = null
var content: T? = null
var success:Boolean = false
diff --git a/generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt b/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
similarity index 86%
rename from generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt
rename to generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
index 95beb88..6a3d2dd 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/MyInercepterApplication.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
@@ -1,7 +1,5 @@
package com.dayu.general.net
-import android.text.TextUtils
-import com.dayu.qiheonlinelibrary.QHOnLineApplication
import com.tencent.bugly.crashreport.CrashReport
import okhttp3.Interceptor
import okhttp3.Protocol
@@ -16,7 +14,7 @@
* Author: zuo
* Date: 2025-03-06
*/
-class MyInercepterApplication :Interceptor{
+class MyIntercepterApplication :Interceptor{
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
@@ -47,9 +45,7 @@
if (request.method == "GET") {
builder.url(request.url.toString())
} else {
- if (!TextUtils.isEmpty(QHOnLineApplication.getInstance().tokenStr)) {
- builder.addHeader("Token-Cloud", QHOnLineApplication.getInstance().tokenStr)
- }
+
}
return builder.build()
} catch (e: Exception) {
diff --git a/generallibrary/src/main/java/com/dayu/general/net/MyJsonParser.kt b/generallibrary/src/main/java/com/dayu/general/net/MyJsonParser.kt
new file mode 100644
index 0000000..8073839
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/net/MyJsonParser.kt
@@ -0,0 +1,259 @@
+package com.dayu.general.net
+
+import android.text.TextUtils
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.JsonParser
+import com.google.gson.LongSerializationPolicy
+import org.json.JSONArray
+import org.json.JSONException
+import org.json.JSONObject
+import java.lang.reflect.ParameterizedType
+import java.lang.reflect.Type
+import java.util.*
+
+/**
+ * Description: JSON瑙f瀽宸ュ叿绫�
+ * Author: zuo
+ * Date: 2025/3/7
+ */
+class MyJsonParser {
+
+ companion object {
+ /**
+ * 鑾峰彇Json瀛楃涓蹭腑鐨勫睘鎬у��
+ */
+ @JvmStatic
+ @Throws(JSONException::class)
+ fun getPropertyFromJson(json: String, attrName: String): Any? {
+ return try {
+ val jsonObject = JSONObject(json)
+ jsonObject.get(attrName)
+ } catch (e: JSONException) {
+ null
+ }
+ }
+
+ /**
+ * 灏嗗璞¤浆鎹㈡垚Json瀛楃涓�
+ */
+ @JvmStatic
+ fun <T> bean2Json(t: T?): String {
+ return try {
+ if (t == null || TextUtils.isEmpty(t.toString())) return ""
+ Gson().toJson(t)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ }
+
+ /**
+ * 杞崲涓篢绫诲瀷
+ */
+ @JvmStatic
+ fun <T> json2Bean(json: String, tClass: Class<T>): T? {
+ return try {
+ if (!TextUtils.isEmpty(json)) {
+ Gson().fromJson(json, tClass)
+ } else null
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ /**
+ * 灏咼son鐩存帴搴忓垪鍖栦负List
+ */
+ @JvmStatic
+ fun <T> json2List(json: String, type: Type): List<T>? {
+ return try {
+ if (!TextUtils.isEmpty(json)) {
+ Gson().fromJson(json, type)
+ } else null
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ private fun buildGson() = GsonBuilder().create()
+
+ @JvmStatic
+ fun <T> getBeanFromJson(json: String, cl: Class<T>): T? {
+ return try {
+ buildGson().fromJson(json, cl)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ @JvmStatic
+ fun <T> getBeanFromJson(json: String, cl: Type): T? {
+ return try {
+ buildGson().fromJson(json, cl)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ @JvmStatic
+ fun <T> getBeanFromMap(map: Map<String, Any>, cl: Class<T>): T? {
+ return getBeanFromJson(getJsonFromMap(map), cl)
+ }
+
+ @JvmStatic
+ fun getJsonFromMap(params: Map<String, Any>?): String {
+ if (params.isNullOrEmpty()) return ""
+ return getJSONObjectFromMap(params).toString()
+ }
+
+ @JvmStatic
+ fun getJsontoMap(params: Map<*, *>): String {
+ return GsonBuilder()
+ .setLongSerializationPolicy(LongSerializationPolicy.STRING)
+ .serializeSpecialFloatingPointValues()
+ .create()
+ .toJson(params)
+ }
+
+ @JvmStatic
+ fun <T> getJsonbyList(params: List<T>): String {
+ return Gson().toJson(params)
+ }
+
+ @Suppress("UNCHECKED_CAST")
+ private fun getJSONObjectFromMap(params: Map<String, Any>): JSONObject {
+ val jsonObject = JSONObject()
+ for ((key, value) in params) {
+ try {
+ when (value) {
+ is List<*> -> {
+ if (value.isNotEmpty()) {
+ val array = JSONArray()
+ for (o in value) {
+ when (o) {
+ is Map<*, *> -> array.put(getJSONObjectFromMap(o as Map<String, Any>))
+ is List<*> -> {
+ val array1 = JSONArray()
+ array1.put(getListFromJson(o.toString()))
+ array.put(array1)
+ }
+ else -> array.put(o)
+ }
+ }
+ jsonObject.put(key, array)
+ }
+ }
+ is Map<*, *> -> jsonObject.put(key, getJSONObjectFromMap(value as Map<String, Any>))
+ else -> jsonObject.put(key, value)
+ }
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ }
+ return jsonObject
+ }
+
+ @JvmStatic
+ fun getMapFromJson(jsonStr: String?): HashMap<String, Any> {
+ val valueMap = LinkedHashMap<String, Any>()
+ if (jsonStr.isNullOrEmpty()) return valueMap
+
+ try {
+ val jsonObject = JSONObject(jsonStr)
+ return getMapFromJsonObject(jsonObject)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return valueMap
+ }
+
+ @JvmStatic
+ fun getListFromJsonArray(jsonArray: JSONArray): List<Any> {
+ val list = ArrayList<Any>()
+ try {
+ for (i in 0 until jsonArray.length()) {
+ when (val obj = jsonArray.get(i)) {
+ is JSONObject -> list.add(getMapFromJsonObject(obj))
+ is JSONArray -> list.add(getListFromJsonArray(jsonArray))
+ else -> {
+ if (obj != null && !TextUtils.isEmpty(obj.toString()) && obj.toString() != "null") {
+ list.add(obj)
+ }
+ }
+ }
+ }
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ return list
+ }
+
+ @JvmStatic
+ fun getMapFromJsonObject(jsonObj: JSONObject): HashMap<String, Any> {
+ val map = LinkedHashMap<String, Any>()
+ val keys = jsonObj.keys()
+ try {
+ while (keys.hasNext()) {
+ val key = keys.next()
+ when (val obj = jsonObj.get(key)) {
+ is JSONArray -> map[key] = getListFromJsonArray(obj)
+ is JSONObject -> map[key] = getMapFromJsonObject(obj)
+ is Number -> map[key] = obj.toString()
+ else -> {
+ if (obj != null && !TextUtils.isEmpty(obj.toString()) && obj.toString() != "null") {
+ map[key] = obj
+ }
+ }
+ }
+ }
+ } catch (e: JSONException) {
+ e.printStackTrace()
+ }
+ return map
+ }
+
+ @JvmStatic
+ fun <T> getListFromJson(str: String, clazz: Class<T>): List<T>? {
+ return try {
+ val type = ParameterizedTypeImpl(clazz)
+ Gson().fromJson<List<T>>(str, type)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ @JvmStatic
+ fun <T> getListByJson(json: String, cls: Class<T>): List<T> {
+ val gson = Gson()
+ val list = ArrayList<T>()
+ val array = JsonParser().parse(json).asJsonArray
+ array.forEach { elem ->
+ list.add(gson.fromJson(elem, cls))
+ }
+ return list
+ }
+
+ @JvmStatic
+ fun getListFromJson(str: String): List<Any>? {
+ try {
+ val jsonArray = JSONArray(str)
+ return getListFromJsonArray(jsonArray)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+
+ private class ParameterizedTypeImpl(private val clazz: Class<*>) : ParameterizedType {
+ override fun getActualTypeArguments(): Array<Type> = arrayOf(clazz)
+ override fun getRawType(): Type = List::class.java
+ override fun getOwnerType(): Type? = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
index 0c0e7f2..a6f1a41 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
@@ -9,6 +9,7 @@
companion object {
const val BASE_URL: String = "http://120.46.45.35:20081/api/sjgg/"
+ const val TOKEN_INVALID: String = "0000"
}
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt b/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt
index 97bdbeb..aadfdd5 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/RetrofitClient.kt
@@ -1,7 +1,6 @@
package com.dayu.general.net
import com.dayu.baselibrary.BuildConfig
-import com.dayu.qiheonlinelibrary.net.MyIntercepterApplication
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
@@ -14,7 +13,13 @@
* Author: zuo
* Date: 2025-03-06
*/
-class RetrofitClient {
+class RetrofitClient// 鍖呭惈header銆乥ody鏁版嵁
+// loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
+//璁剧疆杩炴帴鍜岃鍙栨椂闂�
+//娣诲姞缁熶竴鐨刪eader
+//娣诲姞鏃ュ織鎷︽埅鍣�
+//娣诲姞鏁版嵁璇锋眰缁熶竴澶勭悊鎷︽埅鍣�
+ () {
@@ -22,26 +27,19 @@
val READ_TIME_OUT: Int = 10
val CONNECT_TIME_OUT: Int = 10
- private fun RetrofitClient() {
+
+ init {
val loggingInterceptor = HttpLoggingInterceptor()
- // 鍖呭惈header銆乥ody鏁版嵁
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
- // loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
val builder: OkHttpClient.Builder = OkHttpClient().newBuilder()
- //璁剧疆杩炴帴鍜岃鍙栨椂闂�
builder.readTimeout(READ_TIME_OUT.toLong(), TimeUnit.SECONDS)
builder.connectTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS)
builder.writeTimeout(CONNECT_TIME_OUT.toLong(), TimeUnit.SECONDS)
- //娣诲姞缁熶竴鐨刪eader
builder.addInterceptor(MyIntercepterApplication())
- //娣诲姞鏃ュ織鎷︽埅鍣�
- //娣诲姞鏁版嵁璇锋眰缁熶竴澶勭悊鎷︽埅鍣�
if (BuildConfig.DEBUG) {
builder.addInterceptor(loggingInterceptor)
}
-
val client: OkHttpClient = builder.build()
-
retrofit = Retrofit.Builder()
.baseUrl(NetConstans.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
@@ -49,6 +47,7 @@
.client(client).build()
}
+
@Synchronized
diff --git a/gradlew b/gradlew
index a69d9cb..1aa94a4 100644
--- a/gradlew
+++ b/gradlew
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,13 +80,11 @@
esac
done
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-APP_NAME="Gradle"
+# This is normally unused
+# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -133,22 +131,29 @@
fi
else
JAVACMD=java
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -193,11 +198,15 @@
done
fi
-# Collect all arguments for the java command;
-# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
-# shell script including quotes and variable substitutions, so put them in
-# double quotes to make sure that they get re-expanded; and
-# * put everything else in single quotes, so that it's not re-expanded.
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
diff --git a/gradlew.bat b/gradlew.bat
index f127cfd..93e3f59 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -26,6 +26,7 @@
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
diff --git a/henanlibrary/build.gradle b/henanlibrary/build.gradle
index 4c26141..08882f7 100644
--- a/henanlibrary/build.gradle
+++ b/henanlibrary/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
android {
namespace 'com.dayu.henanlibrary'
- compileSdk 33
- ndkPath 'D:\\android\\sdk\\ndk\\android-ndk-r21'
+ compileSdk 34
+ ndkVersion '21.0.6113669'
defaultConfig {
minSdk 23
targetSdk 26
diff --git a/henanlibrary/src/main/AndroidManifest.xml b/henanlibrary/src/main/AndroidManifest.xml
index 2dd3772..75dc0af 100644
--- a/henanlibrary/src/main/AndroidManifest.xml
+++ b/henanlibrary/src/main/AndroidManifest.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.dayu.henanlibrary">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.NFC" />
<!--鐢ㄤ簬璁块棶缃戠粶锛岀綉缁滃畾浣嶉渶瑕佷笂缃�-->
diff --git a/ocridcardlibrary/build.gradle b/ocridcardlibrary/build.gradle
index ba76866..5ac1762 100644
--- a/ocridcardlibrary/build.gradle
+++ b/ocridcardlibrary/build.gradle
@@ -1,7 +1,8 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 29
+ namespace 'com.kernal.passportreader.sdk'
+ compileSdk 34
defaultConfig {
minSdkVersion 14
targetSdkVersion 29
diff --git a/pickerviewlibrary/build.gradle b/pickerviewlibrary/build.gradle
index 65d44a7..42cbf69 100644
--- a/pickerviewlibrary/build.gradle
+++ b/pickerviewlibrary/build.gradle
@@ -2,8 +2,8 @@
android {
- compileSdkVersion 28
-
+ compileSdk 34
+ namespace 'com.example.pickerviewlibrary'
defaultConfig {
minSdkVersion 22
targetSdkVersion 28
diff --git a/qihealonelibrary/build.gradle b/qihealonelibrary/build.gradle
index b1799a8..dc956ba 100644
--- a/qihealonelibrary/build.gradle
+++ b/qihealonelibrary/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
android {
namespace 'com.dayu.qihealonelibrary'
- compileSdk 33
- ndkPath 'D:\\android\\sdk\\ndk\\android-ndk-r21'
+ compileSdk 34
+ ndkVersion '21.0.6113669'
defaultConfig {
minSdk 23
targetSdk 33
diff --git a/qiheonlinelibrary/build.gradle b/qiheonlinelibrary/build.gradle
index 75092a7..5356499 100644
--- a/qiheonlinelibrary/build.gradle
+++ b/qiheonlinelibrary/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
android {
namespace 'com.dayu.qiheonlinelibrary'
- compileSdk 33
- ndkPath 'D:\\android\\sdk\\ndk\\android-ndk-r21'
+ compileSdk 34
+ ndkVersion '21.0.6113669'
defaultConfig {
minSdk 23
targetSdk 33
--
Gitblit v1.8.0