diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a1fc4c8..87abfa4 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,7 +1,10 @@
+import org.gradle.kotlin.dsl.implementation
+
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.devtools.ksp)
+ id("kotlin-parcelize")
}
android {
@@ -54,4 +57,7 @@ dependencies {
implementation(libs.androidx.room.runtime)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.ktx)
+ implementation(libs.glide)
+ implementation(libs.androidpdfviewer)
+ implementation(libs.pdfbox.android)
}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 481bb43..c639003 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -18,4 +18,6 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
+#-renamesourcefileattribute SourceFile
+
+-keep class com.shockwave.**
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1174aaf..08059ab 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,14 +4,15 @@
-
+
-
+
-
-
+
+
+
-
+
+
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt b/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt
index c5d6997..a91933d 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/room/entity/PdfDocumentEntity.kt
@@ -1,8 +1,11 @@
package com.all.pdfreader.pro.app.room.entity
+import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
+import kotlinx.parcelize.Parcelize
+@Parcelize
@Entity(tableName = "pdf_documents")
data class PdfDocumentEntity(
@PrimaryKey
@@ -28,4 +31,4 @@ data class PdfDocumentEntity(
val metadataKeywords: String? = null, // PDF元数据关键词
val metadataCreationDate: Long? = null, // PDF创建时间
val metadataModificationDate: Long? = null // PDF修改时间
-)
\ No newline at end of file
+): Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/BaseActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/BaseActivity.kt
index 3f5bc3e..b6d6e0a 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/BaseActivity.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/BaseActivity.kt
@@ -4,11 +4,13 @@ import android.app.Activity
import android.os.Build
import android.os.Bundle
import android.util.Log
+import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.all.pdfreader.pro.app.room.repository.PdfRepository
import com.all.pdfreader.pro.app.sp.AppStore
import com.all.pdfreader.pro.app.util.StoragePermissionHelper
+import com.tom_roush.pdfbox.contentstream.operator.text.ShowText
abstract class BaseActivity : AppCompatActivity() {
@@ -60,6 +62,10 @@ abstract class BaseActivity : AppCompatActivity() {
Log.w("ocean", "$TAG: $message")
}
+ protected fun showToast(message: String) {
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+ }
+
//获取数据库实例
protected fun getRepository(): PdfRepository {
return PdfRepository.getInstance()
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt
new file mode 100644
index 0000000..e941b8f
--- /dev/null
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt
@@ -0,0 +1,100 @@
+package com.all.pdfreader.pro.app.ui.act
+
+import android.content.Context
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import androidx.lifecycle.lifecycleScope
+import com.all.pdfreader.pro.app.R
+import com.all.pdfreader.pro.app.databinding.ActivityPdfViewBinding
+import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
+import com.github.barteksc.pdfviewer.listener.OnErrorListener
+import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener
+import com.github.barteksc.pdfviewer.listener.OnPageChangeListener
+import kotlinx.coroutines.launch
+import java.io.File
+
+class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeListener,
+ OnErrorListener {
+ override val TAG: String = "PdfViewActivity"
+
+ private lateinit var binding: ActivityPdfViewBinding
+ private lateinit var pdfDocument: PdfDocumentEntity
+ private val pdfRepository = getRepository()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityPdfViewBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ // 获取传递的PDF文档数据
+ pdfDocument = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ intent.getParcelableExtra(EXTRA_PDF_DOCUMENT, PdfDocumentEntity::class.java)
+ } else {
+ @Suppress("DEPRECATION") intent.getParcelableExtra(EXTRA_PDF_DOCUMENT)
+ } ?: throw IllegalArgumentException("PDF document data is required")
+
+ loadPdf()
+ }
+
+ private fun loadPdf() {
+ // 使用传递的文件路径加载PDF
+ val file = File(pdfDocument.filePath)
+ if (file.exists()) {
+ binding.pdfview
+ .fromFile(file)
+ .defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始
+ .enableDoubletap(true)// 是否允许双击缩放
+ .onLoad(this)
+ .enableAnnotationRendering(true) // 是否渲染注释(如评论、颜色、表单等)
+ .onError(this)
+ .onPageChange(this)
+ .load()
+ } else {
+ showToast(getString(R.string.file_not) + ": ${pdfDocument.fileName}")
+ finish()
+ }
+ }
+
+ //PDF 文档加载完成时回调
+ override fun loadComplete(nbPages: Int) {
+
+ }
+
+ //PDF 加载出错时回调
+ override fun onError(t: Throwable?) {
+
+ }
+
+ //页面切换时回调
+ override fun onPageChanged(page: Int, pageCount: Int) {
+ // 保存阅读进度
+ pdfDocument = pdfDocument.copy(
+ lastReadPage = page, readingProgress = (page.toFloat() / pageCount.toFloat()) * 100
+ )
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ saveReadingProgress()
+ }
+
+ private fun saveReadingProgress() {
+ lifecycleScope.launch {
+ pdfRepository.updateReadingProgress(
+ pdfDocument.fileHash, pdfDocument.lastReadPage, pdfDocument.readingProgress
+ )
+ }
+ }
+
+ companion object {
+ private const val EXTRA_PDF_DOCUMENT = "extra_pdf_document"
+
+ // 创建启动Intent的便捷方法
+ fun createIntent(context: Context, pdfDocument: PdfDocumentEntity): Intent {
+ return Intent(context, PdfViewActivity::class.java).apply {
+ putExtra(EXTRA_PDF_DOCUMENT, pdfDocument)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt
index 0e9f65e..d23e2b3 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt
@@ -6,8 +6,12 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.all.pdfreader.pro.app.databinding.AdapterPdfItemBinding
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
+import com.all.pdfreader.pro.app.util.AppUtils.dpToPx
import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize
import com.all.pdfreader.pro.app.util.FileUtils.toSlashDate
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.bitmap.CenterCrop
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners
class PdfAdapter(
private var pdfList: MutableList,
@@ -30,6 +34,9 @@ class PdfAdapter(
holder.binding.tvFileName.text = item.fileName
holder.binding.tvFileSize.text = item.fileSize.toFormatFileSize()
holder.binding.tvFileDate.text = item.lastModified.toSlashDate()
+ Glide.with(holder.binding.root).load(item.thumbnailPath)
+ .transform(CenterCrop(), RoundedCorners(8.dpToPx(holder.binding.root.context)))
+ .into(holder.binding.tvFileImg)
holder.binding.root.setOnClickListener {
onItemClick(item)
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt
index 7b30cb4..c0912f9 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt
@@ -14,6 +14,7 @@ import com.all.pdfreader.pro.app.model.SortConfig
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.room.repository.PdfRepository
import com.all.pdfreader.pro.app.ui.act.MainActivity
+import com.all.pdfreader.pro.app.ui.act.PdfViewActivity
import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter
import com.all.pdfreader.pro.app.util.PdfScanner
import kotlinx.coroutines.launch
@@ -37,7 +38,9 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment {
private fun initView() {
adapter = PdfAdapter(pdfList = mutableListOf(), onItemClick = { pdf ->
- Toast.makeText(requireContext(), "点击: ${pdf.fileName}", Toast.LENGTH_SHORT).show()
+ val intent = PdfViewActivity.createIntent(requireContext(), pdf)
+ startActivity(intent)
+
}, onMoreClick = { pdf ->
Toast.makeText(requireContext(), "更多操作: ${pdf.fileName}", Toast.LENGTH_SHORT).show()
})
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/util/AppUtils.kt b/app/src/main/java/com/all/pdfreader/pro/app/util/AppUtils.kt
index d4f57ef..dd7df96 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/util/AppUtils.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/util/AppUtils.kt
@@ -1,5 +1,6 @@
package com.all.pdfreader.pro.app.util
+import android.content.Context
import android.view.View
object AppUtils {
@@ -36,4 +37,9 @@ object AppUtils {
.start()
}
}
+
+ fun Int.dpToPx(context: Context): Int {
+ return (this * context.resources.displayMetrics.density).toInt()
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt b/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt
index 131ddea..8510eb0 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/util/FileUtils.kt
@@ -3,29 +3,17 @@ package com.all.pdfreader.pro.app.util
import android.annotation.SuppressLint
import android.content.Context
import android.net.Uri
-import android.os.Build
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.util.Log
-import android.webkit.MimeTypeMap
-import androidx.annotation.RequiresApi
import java.io.File
import java.io.InputStream
import java.security.MessageDigest
-import com.all.pdfreader.pro.app.util.StoragePermissionHelper
import java.text.SimpleDateFormat
-import java.time.Instant
-import java.time.ZoneId
-import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.Locale
object FileUtils {
-
- private val PDF_MIME_TYPES = setOf(
- "application/pdf", "application/x-pdf"
- )
-
fun scanPdfFiles(context: Context): List {
val pdfFiles = mutableListOf()
diff --git a/app/src/main/java/com/all/pdfreader/pro/app/util/PdfScanner.kt b/app/src/main/java/com/all/pdfreader/pro/app/util/PdfScanner.kt
index d99a4c4..e27ca57 100644
--- a/app/src/main/java/com/all/pdfreader/pro/app/util/PdfScanner.kt
+++ b/app/src/main/java/com/all/pdfreader/pro/app/util/PdfScanner.kt
@@ -2,6 +2,8 @@ package com.all.pdfreader.pro.app.util
import android.content.Context
import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
import android.graphics.pdf.PdfRenderer
import android.os.ParcelFileDescriptor
import android.util.Log
@@ -13,6 +15,8 @@ import java.io.File
import java.io.FileOutputStream
import java.util.concurrent.TimeUnit
import androidx.core.graphics.createBitmap
+import com.github.barteksc.pdfviewer.PDFView
+import java.util.concurrent.CountDownLatch
class PdfScanner(
private val context: Context,
@@ -32,16 +36,28 @@ class PdfScanner(
// 扫描应用私有目录(无需权限)
val privateFiles = FileUtils.scanPdfFiles(context)
- LogUtil.logDebug("ocean", "PdfScanner: 📁 应用私有目录找到: ${privateFiles.size} 个PDF文件")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 📁 应用私有目录找到: ${privateFiles.size} 个PDF文件"
+ )
privateFiles.forEach { file ->
- LogUtil.logDebug("ocean", "PdfScanner: 📄 ${file.name} (${FileUtils.formatFileSize(file.length())})")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 📄 ${file.name} (${FileUtils.formatFileSize(file.length())})"
+ )
}
// 扫描MediaStore(需要权限)
val mediaStoreFiles = FileUtils.scanPdfFilesFromMediaStore(context)
- LogUtil.logDebug("ocean", "PdfScanner: 📱 MediaStore找到: ${mediaStoreFiles.size} 个PDF文件")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 📱 MediaStore找到: ${mediaStoreFiles.size} 个PDF文件"
+ )
mediaStoreFiles.forEach { file ->
- LogUtil.logDebug("ocean", "PdfScanner: 📱 ${file.name} (${FileUtils.formatFileSize(file.length())})")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 📱 ${file.name} (${FileUtils.formatFileSize(file.length())})"
+ )
}
// 合并并去重
@@ -50,7 +66,10 @@ class PdfScanner(
// 处理每个PDF文件
allFiles.forEachIndexed { index, file ->
- LogUtil.logDebug("ocean", "PdfScanner: 🔄 处理文件 ${index + 1}/${allFiles.size}: ${file.name}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 🔄 处理文件 ${index + 1}/${allFiles.size}: ${file.name}"
+ )
if (FileUtils.isPdfFile(file)) {
val fileHash = FileUtils.calculateFileHash(file.absolutePath)
@@ -60,7 +79,10 @@ class PdfScanner(
val existingDoc = pdfRepository.getDocumentByHash(fileHash)
if (existingDoc == null) {
- LogUtil.logDebug("ocean", "PdfScanner: 🆕 发现新PDF文件: ${file.name}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 🆕 发现新PDF文件: ${file.name}"
+ )
val thumbnailPath = generateThumbnail(context, file)
val metadata =
@@ -81,11 +103,20 @@ class PdfScanner(
metadataModificationDate = metadata?.modificationDate?.time
)
pdfRepository.insertOrUpdateDocument(document)
- LogUtil.logDebug("ocean", "PdfScanner: ✅ 已保存到数据库: ${file.name}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: ✅ 已保存到数据库: ${file.name}"
+ )
} else {
- LogUtil.logDebug("ocean", "PdfScanner: 📋 文件已存在: ${file.name}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 📋 文件已存在: ${file.name}"
+ )
if (existingDoc.filePath != file.absolutePath) {
- LogUtil.logDebug("ocean", "PdfScanner: 🔄 更新文件路径: ${existingDoc.filePath} -> ${file.absolutePath}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: 🔄 更新文件路径: ${existingDoc.filePath} -> ${file.absolutePath}"
+ )
val updatedDoc = existingDoc.copy(
filePath = file.absolutePath,
lastModified = file.lastModified()
@@ -103,14 +134,21 @@ class PdfScanner(
docs.forEach { doc ->
LogUtil.logDebug(
"ocean",
- "PdfScanner: 📖 ${doc.fileName} - ${doc.pageCount}页 - ${FileUtils.formatFileSize(doc.fileSize)} - ${doc.thumbnailPath}"
+ "PdfScanner: 📖 ${doc.fileName} - ${doc.pageCount}页 - ${
+ FileUtils.formatFileSize(
+ doc.fileSize
+ )
+ } - ${doc.thumbnailPath}"
)
}
// 标记扫描完成
ScanManager.markScanComplete(context)
val lastScanTime = ScanManager.getLastScanTime(context)
- LogUtil.logDebug("ocean", "PdfScanner: ✅ 扫描完成,记录时间: ${java.util.Date(lastScanTime)}")
+ LogUtil.logDebug(
+ "ocean",
+ "PdfScanner: ✅ 扫描完成,记录时间: ${java.util.Date(lastScanTime)}"
+ )
callback.invoke(true)
}
@@ -137,12 +175,17 @@ class PdfScanner(
private fun generateThumbnail(context: Context, pdfFile: File): String? {
return try {
- val fileDescriptor = ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)
+ val fileDescriptor =
+ ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)
val pdfRenderer = PdfRenderer(fileDescriptor)
if (pdfRenderer.pageCount > 0) {
val page = pdfRenderer.openPage(0)
+ // 创建 Bitmap
val bitmap = createBitmap(page.width, page.height)
+ val canvas = Canvas(bitmap)
+ canvas.drawColor(Color.WHITE) // 填充白色背景
+
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
page.close()
@@ -169,5 +212,4 @@ class PdfScanner(
null
}
}
-
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/back_black.xml b/app/src/main/res/drawable/back_black.xml
new file mode 100644
index 0000000..c02aa11
--- /dev/null
+++ b/app/src/main/res/drawable/back_black.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/dr_item_img_frame.xml b/app/src/main/res/drawable/dr_item_img_frame.xml
new file mode 100644
index 0000000..cb2fb17
--- /dev/null
+++ b/app/src/main/res/drawable/dr_item_img_frame.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/font/poppins_medium.ttf b/app/src/main/res/font/poppins_medium.ttf
new file mode 100644
index 0000000..e90e87e
Binary files /dev/null and b/app/src/main/res/font/poppins_medium.ttf differ
diff --git a/app/src/main/res/font/poppins_regular.ttf b/app/src/main/res/font/poppins_regular.ttf
new file mode 100644
index 0000000..be06e7f
Binary files /dev/null and b/app/src/main/res/font/poppins_regular.ttf differ
diff --git a/app/src/main/res/font/poppins_semibold.ttf b/app/src/main/res/font/poppins_semibold.ttf
new file mode 100644
index 0000000..dabf7c2
Binary files /dev/null and b/app/src/main/res/font/poppins_semibold.ttf differ
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 673be4a..45522e4 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -90,7 +90,7 @@
+ android:textSize="14sp" />
+ android:textSize="12sp" />
@@ -140,14 +142,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dr_click_btn_bg"
+ android:fontFamily="@font/poppins_semibold"
android:paddingStart="24dp"
android:paddingTop="4dp"
android:paddingEnd="24dp"
android:paddingBottom="4dp"
android:text="@string/go"
android:textColor="@color/white"
- android:textSize="14sp"
- android:textStyle="bold" />
+ android:textSize="14sp" />
@@ -173,6 +175,7 @@
android:id="@+id/home_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/home"
android:textColor="@color/black"
android:textSize="14sp" />
@@ -196,6 +199,7 @@
android:id="@+id/recently_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/recently"
android:textColor="@color/black"
android:textSize="14sp" />
@@ -219,6 +223,7 @@
android:id="@+id/favorite_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/favorite"
android:textColor="@color/black"
android:textSize="14sp" />
@@ -242,6 +247,7 @@
android:id="@+id/tools_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/tools"
android:textColor="@color/black"
android:textSize="14sp" />
diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml
new file mode 100644
index 0000000..a56a0dd
--- /dev/null
+++ b/app/src/main/res/layout/activity_pdf_view.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
index 0d75c20..98431ad 100644
--- a/app/src/main/res/layout/activity_splash.xml
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -2,8 +2,8 @@
@@ -19,10 +19,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
+ android:fontFamily="@font/poppins_semibold"
android:text="@string/app_name"
android:textColor="@color/black"
- android:textSize="28sp"
- android:textStyle="bold" />
+ android:textSize="28sp" />
diff --git a/app/src/main/res/layout/adapter_pdf_item.xml b/app/src/main/res/layout/adapter_pdf_item.xml
index 9d49abd..8ddc86b 100644
--- a/app/src/main/res/layout/adapter_pdf_item.xml
+++ b/app/src/main/res/layout/adapter_pdf_item.xml
@@ -14,11 +14,18 @@
android:gravity="center_vertical"
android:orientation="horizontal">
-
+
+
+
+
+
+ android:fontFamily="@font/poppins_semibold"/>
@@ -60,6 +68,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="8.1MB"
+ android:fontFamily="@font/poppins_medium"
android:textColor="@color/black_60"
android:textSize="14sp" />
diff --git a/app/src/main/res/layout/dialog_permission.xml b/app/src/main/res/layout/dialog_permission.xml
index e01268a..d684bbe 100644
--- a/app/src/main/res/layout/dialog_permission.xml
+++ b/app/src/main/res/layout/dialog_permission.xml
@@ -40,17 +40,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
+ android:fontFamily="@font/poppins_semibold"
android:gravity="center"
android:text="@string/permission_required"
android:textColor="@color/black"
- android:textSize="20sp"
- android:textStyle="bold" />
+ android:textSize="20sp" />
+ android:textSize="16sp" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_sort.xml b/app/src/main/res/layout/dialog_sort.xml
index 93ab105..e483b95 100644
--- a/app/src/main/res/layout/dialog_sort.xml
+++ b/app/src/main/res/layout/dialog_sort.xml
@@ -13,7 +13,7 @@
android:text="@string/sort_by"
android:textColor="@color/black"
android:textSize="18sp"
- android:textStyle="bold" />
+ android:fontFamily="@font/poppins_semibold"/>
@@ -69,6 +70,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
+ android:fontFamily="@font/poppins_regular"
android:layout_weight="1"
android:text="@string/file_name"
android:textColor="@color/black"
@@ -101,6 +103,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/file_size"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -145,6 +148,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
+ android:fontFamily="@font/poppins_regular"
android:text="@string/ascending"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -177,6 +181,7 @@
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="@string/descending"
+ android:fontFamily="@font/poppins_regular"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -211,7 +216,7 @@
android:text="@string/cancel"
android:textColor="@color/black"
android:textSize="16sp"
- android:textStyle="bold" />
+ android:fontFamily="@font/poppins_semibold" />
+ android:fontFamily="@font/poppins_semibold" />
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 2a1214d..9121004 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -18,7 +18,9 @@
+ android:layout_height="match_parent"
+ android:clipToPadding="false"
+ android:paddingBottom="40dp" />
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2fdb298..4b76287 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -21,6 +21,7 @@
File Size
Ascending
Descending
- 权限被拒绝
+ Permission Denied
Unable to access PDF file, please grant storage permission in settings
+ File does not exist
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index af41e68..99078f5 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,6 +1,8 @@
[versions]
+androidpdfviewer = "3.2.8"
appcompat = "1.7.1"
agp = "8.10.1"
+glide = "5.0.4"
kotlin = "2.0.21"
ksp = "2.0.21-1.0.27"
coreKtx = "1.17.0"
@@ -10,6 +12,7 @@ espressoCore = "3.7.0"
lifecycleRuntimeKtx = "2.9.2"
immersionbar = "3.2.2"
immersionbarKtx = "3.2.2"
+pdfboxAndroid = "2.0.27.0"
room_version = "2.7.2"
swiperefreshlayout = "1.1.0"
recyclerview = "1.4.0"
@@ -17,11 +20,13 @@ protoliteWellKnownTypes = "18.0.1"
material = "1.12.0"
[libraries]
+androidpdfviewer = { module = "com.github.marain87:AndroidPdfViewer", version.ref = "androidpdfviewer" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room_version" }
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room_version" }
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room_version" }
+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" }
@@ -30,6 +35,7 @@ immersionbar = { group = "com.geyifeng.immersionbar", name = "immersionbar", ver
immersionbar-ktx = { group = "com.geyifeng.immersionbar", name = "immersionbar-ktx", version.ref = "immersionbarKtx" }
androidx-swiperefreshlayout = { group = "androidx.swiperefreshlayout", name = "swiperefreshlayout", version.ref = "swiperefreshlayout" }
androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
+pdfbox-android = { module = "com.tom-roush:pdfbox-android", version.ref = "pdfboxAndroid" }
protolite-well-known-types = { group = "com.google.firebase", name = "protolite-well-known-types", version.ref = "protoliteWellKnownTypes" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index c012862..aa906bb 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -16,6 +16,7 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
+ maven("https://jitpack.io")
}
}