From bc5453e85d79c7cc2430b66a1523bc838d1f4342 Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Wed, 3 Dec 2025 18:21:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=9Acould=20not=20fin?= =?UTF-8?q?d=20Fragment=20constructor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../pdf/reader/room/entity/BookmarkEntity.kt | 5 +- .../pdf/reader/ui/act/MainActivity.kt | 39 +++++---- .../pdf/reader/ui/act/MergePdfActivity.kt | 45 ++++++----- .../pdf/reader/ui/act/PdfPickerActivity.kt | 58 ++++++++----- .../pdf/reader/ui/act/PdfResultActivity.kt | 12 +-- .../pdf/reader/ui/act/PdfToImageActivity.kt | 10 ++- .../pdf/reader/ui/act/PdfViewActivity.kt | 29 ++++--- .../pdf/reader/ui/act/SearchActivity.kt | 34 ++++---- .../pdf/reader/ui/act/SplitPdfActivity.kt | 47 ++++++----- .../ui/dialog/BookmarksDialogFragment.kt | 81 ++++++++++++++----- .../reader/ui/dialog/ExitDialogFragment.kt | 23 ++++-- .../ui/dialog/GotoPageDialogFragment.kt | 4 +- .../ui/dialog/ListMoreDialogFragment.kt | 64 ++++++++++----- .../PdfPasswordProtectionDialogFragment.kt | 40 +++++++-- .../ui/dialog/PdfRemovePasswordDialog.kt | 51 ++++++++---- .../reader/ui/dialog/PdfSetPasswordDialog.kt | 40 +++++---- .../reader/ui/dialog/PromptDialogFragment.kt | 67 ++++++++++----- .../reader/ui/dialog/RenameDialogFragment.kt | 43 +++++++--- .../reader/ui/dialog/SortDialogFragment.kt | 57 +++++++++---- .../pdf/reader/ui/fragment/FavoriteFrag.kt | 14 ++-- .../pdf/reader/ui/fragment/HomeFrag.kt | 12 +-- .../pdf/reader/ui/fragment/RecentlyFrag.kt | 2 +- 23 files changed, 519 insertions(+), 260 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b32842b..a242a5b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,7 +52,7 @@ android { ) } debug { - isMinifyEnabled = true + isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/room/entity/BookmarkEntity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/room/entity/BookmarkEntity.kt index 7ddeed2..acaad47 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/room/entity/BookmarkEntity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/room/entity/BookmarkEntity.kt @@ -1,10 +1,13 @@ package com.all.pdfreader.pdf.reader.room.entity +import android.os.Parcelable import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.Index import androidx.room.PrimaryKey +import kotlinx.parcelize.Parcelize +@Parcelize @Entity( tableName = "bookmarks", foreignKeys = [ForeignKey( @@ -26,4 +29,4 @@ data class BookmarkEntity( val positionX: Float = 0f, // 页面内X位置 val positionY: Float = 0f, // 页面内Y位置 val createTime: Long = System.currentTimeMillis() -) \ No newline at end of file +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MainActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MainActivity.kt index 0b4f277..03d4688 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MainActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MainActivity.kt @@ -272,12 +272,14 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback title = getString(R.string.delete_all_file_title) desc = getString(R.string.delete_all_file_desc) } - PromptDialogFragment( - title, desc, onOkClick = { - viewModel.deleteFiles(filesToDelete) - exitAllMultiSelect() - }, onCancelClick = { - }).show(supportFragmentManager, "deleteFiles") + val promptDialogFragment = PromptDialogFragment.newInstance( + title = title, desc = desc + ) + promptDialogFragment.onOkClick ={ + viewModel.deleteFiles(filesToDelete) + exitAllMultiSelect() + } + promptDialogFragment.show(supportFragmentManager, "deleteFiles") } } binding.multiSelectMergeBtn.setOnSingleClickListener { @@ -297,14 +299,17 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback val selectedItems = recentlyFragment.adapter.getSelectedItems() if (selectedItems.isNotEmpty()) { val filePaths = selectedItems.map { it.filePath } - PromptDialogFragment( - getString(R.string.remove_dialog_title), - getString(R.string.remove_dialog_desc), - getString(R.string.remove), - onOkClick = { - viewModel.removeRecentAll(filePaths) - exitAllMultiSelect() - }).show(supportFragmentManager, "removeRecent") + + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.remove_dialog_title), + desc = getString(R.string.remove_dialog_desc), + okBtnText = getString(R.string.remove) + ) + promptDialogFragment.onOkClick = { + viewModel.removeRecentAll(filePaths) + exitAllMultiSelect() + } + promptDialogFragment.show(supportFragmentManager, "removeRecent") } } binding.multiSelectUnFavoriteBtn.setOnSingleClickListener { @@ -564,10 +569,12 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback private fun setupDoubleBackExit() { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - ExitDialogFragment(onExitClick = { + val exitDialogFragment = ExitDialogFragment() + exitDialogFragment.onExitClick = { isEnabled = false // 解除拦截 onBackPressedDispatcher.onBackPressed() // 调用系统默认返回逻辑 - }).show(supportFragmentManager, TAG) + } + exitDialogFragment.show(supportFragmentManager, TAG) } }) } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MergePdfActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MergePdfActivity.kt index 8ce34e0..8fa3508 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MergePdfActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/MergePdfActivity.kt @@ -89,17 +89,19 @@ class MergePdfActivity : BaseActivity() { */ private suspend fun showPasswordDialogSuspend(file: File): String? = suspendCancellableCoroutine { cont -> - PdfPasswordProtectionDialogFragment( - file, onOkClick = { password -> - if (cont.isActive) { - cont.resumeWith(Result.success(password)) - } - }, onCancelClick = { - if (cont.isActive) { - cont.resumeWith(Result.success(null)) - } - }, isPrompt = true - ).show(supportFragmentManager, TAG) + val pdfPasswordProtectionDialogFragment = + PdfPasswordProtectionDialogFragment.newInstance(file.absolutePath, true) + pdfPasswordProtectionDialogFragment.onCancelClick = { + if (cont.isActive) { + cont.resumeWith(Result.success(null)) + } + } + pdfPasswordProtectionDialogFragment.onOkClick = { password -> + if (cont.isActive) { + cont.resumeWith(Result.success(password)) + } + } + pdfPasswordProtectionDialogFragment.show(supportFragmentManager, TAG) } private fun initView() { @@ -171,16 +173,17 @@ class MergePdfActivity : BaseActivity() { override fun shouldInterceptBackPress(): Boolean = true override fun onInterceptBackPressed() { - PromptDialogFragment( - getString(R.string.exit_merge), - getString(R.string.confirm_discard_changes), - getString(R.string.discard), - onOkClick = { - backPressedCallback?.isEnabled = false - onBackPressedDispatcher.onBackPressed() - AnalyticsUtils.logEvent(AnalyticsUtils.Event.MERGE_BACK_CONFIRM) - }, onCancelClick = { - }).show(supportFragmentManager, getString(R.string.exit_merge)) + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.exit_merge), + desc = getString(R.string.confirm_discard_changes), + okBtnText = getString(R.string.discard) + ) + promptDialogFragment.onOkClick = { + backPressedCallback?.isEnabled = false + onBackPressedDispatcher.onBackPressed() + AnalyticsUtils.logEvent(AnalyticsUtils.Event.MERGE_BACK_CONFIRM) + } + promptDialogFragment.show(supportFragmentManager, getString(R.string.exit_merge)) } companion object { diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfPickerActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfPickerActivity.kt index bf48f06..c5d91f3 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfPickerActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfPickerActivity.kt @@ -93,59 +93,81 @@ class PdfPickerActivity : BaseActivity() { } PdfPickerSource.LOCK -> { - PdfSetPasswordDialog(onOkClick = { password -> + val pdfSetPasswordDialog = PdfSetPasswordDialog.newInstance() + pdfSetPasswordDialog.onOkClick = { password -> val intent = PdfResultActivity.createIntentLock( this, pdf.filePath, password, PdfPickerSource.LOCK ) startActivity(intent) finish() - }).show(supportFragmentManager, "PdfSetPasswordDialog") + } + pdfSetPasswordDialog.show(supportFragmentManager, "PdfSetPasswordDialog") } PdfPickerSource.UNLOCK -> { - PdfRemovePasswordDialog(pdf.filePath, onOkClick = { password -> + val pdfRemovePasswordDialog = + PdfRemovePasswordDialog.newInstance(pdf.filePath) + pdfRemovePasswordDialog.onOkClick = { password -> val intent = PdfResultActivity.createIntentLock( this, pdf.filePath, password, PdfPickerSource.UNLOCK ) startActivity(intent) finish() - }).show(supportFragmentManager, "PdfRemovePasswordDialog") + } + pdfRemovePasswordDialog.show( + supportFragmentManager, + "PdfRemovePasswordDialog" + ) } PdfPickerSource.IMAGES_TO_PDF -> {} PdfPickerSource.TO_LONG_IMAGE -> { - val intent = PdfToImageActivity.createIntent(this, pdf.filePath, - PdfPickerSource.TO_LONG_IMAGE) - startActivity(intent) - finish() - } - PdfPickerSource.NONE -> {} - PdfPickerSource.PDF_TO_IMAGES -> { - val intent = PdfToImageActivity.createIntent(this, pdf.filePath, - PdfPickerSource.PDF_TO_IMAGES) + val intent = PdfToImageActivity.createIntent( + this, pdf.filePath, + PdfPickerSource.TO_LONG_IMAGE + ) startActivity(intent) finish() } - PdfPickerSource.PRINT ->{ + PdfPickerSource.NONE -> {} + PdfPickerSource.PDF_TO_IMAGES -> { + val intent = PdfToImageActivity.createIntent( + this, pdf.filePath, + PdfPickerSource.PDF_TO_IMAGES + ) + startActivity(intent) + finish() + } + + PdfPickerSource.PRINT -> { val result = printPdfFile(this, Uri.fromFile(File(pdf.filePath))) when (result) { PrintResult.DeviceNotSupported -> { - ToastUtils.show(this,getString(R.string.device_does_not_support_printing)) + ToastUtils.show( + this, + getString(R.string.device_does_not_support_printing) + ) } is PrintResult.Error -> { - ToastUtils.show(this,getString(R.string.pdf_cannot_print_error)) + ToastUtils.show(this, getString(R.string.pdf_cannot_print_error)) } PrintResult.MalformedPdf -> { - ToastUtils.show(this,getString(R.string.cannot_print_malformed_pdf)) + ToastUtils.show( + this, + getString(R.string.cannot_print_malformed_pdf) + ) } PrintResult.PasswordRequired -> { - ToastUtils.show(this,getString(R.string.pdf_cant_print_password_protected)) + ToastUtils.show( + this, + getString(R.string.pdf_cant_print_password_protected) + ) } PrintResult.Success -> { diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfResultActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfResultActivity.kt index a31b679..57629c4 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfResultActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfResultActivity.kt @@ -544,14 +544,14 @@ class PdfResultActivity : BaseActivity() { override fun shouldInterceptBackPress(): Boolean = isProcessing override fun onInterceptBackPressed() { - exitDialog = PromptDialogFragment( + exitDialog = PromptDialogFragment.newInstance( getString(R.string.tip), getString(R.string.confirm_discard_changes), - getString(R.string.discard), - onOkClick = { - backPressedCallback?.isEnabled = false - onBackPressedDispatcher.onBackPressed() - }) + getString(R.string.discard)) + exitDialog?. onOkClick = { + backPressedCallback?.isEnabled = false + onBackPressedDispatcher.onBackPressed() + } exitDialog?.show(supportFragmentManager, getString(R.string.exit_split)) } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfToImageActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfToImageActivity.kt index 028bed6..f36f864 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfToImageActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfToImageActivity.kt @@ -134,11 +134,15 @@ class PdfToImageActivity : BaseActivity() { isPdfEncrypted(file) } if (isEncrypted) { - PdfPasswordProtectionDialogFragment(file, onOkClick = { password -> + val pdfPasswordProtectionDialogFragment = + PdfPasswordProtectionDialogFragment.newInstance(file.absolutePath) + pdfPasswordProtectionDialogFragment.onOkClick = { password -> initSplitDataWithPassword(file, password) - }, onCancelClick = { + } + pdfPasswordProtectionDialogFragment.onCancelClick = { finish() - }).show(supportFragmentManager, TAG) + } + pdfPasswordProtectionDialogFragment.show(supportFragmentManager, TAG) } else { initSplitDataWithPassword(file) } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt index 4c16259..2288075 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/PdfViewActivity.kt @@ -11,18 +11,15 @@ import android.view.inputmethod.EditorInfo import androidx.activity.OnBackPressedCallback import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import com.all.pdfreader.pdf.reader.PRApp import com.all.pdfreader.pdf.reader.R import com.all.pdfreader.pdf.reader.ad.AdsInsUtil import com.all.pdfreader.pdf.reader.ad.BannerManager -import com.all.pdfreader.pdf.reader.ad.ShowListener import com.all.pdfreader.pdf.reader.databinding.ActivityPdfViewBinding import com.all.pdfreader.pdf.reader.model.FileActionEvent import com.all.pdfreader.pdf.reader.room.entity.PdfDocumentEntity import com.all.pdfreader.pdf.reader.ui.dialog.BookmarksDialogFragment import com.all.pdfreader.pdf.reader.ui.dialog.ListMoreDialogFragment import com.all.pdfreader.pdf.reader.ui.dialog.PdfPasswordProtectionDialogFragment -import com.all.pdfreader.pdf.reader.ui.dialog.PermissionDialogFragment import com.all.pdfreader.pdf.reader.ui.dialog.ViewModelDialogFragment import com.all.pdfreader.pdf.reader.ui.view.CustomScrollHandle import com.all.pdfreader.pdf.reader.util.AnalyticsUtils @@ -32,7 +29,6 @@ import com.all.pdfreader.pdf.reader.util.AppUtils.showKeyboard import com.all.pdfreader.pdf.reader.util.FileUtils import com.all.pdfreader.pdf.reader.util.PDFHighlighter import com.all.pdfreader.pdf.reader.util.PDFSearchManager -import com.all.pdfreader.pdf.reader.util.StoragePermissionHelper import com.all.pdfreader.pdf.reader.viewmodel.PdfViewModel import com.all.pdfreader.pdf.reader.viewmodel.observeEvent import com.github.barteksc.pdfviewer.listener.OnErrorListener @@ -223,18 +219,21 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList ViewModelDialogFragment().show(supportFragmentManager, "ViewModelDialogFragment") } binding.bookmarksBtn.setOnClickListener { - BookmarksDialogFragment(pdfDocument, onJumpPage = { + val bookmarksDialogFragment = BookmarksDialogFragment.newInstance(pdfDocument) + bookmarksDialogFragment.onJumpPage = { binding.pdfview.jumpTo(it) binding.pdfview.postDelayed({ binding.pdfview.resetZoomWithAnimation() }, 200) - }).show(supportFragmentManager, "BookmarksDialogFragment") + } + bookmarksDialogFragment.show(supportFragmentManager, "BookmarksDialogFragment") } binding.shareBtn.setOnClickListener { AppUtils.shareFile(this, File(pdfDocument.filePath)) } binding.moreBtn.setOnClickListener { - ListMoreDialogFragment(pdfDocument.filePath).show(supportFragmentManager, FRAG_TAG) + ListMoreDialogFragment.newInstance(pdfDocument.filePath) + .show(supportFragmentManager, FRAG_TAG) } binding.searchTextBtn.setOnClickListener { showSearchTextView = true @@ -366,11 +365,15 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } private fun showPasswordDialog(file: File) { - PdfPasswordProtectionDialogFragment(file, onOkClick = { password -> + val pdfPasswordProtectionDialogFragment = + PdfPasswordProtectionDialogFragment.newInstance(file.absolutePath) + pdfPasswordProtectionDialogFragment.onOkClick = { password -> tryLoadPdfWithPassword(file, password) - }, onCancelClick = { + } + pdfPasswordProtectionDialogFragment.onCancelClick = { finish() - }).show(supportFragmentManager, TAG) + } + pdfPasswordProtectionDialogFragment.show(supportFragmentManager, TAG) } private fun tryLoadPdfWithPassword(file: File, password: String) { @@ -582,7 +585,7 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } override fun onDestroy() { - BannerManager.onDestroy(this,AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) + BannerManager.onDestroy(this, AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) super.onDestroy() if (::searchManager.isInitialized) { searchManager.closeCachedDocument() @@ -591,11 +594,11 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList override fun onResume() { super.onResume() - BannerManager.onResume( this,AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) + BannerManager.onResume(this, AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) } override fun onPause() { - BannerManager.onPause(this,AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) + BannerManager.onPause(this, AdsInsUtil.AdPlacement.BAN_AND_HOMEPAGE) super.onPause() } } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SearchActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SearchActivity.kt index 6fff845..42543e7 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SearchActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SearchActivity.kt @@ -134,15 +134,17 @@ class SearchActivity : BaseActivity() { } binding.clearHistory.setOnClickListener { - PromptDialogFragment( - getString(R.string.tip), - getString(R.string.clear_history_desc), - getString(R.string.clear), - onOkClick = { - searchHistory.clear() - saveHistoryList() // 保存空列表 - showHistory() - }).show(supportFragmentManager, "clearHistory") + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.tip), + desc = getString(R.string.clear_history_desc), + okBtnText = getString(R.string.clear) + ) + promptDialogFragment.onOkClick = { + searchHistory.clear() + saveHistoryList() // 保存空列表 + showHistory() + } + promptDialogFragment.show(supportFragmentManager, "clearHistory") } } @@ -173,25 +175,29 @@ class SearchActivity : BaseActivity() { } PdfPickerSource.LOCK -> { - PdfSetPasswordDialog(onOkClick = { password -> + val pdfSetPasswordDialog = PdfSetPasswordDialog.newInstance() + pdfSetPasswordDialog.onOkClick = { password -> val intent = PdfResultActivity.createIntentLock( this, pdf.filePath, password, PdfPickerSource.LOCK ) startActivity(intent) setResult(RESULT_OK)//通知选择界面关闭 finish() - }).show(supportFragmentManager, "PdfSetPasswordDialog") + } + pdfSetPasswordDialog.show(supportFragmentManager, "PdfSetPasswordDialog") } PdfPickerSource.UNLOCK -> { - PdfRemovePasswordDialog(pdf.filePath, onOkClick = { password -> + val pdfRemovePasswordDialog = PdfRemovePasswordDialog.newInstance(pdf.filePath) + pdfRemovePasswordDialog.onOkClick = { password -> val intent = PdfResultActivity.createIntentLock( this, pdf.filePath, password, PdfPickerSource.UNLOCK ) startActivity(intent) setResult(RESULT_OK) finish() - }).show(supportFragmentManager, "PdfRemovePasswordDialog") + } + pdfRemovePasswordDialog.show(supportFragmentManager, "PdfRemovePasswordDialog") } PdfPickerSource.IMAGES_TO_PDF -> {} @@ -233,7 +239,7 @@ class SearchActivity : BaseActivity() { } } }, onMoreClick = { pdf -> - ListMoreDialogFragment(pdf.filePath).show(supportFragmentManager, FRAG_TAG) + ListMoreDialogFragment.newInstance(pdf.filePath).show(supportFragmentManager, FRAG_TAG) }) binding.recyclerView.layoutManager = LinearLayoutManager(this) diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SplitPdfActivity.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SplitPdfActivity.kt index 9da594e..518a523 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SplitPdfActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/act/SplitPdfActivity.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View -import androidx.activity.OnBackPressedCallback import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager @@ -26,7 +25,6 @@ import com.all.pdfreader.pdf.reader.util.FileUtils.isPdfEncrypted import com.all.pdfreader.pdf.reader.util.FileUtils.toUnderscoreDateTime import com.all.pdfreader.pdf.reader.util.PdfUtils import com.all.pdfreader.pdf.reader.util.ToastUtils -import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -104,11 +102,16 @@ class SplitPdfActivity : BaseActivity() { binding.splitRv.adapter = adapter selectedPdfAdapter = SplitSelectedPdfAdapter(selectedList, onEditClick = { item, pos -> - RenameDialogFragment( - RenameType.NAME, null, item.fileName, onOkClickString = { string -> - selectedList[pos].fileName = string - selectedPdfAdapter.updateItem(pos) - }).show(supportFragmentManager, "SplitPdfActivity") + val renameDialogFragment = RenameDialogFragment.newInstance( + type = RenameType.NAME, + bookmark = null, + name = item.fileName + ) + renameDialogFragment.onOkClickString = { string -> + selectedList[pos].fileName = string + selectedPdfAdapter.updateItem(pos) + } + renameDialogFragment.show(supportFragmentManager, "SplitPdfActivity") }, onDeleteClick = { item, pos -> selectedList.remove(item) selectedPdfAdapter.removeItem(pos) @@ -166,11 +169,15 @@ class SplitPdfActivity : BaseActivity() { isPdfEncrypted(file) } if (isEncrypted) { - PdfPasswordProtectionDialogFragment(file, onOkClick = { password -> + val pdfPasswordProtectionDialogFragment = + PdfPasswordProtectionDialogFragment.newInstance(file.absolutePath) + pdfPasswordProtectionDialogFragment.onOkClick = { password -> initSplitDataWithPassword(file, password) - }, onCancelClick = { + } + pdfPasswordProtectionDialogFragment.onCancelClick = { finish() - }).show(supportFragmentManager, TAG) + } + pdfPasswordProtectionDialogFragment.show(supportFragmentManager, TAG) } else { initSplitDataWithPassword(file) } @@ -299,16 +306,18 @@ class SplitPdfActivity : BaseActivity() { when (currentViewState) { ViewState.SPLIT_SELECTED -> { // 已选页面列表,提示是否退出 - PromptDialogFragment( - getString(R.string.exit_split), - getString(R.string.confirm_discard_changes), - getString(R.string.discard), - onOkClick = { - backPressedCallback?.isEnabled = false - onBackPressedDispatcher.onBackPressed() + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.exit_split), + desc = getString(R.string.confirm_discard_changes), + okBtnText = getString(R.string.discard) + ) + promptDialogFragment.onOkClick = { + backPressedCallback?.isEnabled = false + onBackPressedDispatcher.onBackPressed() - AnalyticsUtils.logEvent(AnalyticsUtils.Event.SPLIT_LEAVE_CONFIRM) - }).show(supportFragmentManager, getString(R.string.exit_split)) + AnalyticsUtils.logEvent(AnalyticsUtils.Event.SPLIT_LEAVE_CONFIRM) + } + promptDialogFragment.show(supportFragmentManager, getString(R.string.exit_split)) } ViewState.SPLIT_LIST -> { diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/BookmarksDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/BookmarksDialogFragment.kt index f696273..de4bf33 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/BookmarksDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/BookmarksDialogFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.FragmentManager import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import com.all.pdfreader.pdf.reader.R @@ -17,9 +18,29 @@ import com.all.pdfreader.pdf.reader.util.ToastUtils import com.all.pdfreader.pdf.reader.viewmodel.PdfViewModel import com.google.android.material.bottomsheet.BottomSheetDialogFragment -class BookmarksDialogFragment( - private val pdfDocument: PdfDocumentEntity, private val onJumpPage: (Int) -> Unit -) : BottomSheetDialogFragment() { +class BookmarksDialogFragment() : BottomSheetDialogFragment() { + + companion object { + private const val ARG_FILE_PATH = "arg_file_path" + private const val ARG_LAST_READ_PAGE = "arg_last_read_page" + fun newInstance(pdfDocument: PdfDocumentEntity): BookmarksDialogFragment { + val fragment = BookmarksDialogFragment() + val args = Bundle() + args.putString(ARG_FILE_PATH, pdfDocument.filePath) + args.putInt(ARG_LAST_READ_PAGE, pdfDocument.lastReadPage) + fragment.arguments = args + return fragment + } + } + + private val filePath: String + get() = arguments?.getString(ARG_FILE_PATH) ?: "" + + private val lastReadPage: Int + get() = arguments?.getInt(ARG_LAST_READ_PAGE) ?: 0 + + + var onJumpPage: ((Int) -> Unit)? = null private lateinit var binding: DialogBookmarksBinding private val viewModel: PdfViewModel by activityViewModels()//为PdfViewActivity的PdfViewModel @@ -28,7 +49,10 @@ class BookmarksDialogFragment( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } /** * 让 BottomSheetDialogFragment 覆盖底部导航栏 * 原理: @@ -41,10 +65,17 @@ class BookmarksDialogFragment( override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { + if (savedInstanceState != null) return null binding = DialogBookmarksBinding.inflate(layoutInflater) return binding.root } + override fun show(manager: FragmentManager, tag: String?) { + if (!manager.isStateSaved) { + super.show(manager, tag) + } + } + override fun onStart() { super.onStart() dialog?.window?.findViewById(com.google.android.material.R.id.design_bottom_sheet) @@ -54,7 +85,7 @@ class BookmarksDialogFragment( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) AnalyticsUtils.logEvent(AnalyticsUtils.Event.BOOKMARK_TK_SHOW) - if (pdfDocument.filePath.isEmpty()) { + if (filePath.isEmpty()) { showToast(getString(R.string.file_not)) dismiss() } @@ -70,15 +101,19 @@ class BookmarksDialogFragment( private fun initView() { adapter = BookmarkAdapter(list = mutableListOf(), onItemClick = { bookmark -> - onJumpPage(bookmark.pageNumber) + onJumpPage?.invoke(bookmark.pageNumber) dismiss() }, onEditClick = { bookmark, position -> - RenameDialogFragment(RenameType.BOOKMARK, bookmark, onOkClick = { updatedBookmark -> + val renameDialogFragment = RenameDialogFragment.newInstance( + RenameType.BOOKMARK, bookmark + ) + renameDialogFragment.onOkClick = { updatedBookmark -> bookmarks = bookmarks.map {//更新外部数据 if (it.id == updatedBookmark.id) updatedBookmark else it } adapter.updateItemChanged(updatedBookmark)//更新adapter数据 - }).show( + } + renameDialogFragment.show( parentFragmentManager, "BookmarksDialogFragment" ) }, onDeleteClick = { bookmark, position -> @@ -92,7 +127,7 @@ class BookmarksDialogFragment( updateAdapter() } - private fun updateUi(){ + private fun updateUi() { if (bookmarks.isEmpty()) { binding.noBookmarksPageLayout.visibility = View.VISIBLE//显示没有书签的提示布局 binding.bookmarksDisplayLayout.visibility = View.GONE//隐藏显示内容的布局 @@ -102,7 +137,7 @@ class BookmarksDialogFragment( binding.bookmarksDisplayLayout.visibility = View.VISIBLE binding.addBtn.visibility = View.VISIBLE // 检查当前页是否已存在书签 - val alreadyBookmarked = bookmarks.any { it.pageNumber == pdfDocument.lastReadPage } + val alreadyBookmarked = bookmarks.any { it.pageNumber == lastReadPage } binding.addBtn.isEnabled = !alreadyBookmarked if (alreadyBookmarked) { binding.addTv.text = getString(R.string.added) @@ -126,23 +161,25 @@ class BookmarksDialogFragment( dialogAddBookMarks() } binding.deleteALLPageBtn.setOnClickListener { - PromptDialogFragment( - getString(R.string.delete_bookmarks_title), - getString(R.string.delete_bookmarks_desc), - onOkClick = { - viewModel.deleteAllBookmark(pdfDocument.filePath) - adapter.removeAllItems() - bookmarks = emptyList() - updateUi() - }).show(parentFragmentManager, "deleteAllBookmark") + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.delete_bookmarks_title), + desc = getString(R.string.delete_bookmarks_desc) + ) + promptDialogFragment.onOkClick = { + viewModel.deleteAllBookmark(filePath) + adapter.removeAllItems() + bookmarks = emptyList() + updateUi() + } + promptDialogFragment.show(parentFragmentManager, "deleteAllBookmark") } } private fun dialogAddBookMarks() { val bookmark = BookmarkEntity( - filePath = pdfDocument.filePath, - pageNumber = pdfDocument.lastReadPage, - label = getString(R.string.page) + " ${pdfDocument.lastReadPage + 1}" + filePath = filePath, + pageNumber = lastReadPage, + label = getString(R.string.page) + " ${lastReadPage + 1}" ) viewModel.addBookMark(bookmark) dismiss() diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ExitDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ExitDialogFragment.kt index 08d05a7..0ce335e 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ExitDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ExitDialogFragment.kt @@ -5,6 +5,7 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.FragmentManager import com.all.pdfreader.pdf.reader.R import com.all.pdfreader.pdf.reader.ad.AdsInsUtil import com.all.pdfreader.pdf.reader.ad.NativeAdCache @@ -13,23 +14,33 @@ import com.all.pdfreader.pdf.reader.databinding.DialogExitBinding import com.google.android.gms.ads.nativead.NativeAd import com.google.android.material.bottomsheet.BottomSheetDialogFragment -class ExitDialogFragment( - private val onExitClick: () -> Unit, -) : BottomSheetDialogFragment() { - +class ExitDialogFragment() : BottomSheetDialogFragment() { + var onExitClick: (() -> Unit)? = null private lateinit var binding: DialogExitBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } setStyle(STYLE_NORMAL, R.style.CustomBottomSheetDialogTheme) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { + ): View? { + if (savedInstanceState != null) return null + binding = DialogExitBinding.inflate(layoutInflater) return binding.root } + override fun show(manager: FragmentManager, tag: String?) { + if (!manager.isStateSaved) { + super.show(manager, tag) + } + } + override fun onStart() { super.onStart() dialog?.window?.findViewById(com.google.android.material.R.id.design_bottom_sheet) @@ -51,7 +62,7 @@ class ExitDialogFragment( private fun setupOnClick() { binding.exitBtn.setOnClickListener { - onExitClick() + onExitClick?.invoke() dismiss() } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/GotoPageDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/GotoPageDialogFragment.kt index d7d7cf0..67532e5 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/GotoPageDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/GotoPageDialogFragment.kt @@ -23,9 +23,7 @@ import com.all.pdfreader.pdf.reader.util.ToastUtils import com.all.pdfreader.pdf.reader.viewmodel.PdfViewModel import java.io.File -class GotoPageDialogFragment( - private val onOkClick: () -> Unit = {}, -) : DialogFragment() { +class GotoPageDialogFragment() : DialogFragment() { private lateinit var binding: DialogGotoPageBinding private val viewModel: PdfViewModel by activityViewModels() diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ListMoreDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ListMoreDialogFragment.kt index 392aa34..a38e49a 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ListMoreDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/ListMoreDialogFragment.kt @@ -5,7 +5,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.fragment.app.activityViewModels import com.all.pdfreader.pdf.reader.R import com.all.pdfreader.pdf.reader.databinding.DialogListMoreBinding @@ -36,7 +35,20 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.google.android.material.bottomsheet.BottomSheetDialogFragment import java.io.File -class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() { +class ListMoreDialogFragment() : BottomSheetDialogFragment() { + companion object { + private const val ARG_FILE_PATH = "arg_file_path" + fun newInstance(filePath: String): ListMoreDialogFragment { + val fragment = ListMoreDialogFragment() + val args = Bundle() + args.putString(ARG_FILE_PATH, filePath) + fragment.arguments = args + return fragment + } + } + + private val filePath: String + get() = arguments?.getString(ARG_FILE_PATH) ?: "" private lateinit var binding: DialogListMoreBinding private val viewModel: PdfViewModel by activityViewModels() @@ -140,18 +152,21 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() dismiss() } binding.renameFileBtn.setOnClickListener { - RenameDialogFragment(RenameType.FILE).show( + val renameDialogFragment = RenameDialogFragment.newInstance(RenameType.FILE) + renameDialogFragment.show( parentFragmentManager, "ListMoreDialogFragment" ) dismiss() } binding.deleteFileBtn.setOnClickListener { - PromptDialogFragment( - getString(R.string.delete_file_title), - getString(R.string.delete_file_desc), - onOkClick = { - viewModel.deleteFile(pdfDocument.filePath) - }).show(parentFragmentManager, "deleteFile") + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.delete_file_title), + desc = getString(R.string.delete_file_desc) + ) + promptDialogFragment.onOkClick = { + viewModel.deleteFile(pdfDocument.filePath) + } + promptDialogFragment.show(parentFragmentManager, "deleteFile") dismiss() } binding.detailsBtn.setOnClickListener { @@ -194,26 +209,33 @@ class ListMoreDialogFragment(val filePath: String) : BottomSheetDialogFragment() } binding.setPasswordBtn.setOnClickListener { if (pdfDocument.isPassword) { - PdfRemovePasswordDialog(pdfDocument.filePath, onOkClick = { password -> + val pdfRemovePasswordDialog = PdfRemovePasswordDialog.newInstance(pdfDocument.filePath) + pdfRemovePasswordDialog.onOkClick = { password -> viewModel.removePassword(pdfDocument.filePath, password) - }).show(parentFragmentManager, "PdfRemovePasswordDialog") + } + pdfRemovePasswordDialog.show(parentFragmentManager, "PdfRemovePasswordDialog") } else { - PdfSetPasswordDialog(onOkClick = { password -> + val pdfSetPasswordDialog = PdfSetPasswordDialog.newInstance() + pdfSetPasswordDialog.onOkClick = { password -> viewModel.setPassword(pdfDocument.filePath, password) - }).show(parentFragmentManager, "PdfSetPasswordDialog") + } + pdfSetPasswordDialog.show(parentFragmentManager, "PdfSetPasswordDialog") } dismiss() } binding.removeRecentBtn.setOnClickListener { AnalyticsUtils.logEvent(AnalyticsUtils.Event.REMOVE_CK) - PromptDialogFragment( - getString(R.string.remove_dialog_title), - getString(R.string.remove_dialog_desc), - getString(R.string.remove), - onOkClick = { - viewModel.removeRecent(pdfDocument.filePath) - AnalyticsUtils.logEvent(AnalyticsUtils.Event.REMOVE_SUCCESS) - }).show(parentFragmentManager, "removeRecent") + + val promptDialogFragment = PromptDialogFragment.newInstance( + title = getString(R.string.remove_dialog_title), + desc = getString(R.string.remove_dialog_desc), + okBtnText = getString(R.string.remove) + ) + promptDialogFragment.onOkClick = { + viewModel.removeRecent(pdfDocument.filePath) + AnalyticsUtils.logEvent(AnalyticsUtils.Event.REMOVE_SUCCESS) + } + promptDialogFragment.show(parentFragmentManager, "removeRecent") dismiss() } binding.splitBtn.setOnClickListener { diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfPasswordProtectionDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfPasswordProtectionDialogFragment.kt index e26228f..6987343 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfPasswordProtectionDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfPasswordProtectionDialogFragment.kt @@ -21,15 +21,39 @@ import com.all.pdfreader.pdf.reader.util.AppUtils.showKeyboard import com.all.pdfreader.pdf.reader.util.FileUtils.isPdfPasswordCorrect import java.io.File -class PdfPasswordProtectionDialogFragment( - private val file: File, - private val onOkClick: (String) -> Unit, - private val onCancelClick: () -> Unit, - private val isPrompt: Boolean = false -) : DialogFragment() { +class PdfPasswordProtectionDialogFragment() : DialogFragment() { + + companion object { + private const val ARG_FILE_PATH = "arg_file_path" + private const val ARG_IS_PROMPT = "arg_is_prompt" + + fun newInstance(filePath: String, isPrompt: Boolean = false): PdfPasswordProtectionDialogFragment { + val fragment = PdfPasswordProtectionDialogFragment() + val args = Bundle() + args.putString(ARG_FILE_PATH, filePath) + args.putBoolean(ARG_IS_PROMPT, isPrompt) + fragment.arguments = args + return fragment + } + } + + // 外部设置回调 + var onOkClick: ((String) -> Unit)? = null + var onCancelClick: (() -> Unit)? = null + + private val file: File + get() = File(arguments?.getString(ARG_FILE_PATH) ?: "") + + private val isPrompt: Boolean + get() = arguments?.getBoolean(ARG_IS_PROMPT) ?: false + private lateinit var binding: DialogPdfPasswordProtectionBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { @@ -69,7 +93,7 @@ class PdfPasswordProtectionDialogFragment( } binding.cancelBtn.setOnClickListener { - onCancelClick() + onCancelClick?.invoke() dismiss() } binding.okBtn.setOnClickListener { @@ -79,7 +103,7 @@ class PdfPasswordProtectionDialogFragment( return@setOnClickListener } if (isPdfPasswordCorrect(requireActivity(), file, password)) { - onOkClick(password) + onOkClick?.invoke(password) dismiss() } else { binding.tilPassword.error = getString(R.string.incorrect_password) diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfRemovePasswordDialog.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfRemovePasswordDialog.kt index 215f974..4464a02 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfRemovePasswordDialog.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfRemovePasswordDialog.kt @@ -15,17 +15,41 @@ import com.all.pdfreader.pdf.reader.util.FileUtils.isPdfPasswordCorrect import com.all.pdfreader.pdf.reader.util.ToastUtils import java.io.File -class PdfRemovePasswordDialog( - val filePath: String, - val onOkClick: (password: String) -> Unit = {} -) : - DialogFragment() { +class PdfRemovePasswordDialog() : DialogFragment() { + + companion object { + private const val ARG_FILE_PATH = "arg_file_path" + + fun newInstance(filePath: String): PdfRemovePasswordDialog { + val fragment = PdfRemovePasswordDialog() + val args = Bundle() + args.putString(ARG_FILE_PATH, filePath) + fragment.arguments = args + return fragment + } + } + + var onOkClick: ((password: String) -> Unit)? = null + private lateinit var binding: DialogPdfRemovePasswordBinding + private val filePath: String + get() = arguments?.getString(ARG_FILE_PATH) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // 系统恢复时直接关闭,防止 crash + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding = DialogPdfRemovePasswordBinding.inflate(layoutInflater) + if (savedInstanceState != null) return null + binding = DialogPdfRemovePasswordBinding.inflate(inflater, container, false) return binding.root } @@ -33,10 +57,8 @@ class PdfRemovePasswordDialog( super.onStart() isCancelable = false dialog?.window?.apply { - // 去掉系统默认的背景 padding setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) - // 设置宽度为全屏减去 16dp - val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) // 16dp + val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) val width = resources.displayMetrics.widthPixels - margin * 2 setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) } @@ -56,16 +78,13 @@ class PdfRemovePasswordDialog( binding.okBtn.setOnClickListener { val password = binding.etPassword.text.toString() - if (isPdfPasswordCorrect(requireActivity(), File(filePath), password)) { - onOkClick(password) + val file = File(filePath) + if (isPdfPasswordCorrect(requireActivity(), file, password)) { + onOkClick?.invoke(password) dismiss() } else { binding.tilPassword.error = getString(R.string.incorrect_password) } } } - - private fun showToast(message: String) { - ToastUtils.show(requireActivity(), message) - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfSetPasswordDialog.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfSetPasswordDialog.kt index 8334ca4..02e9ca7 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfSetPasswordDialog.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PdfSetPasswordDialog.kt @@ -15,15 +15,32 @@ import com.all.pdfreader.pdf.reader.util.AnalyticsUtils import com.all.pdfreader.pdf.reader.util.AppUtils.showKeyboard import com.all.pdfreader.pdf.reader.util.ToastUtils -class PdfSetPasswordDialog( - private val onOkClick: (password: String) -> Unit = {} -) : DialogFragment() { +class PdfSetPasswordDialog() : DialogFragment() { + + companion object { + fun newInstance(): PdfSetPasswordDialog { + return PdfSetPasswordDialog() + } + } + + var onOkClick: ((password: String) -> Unit)? = null + private lateinit var binding: DialogPdfSetPasswordBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // 系统恢复时直接 dismiss 避免 crash + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding = DialogPdfSetPasswordBinding.inflate(layoutInflater) + if (savedInstanceState != null) return null + binding = DialogPdfSetPasswordBinding.inflate(inflater, container, false) return binding.root } @@ -31,10 +48,8 @@ class PdfSetPasswordDialog( super.onStart() isCancelable = false dialog?.window?.apply { - // 去掉系统默认的背景 padding setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) - // 设置宽度为全屏减去 16dp - val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) // 16dp + val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) val width = resources.displayMetrics.widthPixels - margin * 2 setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) } @@ -57,7 +72,7 @@ class PdfSetPasswordDialog( val password = binding.etPassword.text.toString() val confirmPassword = binding.etConfirmPassword.text.toString() if (validatePassword(password, confirmPassword)) { - onOkClick(password) + onOkClick?.invoke(password) dismiss() } } @@ -97,19 +112,16 @@ class PdfSetPasswordDialog( binding.tilPassword.error = null binding.tilConfirmPassword.error = null - // 不允许空密码 if (password.isEmpty()) { binding.tilPassword.error = getString(R.string.password_not_empty) return false } - // 密码长度验证 if (password.length < 4) { binding.tilPassword.error = getString(R.string.password_too_short) return false } - // 密码匹配验证 if (password != confirmPassword) { binding.tilConfirmPassword.error = getString(R.string.password_not_match) return false @@ -117,8 +129,4 @@ class PdfSetPasswordDialog( return true } - - private fun showToast(message: String) { - ToastUtils.show(requireActivity(), message) - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PromptDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PromptDialogFragment.kt index ad37f43..a447ac1 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PromptDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/PromptDialogFragment.kt @@ -12,55 +12,82 @@ import com.all.pdfreader.pdf.reader.R import com.all.pdfreader.pdf.reader.databinding.DialogDeleteBinding import com.all.pdfreader.pdf.reader.util.ToastUtils -class PromptDialogFragment( - private val title: String, - private val desc: String, - private val okBtnText: String? = null, - private val onOkClick: () -> Unit, - private val onCancelClick: () -> Unit = {} -) : DialogFragment() { +class PromptDialogFragment() : DialogFragment() { + + companion object { + private const val ARG_TITLE = "arg_title" + private const val ARG_DESC = "arg_desc" + private const val ARG_OK_TEXT = "arg_ok_text" + + fun newInstance( + title: String, + desc: String, + okBtnText: String? = null + ): PromptDialogFragment { + val fragment = PromptDialogFragment() + val args = Bundle() + args.putString(ARG_TITLE, title) + args.putString(ARG_DESC, desc) + args.putString(ARG_OK_TEXT, okBtnText) + fragment.arguments = args + return fragment + } + } + + var onOkClick: (() -> Unit)? = null + var onCancelClick: (() -> Unit)? = null + + private val title: String + get() = arguments?.getString(ARG_TITLE) ?: "" + private val desc: String + get() = arguments?.getString(ARG_DESC) ?: "" + private val okBtnText: String? + get() = arguments?.getString(ARG_OK_TEXT) private lateinit var binding: DialogDeleteBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // 系统恢复时直接 dismiss 避免 crash + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - binding = DialogDeleteBinding.inflate(layoutInflater) + if (savedInstanceState != null) return null + binding = DialogDeleteBinding.inflate(inflater, container, false) return binding.root } override fun onStart() { super.onStart() dialog?.window?.apply { - // 去掉系统默认的背景 padding setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) - // 设置宽度为全屏减去 16dp - val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) // 16dp + val margin = resources.getDimensionPixelSize(R.dimen.dialog_margin) val width = resources.displayMetrics.widthPixels - margin * 2 setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT) } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (okBtnText.isNullOrEmpty()) { - binding.okBtnTv.text = getString(R.string.delete) - } else { - binding.okBtnTv.text = okBtnText - } binding.deleteTitleTv.text = title binding.deleteDescTv.text = desc + binding.okBtnTv.text = okBtnText ?: getString(R.string.delete) setupOnClick() } private fun setupOnClick() { binding.okBtn.setOnClickListener { - onOkClick() + onOkClick?.invoke() dismiss() } binding.cancelBtn.setOnClickListener { - onCancelClick() + onCancelClick?.invoke() dismiss() } } @@ -68,4 +95,4 @@ class PromptDialogFragment( private fun showToast(message: String) { ToastUtils.show(requireActivity(), message) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/RenameDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/RenameDialogFragment.kt index b86ff81..ec27795 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/RenameDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/RenameDialogFragment.kt @@ -22,17 +22,42 @@ import com.all.pdfreader.pdf.reader.util.ToastUtils import com.all.pdfreader.pdf.reader.viewmodel.PdfViewModel import java.io.File -class RenameDialogFragment( - private val type: RenameType, - private val bookmark: BookmarkEntity? = null, - private val name: String? = null, - private val onOkClick: (BookmarkEntity) -> Unit = {}, - private val onOkClickString: (String) -> Unit = {} -) : DialogFragment() { +class RenameDialogFragment() : DialogFragment() { + companion object { + private const val ARG_TYPE = "arg_type" + private const val ARG_BOOKMARK = "arg_bookmark" + private const val ARG_NAME = "arg_name" + + fun newInstance( + type: RenameType, + bookmark: BookmarkEntity? = null, + name: String? = null + ): RenameDialogFragment { + val fragment = RenameDialogFragment() + val args = Bundle() + args.putString(ARG_TYPE, type.name) + if (bookmark != null) args.putParcelable(ARG_BOOKMARK, bookmark) + if (name != null) args.putString(ARG_NAME, name) + fragment.arguments = args + return fragment + } + } private lateinit var binding: DialogRenameFileBinding private val viewModel: PdfViewModel by activityViewModels() + private val type: RenameType + get() = RenameType.valueOf(arguments?.getString(ARG_TYPE) ?: RenameType.FILE.name) + + private val bookmark: BookmarkEntity? + get() = arguments?.getParcelable(ARG_BOOKMARK) + + private val name: String? + get() = arguments?.getString(ARG_NAME) + + var onOkClick: ((BookmarkEntity) -> Unit)? = null + var onOkClickString: ((String) -> Unit)? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { @@ -114,7 +139,7 @@ class RenameDialogFragment( if (validateEnter(text, oldName, filePath)) { val new = bookmark?.copy(label = text)!! viewModel.updateBookmark(new) - onOkClick(new) + onOkClick?.invoke(new) dismiss() } } @@ -122,7 +147,7 @@ class RenameDialogFragment( RenameType.NAME -> { val text = binding.etName.text.toString() if (validateEnter(text, oldName, filePath)) { - onOkClickString(text) + onOkClickString?.invoke(text) dismiss() } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/SortDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/SortDialogFragment.kt index 892a745..2025243 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/SortDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/dialog/SortDialogFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager import com.all.pdfreader.pdf.reader.R import com.all.pdfreader.pdf.reader.databinding.DialogSortBinding import com.all.pdfreader.pdf.reader.model.SortConfig @@ -16,10 +17,26 @@ import com.all.pdfreader.pdf.reader.ui.fragment.HomeFrag import com.all.pdfreader.pdf.reader.util.AnalyticsUtils import com.google.android.material.bottomsheet.BottomSheetDialogFragment -class SortDialogFragment( - private val fragment: Fragment, - private val onOkClick: (String) -> Unit -) : BottomSheetDialogFragment() { +class SortDialogFragment() : BottomSheetDialogFragment() { + + + companion object { + private const val ARG_FRAGMENT_TAG = "arg_fragment_tag" + + fun newInstance(fragmentTag: String): SortDialogFragment { + val frag = SortDialogFragment() + val args = Bundle() + args.putString(ARG_FRAGMENT_TAG, fragmentTag) + frag.arguments = args + return frag + } + } + + private val fragmentTag: String + get() = arguments?.getString(ARG_FRAGMENT_TAG) ?: "" + + var onOkClick: ((String) -> Unit)? = null // 可选回调,正常显示时使用 + private lateinit var binding: DialogSortBinding private lateinit var sortConfig: SortConfig @@ -28,16 +45,31 @@ class SortDialogFragment( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // 极端情况下,这种类型的dialogFragment在恢复的时候会报错,临时的dialog就不进行恢复处理,防止崩溃 + // 如果系统正在恢复这个 DialogFragment 直接 dismiss 避免 crash + if (savedInstanceState != null) { + dismissAllowingStateLoss() + return + } + setStyle(STYLE_NORMAL, R.style.CustomBottomSheetDialogTheme) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { + // 如果是恢复状态,不创建 view + if (savedInstanceState != null) return null binding = DialogSortBinding.inflate(layoutInflater) return binding.root } + override fun show(manager: FragmentManager, tag: String?) { + if (!manager.isStateSaved) { + super.show(manager, tag) + } + } + override fun onStart() { super.onStart() dialog?.window?.findViewById(com.google.android.material.R.id.design_bottom_sheet) @@ -49,13 +81,10 @@ class SortDialogFragment( AnalyticsUtils.logEvent(AnalyticsUtils.Event.SORT_SHOW) val appStore = AppStore(requireActivity()) isCancelable = false - when(fragment){ - is HomeFrag->{ - sortConfig = SortConfig.fromPreferenceString(appStore.documentSortType) - } - is FavoriteFrag->{ - sortConfig = SortConfig.fromPreferenceString(appStore.favoriteSortType) - } + sortConfig = when(fragmentTag) { + HomeFrag::class.java.simpleName -> SortConfig.fromPreferenceString(appStore.documentSortType) + FavoriteFrag::class.java.simpleName -> SortConfig.fromPreferenceString(appStore.favoriteSortType) + else -> SortConfig.fromPreferenceString(appStore.documentSortType) } updateUi(sortConfig) selectedField = sortConfig.field @@ -90,10 +119,8 @@ class SortDialogFragment( dismiss() } binding.okBtn.setOnClickListener { - val newConfig = SortConfig( - field = selectedField, direction = selectedDirection - ) - onOkClick(newConfig.toPreferenceString()) + val newConfig = SortConfig(field = selectedField, direction = selectedDirection) + onOkClick?.invoke(newConfig.toPreferenceString()) dismiss() } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/FavoriteFrag.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/FavoriteFrag.kt index 1d571f4..3f03256 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/FavoriteFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/FavoriteFrag.kt @@ -24,7 +24,7 @@ import com.all.pdfreader.pdf.reader.ui.dialog.SortDialogFragment import com.all.pdfreader.pdf.reader.util.AppUtils.setOnSingleClickListener import kotlinx.coroutines.launch -class FavoriteFrag : BaseFrag(){ +class FavoriteFrag : BaseFrag() { override val TAG: String = "FavoriteFrag" companion object { @@ -66,7 +66,7 @@ class FavoriteFrag : BaseFrag(){ val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> - ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + ListMoreDialogFragment.newInstance(pdf.filePath).show(parentFragmentManager, FRAG_TAG) }, onLongClick = { pdf -> setupMultiSelect() }, onSelectModelItemClick = { number -> @@ -84,10 +84,12 @@ class FavoriteFrag : BaseFrag(){ } binding.sortingBtn.setOnSingleClickListener { - SortDialogFragment(FavoriteFrag(), onOkClick = { it -> - updateSortUi(it) - onSortFavoriteTypeChanged(it) - }).show(parentFragmentManager, TAG) + val dialog = SortDialogFragment.newInstance(FavoriteFrag::class.java.simpleName) + dialog.onOkClick = { result -> + updateSortUi(result) + onSortFavoriteTypeChanged(result) + } + dialog.show(parentFragmentManager, TAG) } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/HomeFrag.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/HomeFrag.kt index 1c73641..f88abf1 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/HomeFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/HomeFrag.kt @@ -64,7 +64,7 @@ class HomeFrag : BaseFrag(){ val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> - ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + ListMoreDialogFragment.newInstance(pdf.filePath).show(parentFragmentManager, FRAG_TAG) }, onLongClick = { pdf -> setupMultiSelect() }, onSelectModelItemClick = { number -> @@ -85,10 +85,12 @@ class HomeFrag : BaseFrag(){ } binding.sortingBtn.setOnSingleClickListener { - SortDialogFragment(HomeFrag(), onOkClick = { it -> - updateSortUi(it) - onSortTypeChanged(it) - }).show(parentFragmentManager, TAG) + val dialog = SortDialogFragment.newInstance(HomeFrag::class.java.simpleName) + dialog.onOkClick = { result -> + updateSortUi(result) + onSortTypeChanged(result) + } + dialog.show(parentFragmentManager, TAG) } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/RecentlyFrag.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/RecentlyFrag.kt index 14dc5bd..7e1a8a3 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/RecentlyFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ui/fragment/RecentlyFrag.kt @@ -59,7 +59,7 @@ class RecentlyFrag : BaseFrag() { val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> - ListMoreDialogFragment(pdf.filePath).show(parentFragmentManager, FRAG_TAG) + ListMoreDialogFragment.newInstance(pdf.filePath).show(parentFragmentManager, FRAG_TAG) }, onLongClick = { pdf -> setupMultiSelect() }, onSelectModelItemClick = { number ->