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") } }