添加自定义toast

This commit is contained in:
ocean 2025-09-25 10:10:36 +08:00
parent f0fb627774
commit e15837b557
17 changed files with 155 additions and 23 deletions

View File

@ -2,10 +2,11 @@ package com.all.pdfreader.pro.app.model
data class RenameResult( data class RenameResult(
val success: Boolean, val success: Boolean,
val errorMessage: String? = null val errorMessage: String? = null,
val newFilePath: String? = null
) { ) {
companion object { companion object {
fun success() = RenameResult(true) fun success(newFilePath: String) = RenameResult(true, null, newFilePath)
fun failure(message: String) = RenameResult(false, message) fun failure(message: String) = RenameResult(false, message)
} }
} }

View File

@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity
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.StoragePermissionHelper
import com.all.pdfreader.pro.app.util.ToastUtils
import com.tom_roush.pdfbox.contentstream.operator.text.ShowText import com.tom_roush.pdfbox.contentstream.operator.text.ShowText
abstract class BaseActivity : AppCompatActivity() { abstract class BaseActivity : AppCompatActivity() {
@ -63,7 +64,7 @@ abstract class BaseActivity : AppCompatActivity() {
} }
protected fun showToast(message: String) { protected fun showToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show() ToastUtils.show(this, message)
} }
//获取数据库实例 //获取数据库实例

View File

