This commit is contained in:
ocean 2025-11-11 15:44:38 +08:00
parent 6ab368132a
commit 3fa8ea357c
15 changed files with 516 additions and 135 deletions

View File

@ -7,7 +7,8 @@
<uses-feature <uses-feature
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> android:required="false" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
@ -38,6 +39,17 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.PDFReaderPro" android:theme="@style/Theme.PDFReaderPro"
tools:targetApi="36"> tools:targetApi="36">
<meta-data
android:name="android.max_aspect"
android:value="2.4" />
<!--适配华为huawei刘海屏-->
<meta-data
android:name="android.notch_support"
android:value="true" />
<!--适配小米xiaomi刘海屏-->
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
<activity <activity
android:name=".ui.act.SplashActivity" android:name=".ui.act.SplashActivity"
@ -55,7 +67,8 @@
android:name=".ui.act.MainActivity" android:name=".ui.act.MainActivity"
android:exported="true" android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="portrait" /> android:screenOrientation="portrait"
android:theme="@style/Theme.PDFReaderPro" />
<activity <activity
android:name=".ui.act.PdfViewActivity" android:name=".ui.act.PdfViewActivity"

View File

@ -1,17 +1,13 @@
package com.all.pdfreader.pro.app.ui.act package com.all.pdfreader.pro.app.ui.act
import android.app.Activity
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.all.pdfreader.pro.app.R
import com.all.pdfreader.pro.app.room.repository.PdfRepository import com.all.pdfreader.pro.app.room.repository.PdfRepository
import com.all.pdfreader.pro.app.sp.AppStore import com.all.pdfreader.pro.app.sp.AppStore
import com.all.pdfreader.pro.app.util.StoragePermissionHelper
import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.util.ToastUtils
import com.tom_roush.pdfbox.contentstream.operator.text.ShowText import com.gyf.immersionbar.ImmersionBar
abstract class BaseActivity : AppCompatActivity() { abstract class BaseActivity : AppCompatActivity() {

View File

@ -33,6 +33,8 @@ import com.all.pdfreader.pro.app.util.StoragePermissionHelper
import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.all.pdfreader.pro.app.viewmodel.PdfViewModel
import com.all.pdfreader.pro.app.viewmodel.observeEvent import com.all.pdfreader.pro.app.viewmodel.observeEvent
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.gyf.immersionbar.NavigationBarType
import com.gyf.immersionbar.OnNavigationBarListener
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
@ -57,12 +59,17 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setTheme(R.style.Theme_PDFReaderPro)
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
setupDoubleBackExit() setupDoubleBackExit()
initObserve() initObserve()
ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(false) ImmersionBar
.navigationBarColor(R.color.white).init() .with(this)
.statusBarView(binding.view)
.statusBarDarkFont(false)
.navigationBarColor(R.color.red)
.init()
setupFragments() setupFragments()
setupNavigation() setupNavigation()
@ -304,13 +311,13 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback
binding.drawerLayout.closeDrawer(binding.drawerView) binding.drawerLayout.closeDrawer(binding.drawerView)
} }
binding.privacyPolicyBtn.setOnClickListener { binding.privacyPolicyBtn.setOnClickListener {
val intent = Intent(this,PrivacyPolicyActivity::class.java) val intent = Intent(this, PrivacyPolicyActivity::class.java)
startActivity(intent) startActivity(intent)
binding.drawerLayout.closeDrawer(binding.drawerView) binding.drawerLayout.closeDrawer(binding.drawerView)
} }
} }
private fun setKeepScreenOn(b: Boolean){ private fun setKeepScreenOn(b: Boolean) {
if (b) { if (b) {
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else { } else {

View File

@ -2,11 +2,14 @@ package com.all.pdfreader.pro.app.ui.act
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.media.MediaScannerConnection
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.os.Parcelable import android.os.Parcelable
import android.util.Log
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -21,11 +24,16 @@ import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.ui.adapter.PdfResultAdapter import com.all.pdfreader.pro.app.ui.adapter.PdfResultAdapter
import com.all.pdfreader.pro.app.ui.dialog.PromptDialogFragment import com.all.pdfreader.pro.app.ui.dialog.PromptDialogFragment
import com.all.pdfreader.pro.app.util.AppUtils import com.all.pdfreader.pro.app.util.AppUtils
import com.all.pdfreader.pro.app.util.AppUtils.dpToPx
import com.all.pdfreader.pro.app.util.AppUtils.generateFastThumbnail import com.all.pdfreader.pro.app.util.AppUtils.generateFastThumbnail
import com.all.pdfreader.pro.app.util.FileUtils.toUnderscoreDateTime import com.all.pdfreader.pro.app.util.FileUtils.toUnderscoreDateTime
import com.all.pdfreader.pro.app.util.PdfScanner import com.all.pdfreader.pro.app.util.PdfScanner
import com.all.pdfreader.pro.app.util.PdfSecurityUtils import com.all.pdfreader.pro.app.util.PdfSecurityUtils
import com.all.pdfreader.pro.app.util.PdfUtils import com.all.pdfreader.pro.app.util.PdfUtils
import com.all.pdfreader.pro.app.util.ToastUtils
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -112,7 +120,7 @@ class PdfResultActivity : BaseActivity() {
private var exitDialog: PromptDialogFragment? = null private var exitDialog: PromptDialogFragment? = null
private val pdfRepository = getRepository() private val pdfRepository = getRepository()
private lateinit var pdfScanner: PdfScanner private lateinit var pdfScanner: PdfScanner
private var openedExternal = false private var isSaving = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -151,6 +159,7 @@ class PdfResultActivity : BaseActivity() {
binding.progressBar.isIndeterminate = false binding.progressBar.isIndeterminate = false
binding.progressBar.progress = 0 binding.progressBar.progress = 0
binding.progressBar.max = 100 binding.progressBar.max = 100
binding.okBtnTv.text = getString(R.string.open)
} }
val selectedList: ArrayList<PdfSelectedPagesItem> = val selectedList: ArrayList<PdfSelectedPagesItem> =
requireParcelableArrayList(EXTRA_SELECTED_LIST) requireParcelableArrayList(EXTRA_SELECTED_LIST)
@ -197,6 +206,7 @@ class PdfResultActivity : BaseActivity() {
binding.progressBar.isIndeterminate = false binding.progressBar.isIndeterminate = false
binding.progressBar.progress = 0 binding.progressBar.progress = 0
binding.progressBar.max = 100 binding.progressBar.max = 100
binding.okBtnTv.text = getString(R.string.open)
} }
val mergeInputFile: ArrayList<PdfDocumentEntity> = val mergeInputFile: ArrayList<PdfDocumentEntity> =
requireParcelableArrayList(EXTRA_MERGE_LIST) requireParcelableArrayList(EXTRA_MERGE_LIST)
@ -242,6 +252,7 @@ class PdfResultActivity : BaseActivity() {
val lockPassword = intent.getStringExtra(EXTRA_LOCK_UNLOCK_PASSWORD) ?: "" val lockPassword = intent.getStringExtra(EXTRA_LOCK_UNLOCK_PASSWORD) ?: ""
runOnUiThread { runOnUiThread {
binding.congratulationsDesc.text = getString(R.string.set_password_successfully) binding.congratulationsDesc.text = getString(R.string.set_password_successfully)
binding.okBtnTv.text = getString(R.string.open)
} }
PdfSecurityUtils.setPasswordToPdfWithProgress( PdfSecurityUtils.setPasswordToPdfWithProgress(
filepath, lockPassword, lockPassword filepath, lockPassword, lockPassword
@ -265,6 +276,7 @@ class PdfResultActivity : BaseActivity() {
runOnUiThread { runOnUiThread {
binding.congratulationsDesc.text = binding.congratulationsDesc.text =
getString(R.string.remove_password_successfully) getString(R.string.remove_password_successfully)
binding.okBtnTv.text = getString(R.string.open)
} }
PdfSecurityUtils.removePasswordFromPdfWithProgress( PdfSecurityUtils.removePasswordFromPdfWithProgress(
filepath, unlockPassword filepath, unlockPassword
@ -283,6 +295,9 @@ class PdfResultActivity : BaseActivity() {
finish() finish()
return@launch return@launch
} }
runOnUiThread {
binding.okBtnTv.text = getString(R.string.open)
}
val inputFiles: List<File> = files.map { path -> File(path) } val inputFiles: List<File> = files.map { path -> File(path) }
val outputDir = File( val outputDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
@ -316,6 +331,7 @@ class PdfResultActivity : BaseActivity() {
} }
runOnUiThread { runOnUiThread {
binding.congratulationsDesc.text = getString(R.string.converted_successfully) binding.congratulationsDesc.text = getString(R.string.converted_successfully)
binding.okBtnTv.text = getString(R.string.save_to_album)
} }
val selectedPages: ArrayList<PdfPageItem> = val selectedPages: ArrayList<PdfPageItem> =
requireParcelableArrayList(EXTRA_PDF_TO_IMAGE_LIST) requireParcelableArrayList(EXTRA_PDF_TO_IMAGE_LIST)
@ -353,6 +369,7 @@ class PdfResultActivity : BaseActivity() {
} }
runOnUiThread { runOnUiThread {
binding.congratulationsDesc.text = getString(R.string.converted_successfully) binding.congratulationsDesc.text = getString(R.string.converted_successfully)
binding.okBtnTv.text = getString(R.string.save_to_album)
} }
val selectedPages: ArrayList<PdfPageItem> = val selectedPages: ArrayList<PdfPageItem> =
requireParcelableArrayList(EXTRA_PDF_TO_IMAGE_LIST) requireParcelableArrayList(EXTRA_PDF_TO_IMAGE_LIST)
@ -374,14 +391,59 @@ class PdfResultActivity : BaseActivity() {
binding.progressTv.text = "$progressPercent" binding.progressTv.text = "$progressPercent"
} }
} }
)?.let { file-> )?.let { file ->
val result = PdfSplitResultItem(file.absolutePath, file.absolutePath, false) val result = PdfSplitResultItem(file.absolutePath, file.absolutePath, false)
resultList.add(result) resultList.add(result)
} }
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
binding.processingLayout.visibility = View.GONE binding.processingLayout.visibility = View.GONE
// 默认选中第一个 if (resultList.isNotEmpty()) {
if (resultList.size == 1) {
binding.multipleImageLayout.visibility = View.GONE
binding.oneResultView.visibility = View.VISIBLE
binding.recyclerView.visibility = View.GONE
val item = resultList[0]
if (item.thumbnailPath != null) {
Glide.with(binding.root).load(File(item.thumbnailPath))
.transform(
CenterCrop(),
RoundedCorners(4.dpToPx(binding.root.context))
)
.into(binding.image)
}
if (item.isPassword) {
binding.lockLayout.visibility = View.VISIBLE
} else {
binding.lockLayout.visibility = View.GONE
}
binding.fileNameTv.text = File(item.filePath).name
binding.pathTv.text =
binding.root.context.getString(R.string.path_details, item.filePath)
} else {
if (source == PdfPickerSource.PDF_TO_IMAGES) {
binding.multipleImageLayout.visibility = View.VISIBLE
binding.oneResultView.visibility = View.GONE
binding.recyclerView.visibility = View.GONE
val item = resultList[0]
if (item.thumbnailPath != null) {
Glide.with(binding.root).load(File(item.thumbnailPath))
.transform(
CenterCrop(),
RoundedCorners(4.dpToPx(binding.root.context))
)
.into(binding.multipleImage)
}
binding.multipleNumberTv.text = "${resultList.size}"
binding.multipleImageTv.text = getString(R.string.number_image_converted,resultList.size)
} else {
binding.multipleImageLayout.visibility = View.GONE
binding.oneResultView.visibility = View.GONE
binding.recyclerView.visibility = View.VISIBLE
}
}
}
// 默认选中第一个,只有一个也是第一个,所以点击的地方就不做修改了。就展示这里做修改
if (resultList.isNotEmpty() && resultList.none { it.isSelected }) { if (resultList.isNotEmpty() && resultList.none { it.isSelected }) {
resultList[0].isSelected = true resultList[0].isSelected = true
} }
@ -398,20 +460,26 @@ class PdfResultActivity : BaseActivity() {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.shareBtn.setOnClickListener { binding.shareBtn.setOnClickListener {
if (source == PdfPickerSource.PDF_TO_IMAGES || source == PdfPickerSource.TO_LONG_IMAGE) {
AppUtils.shareMultipleFiles(this, adapter.getAllFiles())
} else {
val selectedItem = adapter.getSelectedItem() val selectedItem = adapter.getSelectedItem()
selectedItem?.let { selectedItem?.let {
AppUtils.shareFile(this, File(selectedItem.filePath)) AppUtils.shareFile(this, File(selectedItem.filePath))
} }
} }
}
binding.okBtn.setOnClickListener { binding.okBtn.setOnClickListener {
if (source == PdfPickerSource.PDF_TO_IMAGES || source == PdfPickerSource.TO_LONG_IMAGE) { if (source == PdfPickerSource.PDF_TO_IMAGES || source == PdfPickerSource.TO_LONG_IMAGE) {
val selectedItem = adapter.getSelectedItem() if (isSaving) return@setOnClickListener
selectedItem?.let {
val string = AppUtils.openImageFile(this, File(selectedItem.filePath)) val imageFiles = adapter.getAllFiles()
if (string.isNotEmpty()) { val triggered = addImagesToGallery(this, imageFiles)
showToast(string)
} if (triggered) {
openedExternal = true isSaving = true // 触发过就不允许重复点击
//2秒后恢复按钮
binding.okBtn.postDelayed({ isSaving = false }, 2000)
} }
} else { } else {
val selectedItem = adapter.getSelectedItem() val selectedItem = adapter.getSelectedItem()
@ -426,9 +494,6 @@ class PdfResultActivity : BaseActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (openedExternal) {
finish()
}
} }
override fun onDestroy() { override fun onDestroy() {
@ -490,4 +555,47 @@ class PdfResultActivity : BaseActivity() {
return result ?: default return result ?: default
} }
/**
* 将指定图片文件列表同步到系统相册并返回是否成功触发操作
*
* @param context 上下文
* @param imageFiles 要导入的图片文件列表
* @return true 表示触发扫描成功false 表示无有效图片
*/
fun addImagesToGallery(context: Context, imageFiles: List<File>): Boolean {
if (imageFiles.isEmpty()) {
ToastUtils.show(context, context.getString(R.string.gallery_no_images_found))
return false
}
// 过滤有效图片
val validFiles = imageFiles.filter { file ->
file.exists() && file.isFile && (
file.extension.equals("jpg", true) ||
file.extension.equals("jpeg", true) ||
file.extension.equals("png", true) ||
file.extension.equals("webp", true)
)
}
if (validFiles.isEmpty()) {
ToastUtils.show(context, context.getString(R.string.gallery_no_images_found))
return false
}
val paths = validFiles.map { it.absolutePath }.toTypedArray()
// 扫描文件(异步触发系统媒体库)
MediaScannerConnection.scanFile(context, paths, null) { path, uri ->
Log.d("GallerySync", "Scanned: $path -> $uri")
}
ToastUtils.show(
context,
context.getString(R.string.gallery_saved_to_album, validFiles.size)
)
return true
}
} }

View File

@ -74,4 +74,12 @@ class PdfResultAdapter(
fun getSelectedItem(): PdfSplitResultItem? { fun getSelectedItem(): PdfSplitResultItem? {
return list.firstOrNull { it.isSelected } return list.firstOrNull { it.isSelected }
} }
fun getAllFiles(): List<File> {
return list.mapNotNull {
val f = File(it.filePath)
if (f.exists()) f else null
}
}
} }

View File

@ -34,7 +34,7 @@ class SplitSelectedPdfAdapter(
val thumbPath = item.getFirstThumbPath() val thumbPath = item.getFirstThumbPath()
if (thumbPath.isNotEmpty()) { if (thumbPath.isNotEmpty()) {
Glide.with(holder.binding.root).load(File(thumbPath)) Glide.with(holder.binding.root).load(File(thumbPath))
.transform(CenterCrop(), RoundedCorners(8.dpToPx(holder.binding.root.context))) .transform(CenterCrop(), RoundedCorners(4.dpToPx(holder.binding.root.context)))
.into(holder.binding.tvFileImg) .into(holder.binding.tvFileImg)
} }
holder.binding.tvFileName.text = item.fileName holder.binding.tvFileName.text = item.fileName

View File

@ -117,7 +117,7 @@ object AppUtils {
fun shareFile(context: Context, file: File) { fun shareFile(context: Context, file: File) {
try { try {
if (!file.exists()) { if (!file.exists()) {
ToastUtils.show(context,context.getString(R.string.error_file_not_exist)) ToastUtils.show(context, context.getString(R.string.error_file_not_exist))
return return
} }
@ -144,6 +144,60 @@ object AppUtils {
} }
} }
/**
* 分享多个文件自动识别 MIME 类型
* @param context 上下文
* @param files 要分享的文件列表
*/
fun shareMultipleFiles(context: Context, files: List<File>) {
try {
if (files.isEmpty()) {
ToastUtils.show(context, context.getString(R.string.error_file_not_exist))
return
}
if (files.size == 1) {
shareFile(context, files[0])
return
}
// 过滤掉不存在的文件
val validFiles = files.filter { it.exists() }
if (validFiles.isEmpty()) {
ToastUtils.show(context, context.getString(R.string.error_file_not_exist))
return
}
val uris = ArrayList<Uri>()
for (file in validFiles) {
val uri = FileProvider.getUriForFile(
context,
"${context.packageName}.fileprovider",
file
)
uris.add(uri)
}
// 统一判断 MIME 类型(若不同类型,则用 "*/*"
val firstMime = getMimeType(validFiles.first())
val allSameMime = validFiles.all { getMimeType(it) == firstMime }
val mimeType = if (allSameMime) firstMime ?: "*/*" else "*/*"
val shareIntent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
type = mimeType
putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
context.startActivity(
Intent.createChooser(shareIntent, "share")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
)
} catch (e: Exception) {
e.printStackTrace()
}
}
/** /**
* 根据文件扩展名自动获取 MIME 类型 * 根据文件扩展名自动获取 MIME 类型
*/ */
@ -354,5 +408,4 @@ object AppUtils {
Toast.makeText(context, "Unable to share app info.", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Unable to share app info.", Toast.LENGTH_SHORT).show()
} }
} }
} }

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="4dp"
android:bottomRightRadius="4dp" />
<solid android:color="#67000000" />
</shape>

View File

@ -133,6 +133,7 @@
<RelativeLayout <RelativeLayout
android:id="@+id/splitSelectLayout" android:id="@+id/splitSelectLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@color/bg_color"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
@ -140,7 +141,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_above="@+id/splitBtn" android:layout_above="@+id/splitBtn"
android:layout_margin="8dp"
android:overScrollMode="never" android:overScrollMode="never"
android:scrollbars="none" android:scrollbars="none"
tools:itemCount="3" tools:itemCount="3"

View File

@ -86,6 +86,10 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -95,7 +99,7 @@
<ImageView <ImageView
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_marginTop="58dp" android:layout_marginTop="32dp"
android:background="@drawable/drw_result_congratulations_bg" android:background="@drawable/drw_result_congratulations_bg"
android:padding="10dp" android:padding="10dp"
android:src="@drawable/gou_white" /> android:src="@drawable/gou_white" />
@ -129,6 +133,172 @@
android:layout_margin="16dp" android:layout_margin="16dp"
android:background="@drawable/dashed_line" /> android:background="@drawable/dashed_line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/oneResultView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:layout_width="82dp"
android:layout_height="100dp"
android:background="@drawable/dr_item_img_frame"
android:padding="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/dr_placeholder_bg"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/file_document" />
</LinearLayout>
<ImageView
android:id="@+id/image"
android:layout_width="82dp"
android:layout_height="100dp" />
<LinearLayout
android:id="@+id/lock_layout"
android:layout_width="82dp"
android:layout_height="100dp"
android:background="@drawable/dr_item_lock_bg"
android:gravity="center"
android:visibility="gone">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/icon_lock_item" />
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/fileNameTv"
style="@style/TextViewFont_PopMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:maxLines="1"
android:text="@string/app_name"
android:textColor="@color/text_color_lv1"
android:textSize="16sp" />
<TextView
android:id="@+id/pathTv"
style="@style/TextViewFont_PopRegular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center"
android:maxLines="2"
android:text="@string/path_details"
android:textColor="@color/text_color_lv2"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/multipleImageLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:layout_width="92dp"
android:layout_height="110dp">
<View
android:layout_width="82dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:rotation="5"
android:background="@drawable/dr_placeholder_bg"/>
<RelativeLayout
android:layout_width="82dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:background="@drawable/dr_item_img_frame"
android:padding="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/dr_placeholder_bg"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/file_document" />
</LinearLayout>
<ImageView
android:id="@+id/multipleImage"
android:layout_width="82dp"
android:layout_height="100dp" />
<TextView
android:id="@+id/multipleNumberTv"
style="@style/TextViewFont_PopMedium"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_alignParentStart="true"
android:background="@drawable/dr_collect_state_black_bg"
android:gravity="center"
android:text="1"
android:textColor="@color/white"
android:textSize="12sp" />
</RelativeLayout>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/multipleImageTv"
style="@style/TextViewFont_PopMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:maxLines="1"
android:text="@string/number_image_converted"
android:textColor="@color/text_color_lv1"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
@ -138,6 +308,8 @@
tools:itemCount="3" tools:itemCount="3"
tools:listitem="@layout/adapter_selected_result_item" /> tools:listitem="@layout/adapter_selected_result_item" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -145,7 +317,7 @@
android:padding="24dp"> android:padding="24dp">
<LinearLayout <LinearLayout
android:id="@+id/okBtn" android:id="@+id/shareBtn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_weight="1" android:layout_weight="1"
@ -153,17 +325,16 @@
android:gravity="center"> android:gravity="center">
<TextView <TextView
android:id="@+id/okBtnTv"
style="@style/TextViewFont_PopSemiBold" style="@style/TextViewFont_PopSemiBold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/open" android:text="@string/share_file"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="16sp" /> android:textSize="16sp" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/shareBtn" android:id="@+id/okBtn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
@ -172,10 +343,11 @@
android:gravity="center"> android:gravity="center">
<TextView <TextView
android:id="@+id/okBtnTv"
style="@style/TextViewFont_PopSemiBold" style="@style/TextViewFont_PopSemiBold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/share_file" android:text="@string/open"
android:textColor="@color/icon_on" android:textColor="@color/icon_on"
android:textSize="16sp" /> android:textSize="16sp" />
</LinearLayout> </LinearLayout>
@ -183,4 +355,6 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout> </LinearLayout>

View File

@ -15,8 +15,9 @@
android:orientation="horizontal"> android:orientation="horizontal">
<RelativeLayout <RelativeLayout
android:layout_width="56dp" android:layout_width="50dp"
android:layout_height="56dp" android:padding="1dp"
android:layout_height="60dp"
android:background="@drawable/dr_item_img_frame"> android:background="@drawable/dr_item_img_frame">
<LinearLayout <LinearLayout
@ -34,13 +35,13 @@
<ImageView <ImageView
android:id="@+id/image" android:id="@+id/image"
android:layout_width="56dp" android:layout_width="50dp"
android:layout_height="56dp" /> android:layout_height="60dp" />
<LinearLayout <LinearLayout
android:id="@+id/lock_layout" android:id="@+id/lock_layout"
android:layout_width="56dp" android:layout_width="50dp"
android:layout_height="56dp" android:layout_height="60dp"
android:background="@drawable/dr_item_lock_bg" android:background="@drawable/dr_item_lock_bg"
android:gravity="center" android:gravity="center"
android:visibility="gone"> android:visibility="gone">

View File

@ -3,9 +3,13 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/dr_rounded_corner_12_bg_white"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="8dp" android:paddingStart="16dp"
android:paddingTop="8dp" android:paddingTop="16dp"
android:paddingEnd="6dp"
android:paddingBottom="16dp"
tools:ignore="RtlSymmetry"> tools:ignore="RtlSymmetry">
<LinearLayout <LinearLayout
@ -15,9 +19,10 @@
android:orientation="horizontal"> android:orientation="horizontal">
<RelativeLayout <RelativeLayout
android:layout_width="56dp" android:layout_width="66dp"
android:layout_height="56dp" android:layout_height="80dp"
android:background="@drawable/dr_item_img_frame"> android:background="@drawable/dr_item_img_frame"
android:padding="1dp">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -34,8 +39,8 @@
<ImageView <ImageView
android:id="@+id/tvFileImg" android:id="@+id/tvFileImg"
android:layout_width="56dp" android:layout_width="66dp"
android:layout_height="56dp" /> android:layout_height="80dp" />
</RelativeLayout> </RelativeLayout>
@ -87,6 +92,7 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
@ -128,13 +134,4 @@
android:src="@drawable/delete_cha_icon" /> android:src="@drawable/delete_cha_icon" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:background="@color/line_color" />
</LinearLayout> </LinearLayout>

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#008577</color>
<color name="colorAccent">#D81B60</color>
<color name="colorBarText">#F0F5E5</color>
<color name="purple_200">#FFBB86FC</color> <color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color> <color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color> <color name="purple_700">#FF3700B3</color>

View File

@ -185,4 +185,10 @@
<string name="file_viewing">File Viewing</string> <string name="file_viewing">File Viewing</string>
<string name="faq_file_viewing1">How to enable "Reflow" mode?</string> <string name="faq_file_viewing1">How to enable "Reflow" mode?</string>
<string name="faq_file_viewing1_des"><![CDATA[Open the file and tap <font color="#000000">&quot;View mode&quot;</font> in the bottom bar. From there, you can toggle <font color="#000000">&quot;Reflow&quot;</font> mode on or off.<br><br>Currently,this feature is only available on Android7 and above device.We will continue to optimize it and support more systems in the future.Please stay tuned.]]></string> <string name="faq_file_viewing1_des"><![CDATA[Open the file and tap <font color="#000000">&quot;View mode&quot;</font> in the bottom bar. From there, you can toggle <font color="#000000">&quot;Reflow&quot;</font> mode on or off.<br><br>Currently,this feature is only available on Android7 and above device.We will continue to optimize it and support more systems in the future.Please stay tuned.]]></string>
<string name="gallery_folder_not_exist">Target folder does not exist</string>
<string name="gallery_no_images_found">No images found to import</string>
<string name="gallery_saved_to_album">Saved to gallery, total %1$d image(s)</string>
<string name="save_to_album">Save to Album</string>
<string name="one_image_converted">1 image converted</string>
<string name="number_image_converted">%1$d imagesF converted</string>
</resources> </resources>

View File

@ -1,8 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.PDFReaderPro" parent="Theme.AppCompat.DayNight.NoActionBar" /> <style name="Theme.PDFReaderPro" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@android:color/white</item>
</style>
<!-- SplashActivity theme --> <!-- SplashActivity theme -->
<style name="Theme.PDFReaderPro.NoActionBar"> <style name="Theme.PDFReaderPro.NoActionBar">
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>