From 1f59c77b7d541eb39a1b719e042ab69b97c02a7e Mon Sep 17 00:00:00 2001 From: hwf452 Date: Wed, 19 Feb 2025 11:26:49 +0800 Subject: [PATCH] =?UTF-8?q?gradle=20=E9=80=82=E9=85=8D=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=B7=A5=E5=85=B7=20android=20studio2024.2.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 107 ++++------ app/src/main/AndroidManifest.xml | 5 + .../rehome/dywoa/Listener/QRCodeAnalyser.kt | 45 +++++ .../dywoa/ui/activity/KksSearchActivity.kt | 57 +----- .../dywoa/ui/activity/QrCodeActivity.kt | 185 ++++++++++++++++++ .../java/com/rehome/dywoa/weiget/ScanView.kt | 89 +++++++++ .../main/res/drawable-xhdpi/scan_light.png | Bin 0 -> 3342 bytes app/src/main/res/drawable/scan_bg.xml | 14 ++ app/src/main/res/layout/activity_qr_code.xml | 50 +++++ app/src/main/res/values/strings.xml | 3 + autolayout/build.gradle | 2 +- gradle/libs.versions.toml | 76 +++++-- matisse/build.gradle | 5 +- tkrefreshlayout/build.gradle | 4 +- 14 files changed, 500 insertions(+), 142 deletions(-) create mode 100644 app/src/main/java/com/rehome/dywoa/Listener/QRCodeAnalyser.kt create mode 100644 app/src/main/java/com/rehome/dywoa/ui/activity/QrCodeActivity.kt create mode 100644 app/src/main/java/com/rehome/dywoa/weiget/ScanView.kt create mode 100644 app/src/main/res/drawable-xhdpi/scan_light.png create mode 100644 app/src/main/res/drawable/scan_bg.xml create mode 100644 app/src/main/res/layout/activity_qr_code.xml diff --git a/app/build.gradle b/app/build.gradle index 7f27820..782c654 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,8 +1,3 @@ -//plugins { -// id 'com.android.application' -// id 'org.jetbrains.kotlin.android' -//} - plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) @@ -48,7 +43,6 @@ android { abortOnError false } minifyEnabled false //开启代码混淆,防止反编译查看源代码 - zipAlignEnabled true // 对齐zip debuggable false // 是否debug proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' //修改生成的apk名字 @@ -89,35 +83,23 @@ dependencies { - implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'com.squareup.retrofit2:converter-gson:2.9.0' - //implementation 'org.litepal.android:core:1.5.1'//源代码下载整合本项目到模块 第三方数据库封装,巡检,点检用到 - implementation 'com.github.huangyanbin:SmartTable:2.2.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'de.hdodenhof:circleimageview:3.1.0' - implementation 'com.github.wanglu1209:PhotoViewer:0.50' - implementation 'io.github.azhon:appupdate:4.2.6' - implementation 'com.tencent.bugly:crashreport:3.2.1' - implementation 'com.github.xuexiangjys:XUI:1.1.4' - implementation 'org.greenrobot:eventbus:3.0.0' - //implementation 'com.zhihu.android:matisse:0.5.3-beta3'//源代码下载整合本项目到模块 图片展示模块 + implementation libs.logging.interceptor + implementation libs.retrofit + implementation libs.com.squareup.retrofit2.converter.gson5 + implementation libs.smarttable + implementation libs.androidx.recyclerview + implementation libs.circleimageview + implementation libs.photoviewer + implementation libs.appupdate + implementation libs.crashreport + implementation libs.xui + implementation libs.eventbus //第三方浏览器 - implementation 'io.github.justson:agentweb-core:v5.1.1-androidx' - //implementation 'com.lcodecorex:tkrefreshlayout:1.0.7'//源代码下载整合本项目到模块 下拉刷新、下拉刷新模块 - - - implementation 'androidx.multidex:multidex:2.0.1' - + implementation libs.agentweb.core + implementation libs.androidx.multidex -// implementation 'androidx.core:core-ktx:1.9.0' -// implementation 'androidx.appcompat:appcompat:1.6.1' -// implementation 'com.google.android.material:material:1.8.0' -// implementation 'androidx.constraintlayout:constraintlayout:2.1.4' -// implementation 'androidx.activity:activity:1.8.0' - - //加载内部其它模块 + //加载项目内部其它模块 //视频压缩 implementation project(':videocompressor') //网络请求模块 @@ -134,60 +116,41 @@ dependencies { //深信服零信任SDK implementation files('libs/SangforSDK.aar') - implementation 'de.hdodenhof:circleimageview:3.1.0' + implementation libs.circleimageview //腾讯APP崩溃分析 - implementation 'com.tencent.bugly:crashreport:3.2.1' + implementation libs.crashreport //第三方库图片选择器 // PictureSelector basic (Necessary) - implementation 'io.github.lucksiege:pictureselector:v3.10.7' + implementation libs.pictureselector // image compress library (Not necessary) - implementation 'io.github.lucksiege:compress:v3.10.7' + implementation libs.compress // uCrop library (Not necessary) - implementation 'io.github.lucksiege:ucrop:v3.10.7' + implementation libs.ucrop // simple camerax library (Not necessary) - implementation 'io.github.lucksiege:camerax:v3.10.7' + implementation libs.camerax //第三方库图片异步加载 - implementation 'com.github.bumptech.glide:glide:4.11.0' - implementation 'androidx.annotation:annotation:1.6.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' - - annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + implementation libs.glide + implementation libs.annotation + implementation libs.androidx.lifecycle.livedata.ktx + implementation libs.androidx.lifecycle.viewmodel.ktx + annotationProcessor libs.compiler //第三方工具类 - implementation 'cn.hutool:hutool-all:5.8.5' - //implementation 'cn.hutool:hutool-crypto:5.7.16' - implementation 'org.bouncycastle:bcprov-jdk15on:1.65' + implementation libs.cn.hutool.all + implementation libs.bcprov.jdk15on //mqtt - implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4' - implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' - implementation 'org.bouncycastle:bcpkix-jdk15on:1.56' - implementation 'commons-codec:commons-codec:1.15' + implementation libs.paho.org.eclipse.paho.client.mqttv3 + implementation libs.paho.org.eclipse.paho.android.service + implementation libs.bcpkix.jdk15on + implementation libs.commons.codec.commons.codec4 //本地广播 - implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' + implementation libs.androidx.localbroadcastmanager.localbroadcastmanager //人脸识别 - implementation 'com.google.mlkit:face-detection:16.1.6' - //摄像头 CameraX core library using the camera2 implementation - def camerax_version = "1.4.0-alpha04" - // The following line is optional, as the core library is included indirectly by camera-camera2 - implementation "androidx.camera:camera-core:${camerax_version}" - implementation "androidx.camera:camera-camera2:${camerax_version}" - // If you want to additionally use the CameraX Lifecycle library - implementation "androidx.camera:camera-lifecycle:${camerax_version}" - // If you want to additionally use the CameraX VideoCapture library - implementation "androidx.camera:camera-video:${camerax_version}" - // If you want to additionally use the CameraX View class - implementation "androidx.camera:camera-view:${camerax_version}" - // If you want to additionally add CameraX ML Kit Vision Integration - implementation "androidx.camera:camera-mlkit-vision:${camerax_version}" - // If you want to additionally use the CameraX Extensions library - implementation "androidx.camera:camera-extensions:${camerax_version}" - + implementation libs.com.google.mlkit.face.detection2 + //二维码扫描 + implementation libs.barcode.scanning -// testImplementation 'junit:junit:4.13.2' -// androidTestImplementation 'androidx.test.ext:junit:1.1.5' -// androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' configurations { all*.exclude group: 'com.google.code.gson' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e9725d7..01ca0a6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,6 +78,7 @@ tools:replace="android:allowBackup" tools:targetApi="s"> + + , Int, Int) -> Unit) : + ImageAnalysis.Analyzer { + //配置当前扫码格式 + private val options = BarcodeScannerOptions.Builder() + .setBarcodeFormats( + Barcode.FORMAT_QR_CODE, + Barcode.FORMAT_AZTEC + ).build() + + //获取解析器 + private val detector = BarcodeScanning.getClient(options) + + @SuppressLint("UnsafeExperimentalUsageError", "UnsafeOptInUsageError") + override fun analyze(imageProxy: ImageProxy) { + val mediaImage = imageProxy.image ?: kotlin.run { + imageProxy.close() + return + } + val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) + detector.process(image) + .addOnSuccessListener { barCodes -> + Log.i("app", "barCodes: ${barCodes.size}") + if (barCodes.size > 0) { + listener.invoke(barCodes, imageProxy.width, imageProxy.height) + //接收到结果后,就关闭解析 + detector.close() + } + } + .addOnFailureListener { Log.i("app", "Error: ${it.message}") } + .addOnCompleteListener { imageProxy.close() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/dywoa/ui/activity/KksSearchActivity.kt b/app/src/main/java/com/rehome/dywoa/ui/activity/KksSearchActivity.kt index 7bd9070..3c27548 100644 --- a/app/src/main/java/com/rehome/dywoa/ui/activity/KksSearchActivity.kt +++ b/app/src/main/java/com/rehome/dywoa/ui/activity/KksSearchActivity.kt @@ -27,15 +27,9 @@ import java.util.Calendar class KksSearchActivity : BaseActivityOaToolbarViewBinding() { - private val QRCODE_SCAN_CAMERA_REQUEST_CODE = 4 //扫描二維码请求摄像头权限 private var qrCodeStrSearch: String? = null - private val permission = arrayOf( - Manifest.permission.CAMERA, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) - private lateinit var launcherResultQRCode: ActivityResultLauncher override fun getViewBinding() = ActivityKksSearchBinding.inflate(layoutInflater) @@ -79,56 +73,17 @@ class KksSearchActivity : BaseActivityOaToolbarViewBinding, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - //扫描二维码 - if (QRCODE_SCAN_CAMERA_REQUEST_CODE == requestCode) { - if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - val intent = Intent(this, MipcaActivityCapture::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - launcherResultQRCode.launch(intent) - } else { - //权限拒绝 - Toast.makeText( - this, - "权限拒绝,无法打开摄像头,请手动设置开启APP访问摄像头权限", - Toast.LENGTH_SHORT - ).show() - } - } + private fun intentTOQRCode() { + val intentMHJ = Intent(this, QrCodeActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + launcherResultQRCode.launch(intentMHJ) } /** * 跳转到扫码界面扫码 */ private fun goScan() { - //检查是否有相机权限 - if (ContextCompat.checkSelfPermission( - this, - Manifest.permission.CAMERA - ) == PackageManager.PERMISSION_GRANTED - ) { - val intent = Intent(this, MipcaActivityCapture::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - launcherResultQRCode.launch(intent) - } else { - ActivityCompat.requestPermissions( - this, - permission, - QRCODE_SCAN_CAMERA_REQUEST_CODE - ) - } + intentTOQRCode(); } //创建一个ActivityResultLauncher @@ -139,7 +94,7 @@ class KksSearchActivity : BaseActivityOaToolbarViewBinding() { + + private lateinit var lifecycleCameraController: LifecycleCameraController + private lateinit var cameraExecutor: ExecutorService + private val CAMERA_REQUEST_CAMERA_SCAN: Int = 88 //请求码 + +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) +// binding = ActivityQrCodeBinding.inflate(layoutInflater) +// setContentView(binding.root) +// initController() +// } + + override fun getViewBinding() = ActivityQrCodeBinding.inflate(layoutInflater) + + override fun getToolbar()= binding.toolbarView.toolbar + + override fun initView() { + initToolbar("二维码/条码扫描") + setLeftOnClickListener { finish() } + checkPermission() + //initController() + } + + override fun initData() { + + } + + private fun checkPermission(){ + //检测摄像头权限 + if (!context.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { + binding.frCamera.visibility=View.GONE + Toast.makeText( + context, + "权限拒绝,请手动设置开启APP访问摄像头权限", + Toast.LENGTH_LONG + ).show() + return + } + + //动态权限申请 + if (ContextCompat.checkSelfPermission( + context, + Manifest.permission.CAMERA + ) != PackageManager.PERMISSION_GRANTED + ) { + binding.frCamera.visibility=View.GONE + //权限请求 + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.CAMERA), + CAMERA_REQUEST_CAMERA_SCAN + ) + } else { + //已授权,打开摄像头扫描 + initController() + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (CAMERA_REQUEST_CAMERA_SCAN == requestCode) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + binding.frCamera.visibility=View.VISIBLE + //已授权,打开摄像头扫描 + initController() + } else { + binding.frCamera.visibility=View.GONE + //权限拒绝 + Toast.makeText( + this, + "权限拒绝,请手动设置开启APP访问摄像头权限", + Toast.LENGTH_SHORT + ).show() + } + } + } + + @SuppressLint("ClickableViewAccessibility", "UnsafeOptInUsageError") + private fun initController() { + cameraExecutor = Executors.newSingleThreadExecutor() + lifecycleCameraController = LifecycleCameraController(this) + lifecycleCameraController.bindToLifecycle(this) + lifecycleCameraController.imageCaptureFlashMode = ImageCapture.FLASH_MODE_AUTO + lifecycleCameraController.setImageAnalysisAnalyzer( + cameraExecutor, + QRCodeAnalyser { barcodes, imageWidth, imageHeight -> + if (barcodes.isEmpty()) { + return@QRCodeAnalyser + } + initScale(imageWidth, imageHeight) + val list = ArrayList() + val strList = ArrayList() + + barcodes.forEach { barcode -> + barcode.boundingBox?.let { rect -> + val translateRect = translateRect(rect) + list.add(translateRect) +// Log.e( +// "ztzt", "left:${translateRect.left} +" + +// " top:${translateRect.top} + right:${translateRect.right}" + +// " + bottom:${translateRect.bottom}" +// ) +// Log.e("ztzt", "barcode.rawValue:${barcode.rawValue}") + strList.add(barcode.rawValue ?: "No Value") + } + } + judgeIntent(strList) + binding.scanView.setRectList(list) + + }) + binding.previewView.controller = lifecycleCameraController + } + + private fun judgeIntent(list: ArrayList) { + val sb = StringBuilder() + list.forEach { + sb.append(it) + //sb.append("\n") + } + intentToResult(sb.toString()) + } + + private fun intentToResult(result: String) { + val resultIntent = Intent() + val bundle = Bundle() + bundle.putString("code", result) + resultIntent.putExtras(bundle) + setResult(RESULT_OK, resultIntent) + finish(); + } + + private var scaleX = 0f + private var scaleY = 0f + + private fun translateX(x: Float): Float = x * scaleX + private fun translateY(y: Float): Float = y * scaleY + + //将扫描的矩形换算为当前屏幕大小 + private fun translateRect(rect: Rect) = RectF( + translateX(rect.left.toFloat()), + translateY(rect.top.toFloat()), + translateX(rect.right.toFloat()), + translateY(rect.bottom.toFloat()) + ) + + //初始化缩放比例 + private fun initScale(imageWidth: Int, imageHeight: Int) { + //Log.e("ztzt", "imageWidth:${imageWidth} + imageHeight:${imageHeight}") + scaleY = binding.scanView.height.toFloat() / imageWidth.toFloat() + scaleX = binding.scanView.width.toFloat() / imageHeight.toFloat() + //Log.e("ztzt", "scaleX:${scaleX} + scaleY:${scaleY}") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/dywoa/weiget/ScanView.kt b/app/src/main/java/com/rehome/dywoa/weiget/ScanView.kt new file mode 100644 index 0000000..444074a --- /dev/null +++ b/app/src/main/java/com/rehome/dywoa/weiget/ScanView.kt @@ -0,0 +1,89 @@ +package com.rehome.dywoa.weiget + + +import android.animation.ObjectAnimator +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import androidx.core.content.ContextCompat +import com.rehome.dywoa.R + +/** + * Author:HuangWenfei + * description: 二维码扫描 + * date:2025/02/13 + */ +class ScanView(context: Context, attrs: AttributeSet) : View(context, attrs) { + private val circlePaint = Paint() //二维码圆圈画笔 + private var rectList: ArrayList? = null //二维码数组 + private var scanLine: Bitmap//横线 + private var isShowLine = true//是否显示扫描线 + private var animator: ObjectAnimator? = null + private var floatYFraction = 0f + set(value) { + field = value + invalidate() + } + + init { + circlePaint.apply { + this.style = Paint.Style.FILL + this.color = ContextCompat.getColor( + context, android.R.color.holo_green_dark + ) + } + + scanLine = BitmapFactory.decodeResource(resources, R.drawable.scan_light) + getAnimator().start() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + parseResult(canvas) + if (isShowLine) { + canvas.drawBitmap(scanLine, (width - scanLine.width) / 2f, height * floatYFraction, circlePaint) + } + } + + private fun getAnimator(): ObjectAnimator { + if (animator == null) { + animator = ObjectAnimator.ofFloat( + this, + "floatYFraction", + 0f, + 1f + ) + animator?.duration = 3000 + animator?.repeatCount = -1 //-1代表无限循环 + } + return animator!! + } + + private fun parseResult(canvas: Canvas?) { + rectList?.let { list -> + if (list.isEmpty()) { + return + } + list.forEach { + canvas?.drawCircle( + it.left + (it.right - it.left) / 2f, + it.top + (it.bottom - it.top) / 2f, + 50f, + circlePaint + ) + } + } + } + + fun setRectList(list: ArrayList?) { + rectList = list + rectList?.let { + if (it.isNotEmpty()) { + isShowLine = false + getAnimator().cancel() + invalidate() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/scan_light.png b/app/src/main/res/drawable-xhdpi/scan_light.png new file mode 100644 index 0000000000000000000000000000000000000000..1acef0b827092604feffad796e3f7a8669bb42b1 GIT binary patch literal 3342 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 Y51^~^wa8B(O#lD@07*qoM6N<$f|LrtR{#J2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/scan_bg.xml b/app/src/main/res/drawable/scan_bg.xml new file mode 100644 index 0000000..fdbe3e1 --- /dev/null +++ b/app/src/main/res/drawable/scan_bg.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_qr_code.xml b/app/src/main/res/layout/activity_qr_code.xml new file mode 100644 index 0000000..471ed55 --- /dev/null +++ b/app/src/main/res/layout/activity_qr_code.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7022beb..c3d1dd9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,4 +102,7 @@ 密码长度不能小于8位,且必须为大小写字母、数字和特殊字符组成! 输入验证码(必填) 发送验证码 + 将二维码/条码放入框内即可扫描 + 签到 + 请扫描二维码进行签到 \ No newline at end of file diff --git a/autolayout/build.gradle b/autolayout/build.gradle index c77c962..0ebad9f 100644 --- a/autolayout/build.gradle +++ b/autolayout/build.gradle @@ -11,5 +11,5 @@ android { } dependencies { - implementation libs.androidx.appcompat.v170 + implementation libs.androidx.appcompat } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4ffe11f..183fc6d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,36 +1,86 @@ [versions] +agentwebCore = "v5.1.1-androidx" agp = "8.8.0" -androidxAppcompatVersion = "1.1.0" -annotationVersion = "1.8.2" -appcompatVersion = "1.7.0" +androidxLocalbroadcastmanager = "1.1.0" +annotationVersion = "1.9.1" +appupdate = "4.2.6" +bcpkixJdk15on = "1.67" +circleimageview = "3.1.0" +commonsCodecCommonsCodec2 = "1.15" +crashreport = "4.1.9.3" +eventbus = "3.3.1" glide = "4.11.0" +hutoolAllVersion = "5.8.5" kotlin = "1.9.24" -coreKtx = "1.10.1" +coreKtx = "1.15.0" junit = "4.13.2" -junitVersion = "1.1.5" -espressoCore = "3.5.1" -appcompat = "1.6.1" -material = "1.10.0" -activity = "1.8.0" -constraintlayout = "2.1.4" -recyclerview = "1.3.0" +junitVersion = "1.2.1" +espressoCore = "3.6.1" +appcompat = "1.7.0" +library = "1.0.4" +lifecycleLivedataKtx = "2.6.2" +lifecycleViewmodelKtx = "2.6.2" +loggingInterceptor = "4.9.0" +material = "1.12.0" +activity = "1.10.0" +constraintlayout = "2.2.0" +multidex = "2.0.1" +orgEclipsePahoClientMqttv3Version = "1.2.4" +orgEclipsePahoAndroidServiceVersion = "1.1.1" +photoviewer = "0.50" +pictureselector = "v3.10.7" +recyclerview = "1.4.0" +retrofit = "2.9.0" +smarttable = "2.2.0" squareupPicasso = "2.5.2" +barcodeScanning = "16.1.1" +supportV4 = "28.0.0" +xui = "1.2.1" [libraries] -androidx-appcompat-v170 = { module = "androidx.appcompat:appcompat", version.ref = "appcompatVersion" } +agentweb-core = { module = "io.github.justson:agentweb-core", version.ref = "agentwebCore" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } +androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtx" } +androidx-localbroadcastmanager-localbroadcastmanager = { module = "androidx.localbroadcastmanager:localbroadcastmanager", version.ref = "androidxLocalbroadcastmanager" } +androidx-multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" } androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } annotation = { module = "androidx.annotation:annotation", version.ref = "annotationVersion" } -appcompat-v110 = { module = "androidx.appcompat:appcompat", version.ref = "androidxAppcompatVersion" } +appupdate = { module = "io.github.azhon:appupdate", version.ref = "appupdate" } +bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "bcpkixJdk15on" } +bcprov-jdk15on = { module = "org.bouncycastle:bcprov-jdk15on", version.ref = "bcpkixJdk15on" } +camerax = { module = "io.github.lucksiege:camerax", version.ref = "pictureselector" } +circleimageview = { module = "de.hdodenhof:circleimageview", version.ref = "circleimageview" } +cn-hutool-all = { module = "cn.hutool:hutool-all", version.ref = "hutoolAllVersion" } +com-google-mlkit-face-detection2 = { module = "com.google.mlkit:face-detection", version.ref = "barcodeScanning" } com-squareup-picasso-picasso = { module = "com.squareup.picasso:picasso", version.ref = "squareupPicasso" } +com-squareup-retrofit2-converter-gson5 = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } +commons-codec-commons-codec4 = { module = "commons-codec:commons-codec", version.ref = "commonsCodecCommonsCodec2" } +compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "glide" } +compress = { module = "io.github.lucksiege:compress", version.ref = "pictureselector" } +crashreport = { module = "com.tencent.bugly:crashreport", version.ref = "crashreport" } +eventbus = { module = "org.greenrobot:eventbus", version.ref = "eventbus" } glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +library = { module = "it.sephiroth.android.library.imagezoom:library", version.ref = "library" } +logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "loggingInterceptor" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } +barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "barcodeScanning" } +paho-org-eclipse-paho-android-service = { module = "org.eclipse.paho:org.eclipse.paho.android.service", version.ref = "orgEclipsePahoAndroidServiceVersion" } +paho-org-eclipse-paho-client-mqttv3 = { module = "org.eclipse.paho:org.eclipse.paho.client.mqttv3", version.ref = "orgEclipsePahoClientMqttv3Version" } +photoviewer = { module = "com.github.wanglu1209:PhotoViewer", version.ref = "photoviewer" } +pictureselector = { module = "io.github.lucksiege:pictureselector", version.ref = "pictureselector" } +recyclerview-v7 = { module = "com.android.support:recyclerview-v7", version.ref = "supportV4" } +smarttable = { module = "com.github.huangyanbin:SmartTable", version.ref = "smarttable" } +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } +support-v4 = { module = "com.android.support:support-v4", version.ref = "supportV4" } +ucrop = { module = "io.github.lucksiege:ucrop", version.ref = "pictureselector" } +xui = { module = "com.github.xuexiangjys:XUI", version.ref = "xui" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/matisse/build.gradle b/matisse/build.gradle index b732aaf..f2add3b 100644 --- a/matisse/build.gradle +++ b/matisse/build.gradle @@ -12,11 +12,10 @@ android { } dependencies { - implementation libs.appcompat.v110 + implementation libs.androidx.appcompat implementation libs.annotation implementation libs.androidx.recyclerview - //noinspection UseTomlInstead - implementation 'it.sephiroth.android.library.imagezoom:library:1.0.4' + implementation libs.library compileOnly libs.glide compileOnly libs.com.squareup.picasso.picasso } \ No newline at end of file diff --git a/tkrefreshlayout/build.gradle b/tkrefreshlayout/build.gradle index 6000299..e456e7d 100644 --- a/tkrefreshlayout/build.gradle +++ b/tkrefreshlayout/build.gradle @@ -11,6 +11,6 @@ android { } dependencies { - implementation 'com.android.support:support-v4:28.0.0' - implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation libs.support.v4 + implementation libs.recyclerview.v7 } \ No newline at end of file