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