@ -12,10 +12,12 @@ import com.all.pdfreader.pro.app.databinding.ActivityPdfViewBinding
import com.all.pdfreader.pro.app.model.FileActionEvent import com.all.pdfreader.pro.app.model.FileActionEvent
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.ui.dialog.BookmarksDialogFragment import com.all.pdfreader.pro.app.ui.dialog.BookmarksDialogFragment
import com.all.pdfreader.pro.app.ui.dialog.ListMoreDialogFragment
import com.all.pdfreader.pro.app.ui.dialog.PdfPasswordProtectionDialogFragment import com.all.pdfreader.pro.app.ui.dialog.PdfPasswordProtectionDialogFragment
import com.all.pdfreader.pro.app.ui.dialog.ViewModelDialogFragment import com.all.pdfreader.pro.app.ui.dialog.ViewModelDialogFragment
import com.all.pdfreader.pro.app.ui.view.CustomScrollHandle import com.all.pdfreader.pro.app.ui.view.CustomScrollHandle
import com.all.pdfreader.pro.app.util.AppUtils import com.all.pdfreader.pro.app.util.AppUtils
import com.all.pdfreader.pro.app.util.FileUtils
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.github.barteksc.pdfviewer.listener.OnErrorListener import com.github.barteksc.pdfviewer.listener.OnErrorListener
@ -32,6 +34,7 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
override val TAG: String = "PdfViewActivity" override val TAG: String = "PdfViewActivity"
companion object { companion object {
const val FRAG_TAG = "PdfViewActivity"
private const val EXTRA_PDF_HASH = "extra_pdf_hash" private const val EXTRA_PDF_HASH = "extra_pdf_hash"
// 创建启动Intent的便捷方法 // 创建启动Intent的便捷方法
@ -47,6 +50,7 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
private val viewModel by lazy { ViewModelProvider(this)[PdfViewModel::class.java] } private val viewModel by lazy { ViewModelProvider(this)[PdfViewModel::class.java] }
private val repository = getRepository() private val repository = getRepository()
private var isFullScreen = false private var isFullScreen = false
private var lastLoadedFilePath: String? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -61,6 +65,7 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
viewModel.getPDFDocument(filePath) viewModel.getPDFDocument(filePath)
//加载书签数据 //加载书签数据
viewModel.getBookmarks(filePath) viewModel.getBookmarks(filePath)
setupOnClick()
} }
private fun initObserve() { private fun initObserve() {
@ -68,9 +73,13 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
viewModel.pdfDocument.observe(this) { document -> viewModel.pdfDocument.observe(this) { document ->
document?.let { document?.let {
pdfDocument = it pdfDocument = it
// 只有文件路径变化才重新加载 PDF
// if (lastLoadedFilePath != pdfDocument.filePath) {
// lastLoadedFilePath = pdfDocument.filePath
// loadPdf()
// }
loadPdf() loadPdf()
setupOnClick() initView()
toggleEyeCareMode(appStore.isEyeCareMode)
} ?: run { } ?: run {
showToast(getString(R.string.file_not)) showToast(getString(R.string.file_not))
finish() finish()
@ -104,6 +113,37 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
showToast(getString(R.string.bookmark_add_fail)) showToast(getString(R.string.bookmark_add_fail))
} }
} }
// viewModel.fileActionEvent.observeEvent<FileActionEvent.Rename>(this) { event ->
// if (event.renameResult.success) {
// showToast(getString(R.string.rename_successfully))
// event.renameResult.newFilePath?.let {
// //修改名称需要重新load界面因为路径都更改了
// viewModel.getPDFDocument(it)
// }
// } else {
// showToast(event.renameResult.errorMessage.toString())
// }
// }
// viewModel.fileActionEvent.observeEvent<FileActionEvent.Duplicate>(this) { event ->
// if (event.file != null) {
// showToast(getString(R.string.duplicate_created_successfully))
// } else {
// showToast(getString(R.string.duplicate_created_failed))
// }
// }
// viewModel.fileActionEvent.observeEvent<FileActionEvent.Favorite>(this) { event ->
// if (event.isFavorite) {
// showToast(getString(R.string.added_to_favorites))
// } else {
// showToast(getString(R.string.removed_from_favorites))
// }
// }
}
private fun initView() {
binding.title.text = FileUtils.removeFileExtension(pdfDocument.fileName)
toggleEyeCareMode(appStore.isEyeCareMode)
} }
private fun setupOnClick() { private fun setupOnClick() {
@ -128,6 +168,9 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList
binding.shareBtn.setOnClickListener { binding.shareBtn.setOnClickListener {
AppUtils.shareFile(this, File(pdfDocument.filePath)) AppUtils.shareFile(this, File(pdfDocument.filePath))
} }
binding.moreBtn.setOnClickListener {
// ListMoreDialogFragment(pdfDocument.filePath).show(supportFragmentManager, FRAG_TAG)
}
} }
private fun loadPdf() { private fun loadPdf() {

View File

@ -154,6 +154,6 @@ class BookmarksDialogFragment(
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -53,6 +53,6 @@ class FileDetailsDialogFragment() : BottomSheetDialogFragment() {
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -13,6 +13,7 @@ import com.all.pdfreader.pro.app.databinding.DialogListMoreBinding
import com.all.pdfreader.pro.app.model.PrintResult import com.all.pdfreader.pro.app.model.PrintResult
import com.all.pdfreader.pro.app.model.RenameType import com.all.pdfreader.pro.app.model.RenameType
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.ui.act.PdfViewActivity
import com.all.pdfreader.pro.app.ui.act.SplitPdfActivity import com.all.pdfreader.pro.app.ui.act.SplitPdfActivity
import com.all.pdfreader.pro.app.ui.fragment.FavoriteFrag import com.all.pdfreader.pro.app.ui.fragment.FavoriteFrag
import com.all.pdfreader.pro.app.ui.fragment.HomeFrag import com.all.pdfreader.pro.app.ui.fragment.HomeFrag
@ -79,14 +80,30 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment()
when (tag) { when (tag) {
HomeFrag.FRAG_TAG -> { HomeFrag.FRAG_TAG -> {
binding.removeRecentBtn.visibility = View.GONE binding.removeRecentBtn.visibility = View.GONE
binding.setPasswordBtn.visibility = View.VISIBLE
binding.deleteFileBtn.visibility = View.VISIBLE
binding.shareBtn.visibility = View.VISIBLE
} }
RecentlyFrag.FRAG_TAG -> { RecentlyFrag.FRAG_TAG -> {
binding.removeRecentBtn.visibility = View.VISIBLE binding.removeRecentBtn.visibility = View.VISIBLE
binding.setPasswordBtn.visibility = View.VISIBLE
binding.deleteFileBtn.visibility = View.VISIBLE
binding.shareBtn.visibility = View.VISIBLE
} }
FavoriteFrag.FRAG_TAG -> { FavoriteFrag.FRAG_TAG -> {
binding.removeRecentBtn.visibility = View.GONE binding.removeRecentBtn.visibility = View.GONE
binding.setPasswordBtn.visibility = View.VISIBLE
binding.deleteFileBtn.visibility = View.VISIBLE
binding.shareBtn.visibility = View.VISIBLE
}
PdfViewActivity.FRAG_TAG -> {
binding.removeRecentBtn.visibility = View.GONE
binding.setPasswordBtn.visibility = View.GONE
binding.deleteFileBtn.visibility = View.GONE
binding.shareBtn.visibility = View.GONE
} }
} }
binding.tvFileName.text = pdfDocument.fileName binding.tvFileName.text = pdfDocument.fileName
@ -215,6 +232,6 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment()
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -2,26 +2,20 @@ package com.all.pdfreader.pro.app.ui.dialog
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.core.graphics.drawable.toDrawable import androidx.core.graphics.drawable.toDrawable
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.R
import com.all.pdfreader.pro.app.databinding.DialogPdfRemovePasswordBinding import com.all.pdfreader.pro.app.databinding.DialogPdfRemovePasswordBinding
import com.all.pdfreader.pro.app.databinding.DialogPdfSetPasswordBinding
import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity
import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard
import com.all.pdfreader.pro.app.util.FileUtils.isPdfPasswordCorrect import com.all.pdfreader.pro.app.util.FileUtils.isPdfPasswordCorrect
import com.all.pdfreader.pro.app.util.PdfSecurityUtils import com.all.pdfreader.pro.app.util.ToastUtils
import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.all.pdfreader.pro.app.viewmodel.PdfViewModel
import java.io.File import java.io.File
import kotlin.getValue
class PdfRemovePasswordDialog() : DialogFragment( class PdfRemovePasswordDialog() : DialogFragment(
@ -79,6 +73,6 @@ class PdfRemovePasswordDialog() : DialogFragment(
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -129,6 +129,6 @@ class PdfSetPasswordDialog() : DialogFragment(
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -65,6 +65,6 @@ class PromptDialogFragment(
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -203,6 +203,6 @@ class RenameDialogFragment(
} }
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -160,6 +160,6 @@ class ViewModelDialogFragment() : BottomSheetDialogFragment() {
private fun showToast(message: String) { private fun showToast(message: String) {
Toast.makeText(requireActivity(), message, Toast.LENGTH_SHORT).show() ToastUtils.show(requireActivity(), message)
} }
} }

View File

@ -429,7 +429,7 @@ object FileUtils {
return try { return try {
if (file.renameTo(newFile)) { if (file.renameTo(newFile)) {
Log.d("ocean", "✅ File renamed successfully: ${file.name} -> $validatedName") Log.d("ocean", "✅ File renamed successfully: ${file.name} -> $validatedName")
RenameResult.success() RenameResult.success(newName)
} else { } else {
Log.e("ocean", "❌ File rename failed: ${file.path}") Log.e("ocean", "❌ File rename failed: ${file.path}")
RenameResult.failure(PRApp.getStringRes(R.string.error_file_rename_failed)) RenameResult.failure(PRApp.getStringRes(R.string.error_file_rename_failed))

View File

@ -0,0 +1,24 @@
package com.all.pdfreader.pro.app.util
import android.content.Context
import android.view.LayoutInflater
import android.widget.TextView
import android.widget.Toast
import com.all.pdfreader.pro.app.R
object ToastUtils {
private var toast: Toast? = null
fun show(context: Context, message: String) {
val inflater = LayoutInflater.from(context.applicationContext)
val view = inflater.inflate(R.layout.layout_custom_toast, null)
view.findViewById<TextView>(R.id.toastText).text = message
toast?.cancel() // 避免多个 Toast 叠加
toast = Toast(context.applicationContext).apply {
duration = Toast.LENGTH_SHORT
this.view = view
show()
}
}
}

View File

@ -67,9 +67,12 @@ class PdfViewModel : ViewModel() {
val newFilePath = File(parentDir, finalName).absolutePath.toString() val newFilePath = File(parentDir, finalName).absolutePath.toString()
Log.d("ocean", "renamePdf->newFilePath: $newFilePath, finalName=$finalName") Log.d("ocean", "renamePdf->newFilePath: $newFilePath, finalName=$finalName")
pdfRepository.updateFilePathAndFileName(filePath, newFilePath, finalName) pdfRepository.updateFilePathAndFileName(filePath, newFilePath, finalName)
}
_fileActionEvent.postValue(FileActionEvent.Rename(renameResult)) val newResult = renameResult.copy(newFilePath = newFilePath)
_fileActionEvent.postValue(FileActionEvent.Rename(newResult))
} else {
_fileActionEvent.postValue(FileActionEvent.Rename(renameResult))
}
} }
} }

View File

@ -0,0 +1,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#CC333333"/>
<corners android:radius="8dp"/>
</shape>

View File

@ -38,6 +38,34 @@
</LinearLayout> </LinearLayout>
<TextView
android:id="@+id/title"
style="@style/TextViewFont_PopMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="16sp" />
<LinearLayout
android:id="@+id/moreBtn"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/more" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="12dp"
android:background="@drawable/bg_custom_toast"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/toastText"
android:textColor="@android:color/white"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>