修复bug:could not find Fragment constructor
This commit is contained in:
parent
edc573d3c4
commit
bc5453e85d
@ -52,7 +52,7 @@ android {
|
||||
)
|
||||
}
|
||||
debug {
|
||||
isMinifyEnabled = true
|
||||
isMinifyEnabled = false
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
|
||||
)
|
||||
|
||||
@ -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()
|
||||
)
|
||||
): Parcelable
|
||||
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 -> {
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
|
||||
@ -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 -> {
|
||||
|
||||
@ -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<View>(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()
|
||||
|
||||
@ -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<View>(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()
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<View>(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()
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 ->
|
||||
|
||||
Loading…
Reference in New Issue
Block a user