From 544fe96be5ef278d3e328e40d225afeef598ed6b Mon Sep 17 00:00:00 2001
From: ocean <503259349@qq.com>
Date: Tue, 16 Dec 2025 14:00:03 +0800
Subject: [PATCH] update
---
app/src/main/AndroidManifest.xml | 6 ++
.../pdfreader/pdf/reader/ad/AdInstShower.kt | 14 +++
.../pdf/reader/ui/act/PdfViewActivity.kt | 1 +
.../reader/ui/act/PictureSelectorActivity.kt | 87 ++++++++----------
.../ui/act/PictureSelectorCameraActivity.kt | 88 +++++++++++++++++++
.../pdf/reader/ui/fragment/ToolsFrag.kt | 5 ++
.../pdf/reader/util/AnalyticsUtils.kt | 5 ++
.../all/pdfreader/pdf/reader/util/AppUtils.kt | 3 +
.../main/res/drawable/drw_tools_scan_bg.xml | 8 ++
.../res/drawable/tools_scan_to_pdf_img.xml | 34 +++++++
app/src/main/res/layout/fragment_tools.xml | 64 +++++++-------
app/src/main/res/values/strings.xml | 1 +
12 files changed, 234 insertions(+), 82 deletions(-)
create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorCameraActivity.kt
create mode 100644 app/src/main/res/drawable/drw_tools_scan_bg.xml
create mode 100644 app/src/main/res/drawable/tools_scan_to_pdf_img.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b454418..7a21697 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -150,6 +150,12 @@
android:label="@string/app_name"
android:screenOrientation="portrait" />
+
+
$errorMsg")
+
+ AnalyticsUtils.logAdEvent(
+ placement,
+ AnalyticsUtils.AdEvent.SHOW_FAIL_ME,
+ 1001,
+ errorMsg
+ )
return
}
}
@@ -38,6 +45,13 @@ class AdInstShower(
val errorMsg = "插页式广告缓存为空 = $placement"
showListener?.onAdShowFailed(errorMsg)
Log.d(AdsInsUtil.Placement.TAG, "showAd->$errorMsg")
+
+ AnalyticsUtils.logAdEvent(
+ placement,
+ AnalyticsUtils.AdEvent.SHOW_FAIL_ME,
+ 1002,
+ errorMsg
+ )
return
}
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt
index 6fd2d6f..0fc7941 100644
--- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt
@@ -489,6 +489,7 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
setSelection(0)
}
} else {
+ AnalyticsUtils.logEvent(AnalyticsUtils.Event.PDFTO_HOME_CK)
AdsInsUtil.showFinishAd(
this@PdfViewActivity,
AdsInsUtil.AdPlacement.INT_AND_PDFTOHOME
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorActivity.kt
index fbdf85b..0c1a002 100644
--- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorActivity.kt
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorActivity.kt
@@ -1,11 +1,9 @@
package com.all.pdfreader.pdf.reader.ui.act
-import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.core.net.toUri
-import androidx.fragment.app.Fragment
import com.all.pdfreader.pdf.reader.PRApp
import com.all.pdfreader.pdf.reader.R
import com.all.pdfreader.pdf.reader.databinding.ActPictureSelectorBinding
@@ -18,8 +16,6 @@ import com.luck.picture.lib.config.SelectMimeType
import com.luck.picture.lib.config.SelectModeConfig
import com.luck.picture.lib.engine.CompressFileEngine
import com.luck.picture.lib.entity.LocalMedia
-import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener
-import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.luck.picture.lib.style.PictureSelectorStyle
import com.luck.picture.lib.style.SelectMainStyle
@@ -64,58 +60,47 @@ class PictureSelectorActivity : BaseActivity() {
.setSelectionMode(SelectModeConfig.MULTIPLE)
.setMaxSelectNum(50)
.isPreviewFullScreenMode(false)
- .setCompressEngine(object : CompressFileEngine {
- override fun onStartCompress(
- context: Context?,
- source: ArrayList?,
- call: OnKeyValueResultCallbackListener?
- ) {
- Luban.with(context)
- .load(source)
- .ignoreBy(100)
- .setCompressListener(object : OnNewCompressListener {
- override fun onStart() {
+ .setCompressEngine(CompressFileEngine { context, source, call ->
+ Luban.with(context)
+ .load(source)
+ .ignoreBy(100)
+ .setCompressListener(object : OnNewCompressListener {
+ override fun onStart() {
- }
+ }
- override fun onSuccess(
- source: String?,
- compressFile: File?
- ) {
- call?.onCallback(source, compressFile?.absolutePath)
- }
+ override fun onSuccess(
+ source: String?,
+ compressFile: File?
+ ) {
+ call?.onCallback(source, compressFile?.absolutePath)
+ }
- override fun onError(source: String?, e: Throwable?) {
- call?.onCallback(source, null)
- }
- })
- .launch()
- }
+ override fun onError(source: String?, e: Throwable?) {
+ call?.onCallback(source, null)
+ }
+ })
+ .launch()
})
- .setEditMediaInterceptListener(object : OnMediaEditInterceptListener {
- override fun onStartMediaEdit(
- fragment: Fragment, currentLocalMedia: LocalMedia, requestCode: Int
- ) {
- val currentEditPath = currentLocalMedia.getAvailablePath()
- val inputUri = if (PictureMimeType.isContent(currentEditPath)) {
- currentEditPath.toUri()
- } else {
- Uri.fromFile(File(currentEditPath))
- }
- val destinationUri = Uri.fromFile(
- File(
- getSandboxPath(), DateUtils.getCreateFileName("CROP_") + ".jpeg"
- )
- )
- val uCrop = UCrop.of(inputUri, destinationUri)
- val buildOptions = UCrop.Options().apply {
- isDarkStatusBarBlack(true)
- }
- uCrop.withOptions(buildOptions)
- uCrop.start(this@PictureSelectorActivity, fragment, requestCode)
+ .setEditMediaInterceptListener { fragment, currentLocalMedia, requestCode ->
+ val currentEditPath = currentLocalMedia.getAvailablePath()
+ val inputUri = if (PictureMimeType.isContent(currentEditPath)) {
+ currentEditPath.toUri()
+ } else {
+ Uri.fromFile(File(currentEditPath))
}
-
- }).buildLaunch(R.id.fragment_container,object : OnResultCallbackListener{
+ val destinationUri = Uri.fromFile(
+ File(
+ getSandboxPath(), DateUtils.getCreateFileName("CROP_") + ".jpeg"
+ )
+ )
+ val uCrop = UCrop.of(inputUri, destinationUri)
+ val buildOptions = UCrop.Options().apply {
+ isDarkStatusBarBlack(true)
+ }
+ uCrop.withOptions(buildOptions)
+ uCrop.start(this@PictureSelectorActivity, fragment, requestCode)
+ }.buildLaunch(R.id.fragment_container,object : OnResultCallbackListener{
override fun onResult(result: ArrayList) {
logDebug("forResult ->${result.size}")
if (result.isNotEmpty()) {
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorCameraActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorCameraActivity.kt
new file mode 100644
index 0000000..92c0f00
--- /dev/null
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PictureSelectorCameraActivity.kt
@@ -0,0 +1,88 @@
+package com.all.pdfreader.pdf.reader.ui.act
+
+import android.os.Bundle
+import android.view.View
+import com.all.pdfreader.pdf.reader.R
+import com.all.pdfreader.pdf.reader.databinding.ActPictureSelectorBinding
+import com.all.pdfreader.pdf.reader.model.PdfPickerSource
+import com.all.pdfreader.pdf.reader.util.AnalyticsUtils
+import com.luck.picture.lib.basic.PictureSelector
+import com.luck.picture.lib.config.SelectMimeType
+import com.luck.picture.lib.engine.CompressFileEngine
+import com.luck.picture.lib.entity.LocalMedia
+import com.luck.picture.lib.interfaces.OnResultCallbackListener
+import top.zibin.luban.Luban
+import top.zibin.luban.OnNewCompressListener
+import java.io.File
+
+class PictureSelectorCameraActivity : BaseActivity() {
+ private lateinit var binding: ActPictureSelectorBinding
+ override val rootBottomView: View
+ get() = binding.rootBottomLayout
+ override val TAG = "PictureSelectorCameraActivity"
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActPictureSelectorBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ AnalyticsUtils.logEvent(AnalyticsUtils.Event.SCAN_TO_PDF_SHOW)
+ setupImmersionBar {
+ statusBarView(binding.view)
+ statusBarDarkFont(false)
+ }
+ openImagePicker()
+ }
+
+ private fun openImagePicker() {
+ PictureSelector.create(this)
+ .openCamera(SelectMimeType.ofImage())
+ .setCompressEngine(CompressFileEngine { context, source, call ->
+ Luban.with(context)
+ .load(source)
+ .ignoreBy(100)
+ .setCompressListener(object : OnNewCompressListener {
+ override fun onStart() {
+
+ }
+
+ override fun onSuccess(
+ source: String?,
+ compressFile: File?
+ ) {
+ call?.onCallback(source, compressFile?.absolutePath)
+ }
+
+ override fun onError(source: String?, e: Throwable?) {
+ call?.onCallback(source, null)
+ }
+ })
+ .launch()
+ })
+ .buildLaunch(R.id.fragment_container, object : OnResultCallbackListener {
+ override fun onResult(result: ArrayList) {
+ logDebug("forResult ->${result.size}")
+ if (result.isNotEmpty()) {
+ // result 中可能有带裁剪的 Uri 或原图 Uri
+ // 取出路径列表
+ val paths = result.mapNotNull { media ->
+ media.availablePath
+ }
+ if (paths.isEmpty()) {
+ return
+ }
+ val intent = PdfResultActivity.createIntentInputFile(
+ this@PictureSelectorCameraActivity,
+ ArrayList(paths),
+ PdfPickerSource.IMAGES_TO_PDF
+ )
+ startActivity(intent)
+ finish()
+ }
+ }
+
+ override fun onCancel() {
+ finish()
+ }
+
+ })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/ToolsFrag.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/ToolsFrag.kt
index fc64993..54c6efc 100644
--- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/ToolsFrag.kt
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/ToolsFrag.kt
@@ -9,6 +9,7 @@ import com.all.pdfreader.pdf.reader.databinding.FragmentToolsBinding
import com.all.pdfreader.pdf.reader.model.PdfPickerSource
import com.all.pdfreader.pdf.reader.ui.act.PdfPickerActivity
import com.all.pdfreader.pdf.reader.ui.act.PictureSelectorActivity
+import com.all.pdfreader.pdf.reader.ui.act.PictureSelectorCameraActivity
class ToolsFrag : BaseFrag() {
override val TAG: String = "ToolsFrag"
@@ -59,5 +60,9 @@ class ToolsFrag : BaseFrag() {
val intent = PdfPickerActivity.createIntent(requireActivity(), PdfPickerSource.PRINT)
startActivity(intent)
}
+ binding.scanToPdfBtn.setOnClickListener {
+ val intent = Intent(requireActivity(), PictureSelectorCameraActivity::class.java)
+ startActivity(intent)
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt
index 3d38039..162fc1b 100644
--- a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt
@@ -96,6 +96,10 @@ object AnalyticsUtils {
const val UNLOCK_SUCCESS = "unlock_success" // 解锁成功(unlock_success)
const val KEEP_SCREEN_OPEN = "keep_screen_open" // 点击打开(keep_screen_open)
const val KEEP_SCREEN_CLOSE = "keep_screen_close" // 点击关闭(keep_screen_close)
+ const val SHARE = "share"//所有分享文件的操作
+ const val PRINT = "print"//所有打印
+ const val PDFTO_HOME_CK = "pdfto_home_ck"//pdf阅读页响应返回
+ const val SCAN_TO_PDF_SHOW = "scan_to_pdf_show" //扫描成pdf功能界面
}
/** param 常量(可扩展) */
@@ -112,6 +116,7 @@ object AnalyticsUtils {
LOAD_FAIL("load_fail_header"),
SHOW_SUC("show_suc_header"),
SHOW_FAIL("show_fail_header"),
+ SHOW_FAIL_ME("show_fail_me_header"),//记录自定义的错误信息
}
/** 统一广告打点 */
diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AppUtils.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AppUtils.kt
index ebe4ef9..78b935f 100644
--- a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AppUtils.kt
+++ b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AppUtils.kt
@@ -115,6 +115,7 @@ object AppUtils {
* @param file 要分享的文件
*/
fun shareFile(context: Context, file: File) {
+ AnalyticsUtils.logEvent(AnalyticsUtils.Event.SHARE)
try {
if (!file.exists()) {
ToastUtils.show(context, context.getString(R.string.error_file_not_exist))
@@ -150,6 +151,7 @@ object AppUtils {
* @param files 要分享的文件列表
*/
fun shareMultipleFiles(context: Context, files: List) {
+ AnalyticsUtils.logEvent(AnalyticsUtils.Event.SHARE)
try {
if (files.isEmpty()) {
ToastUtils.show(context, context.getString(R.string.error_file_not_exist))
@@ -214,6 +216,7 @@ object AppUtils {
* @return PrintResult 打印结果的状态(成功、密码保护、设备不支持等)
*/
fun printPdfFile(context: Context, uri: Uri?): PrintResult {
+ AnalyticsUtils.logEvent(AnalyticsUtils.Event.PRINT)
return try {
// 打开文件描述符,用于访问 PDF 文件内容
val pd = context.contentResolver.openFileDescriptor(
diff --git a/app/src/main/res/drawable/drw_tools_scan_bg.xml b/app/src/main/res/drawable/drw_tools_scan_bg.xml
new file mode 100644
index 0000000..17e8c2e
--- /dev/null
+++ b/app/src/main/res/drawable/drw_tools_scan_bg.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tools_scan_to_pdf_img.xml b/app/src/main/res/drawable/tools_scan_to_pdf_img.xml
new file mode 100644
index 0000000..b2f1de4
--- /dev/null
+++ b/app/src/main/res/drawable/tools_scan_to_pdf_img.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_tools.xml b/app/src/main/res/layout/fragment_tools.xml
index bfb06df..f7e4943 100644
--- a/app/src/main/res/layout/fragment_tools.xml
+++ b/app/src/main/res/layout/fragment_tools.xml
@@ -117,6 +117,37 @@
android:layout_marginBottom="16dp"
android:orientation="horizontal">
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
@@ -277,12 +279,12 @@
+ android:orientation="vertical">
Processing failed
Tap again to exit
Ad
+ Scan to PDF
\ No newline at end of file