Commit ca2fb258 authored by wanglei's avatar wanglei

初始化

parent ecbcbb0b
Pipeline #1290 canceled with stages
......@@ -123,7 +123,7 @@ class DocumentAdapter() : BaseQuickAdapter<DocumentBean, DocumentAdapter.Documen
fun changeIcon(item: DocumentBean, binding: ItemDocumentBinding) {
if (item.type == TYPE_PDF) {
if (item.state == 0) {
binding.iv.setImageResource(R.mipmap.h_pdfiocn)
binding.iv.setImageResource(R.mipmap.pdficon)
}
if (item.state == 1) {
binding.iv.setImageResource(R.mipmap.souding)
......
package com.base.pdfreader2.ui.main
import android.annotation.SuppressLint
import android.content.Intent
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.pdfreader2.bean.ConstObject
import com.base.pdfreader2.bean.DocumentBean
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_EXCEL
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_PDF
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_PPT
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_WORD
import com.base.pdfreader2.databinding.FragmentDocumentBinding
import com.base.pdfreader2.helper.BaseFragment
import com.base.pdfreader2.ui.view.DocumentDialog.showDocumentHomeMoreDialog
import com.base.pdfreader2.ui.view.PdfDialog.showPdfHomeMoreDialog
import com.base.pdfreader2.utils.PdfBoxUtils.checkPdfEncryption
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.util.Locale
......@@ -33,10 +39,44 @@ class DocumentFragment() : BaseFragment<FragmentDocumentBinding>() {
override fun setView() {
documentPresenter = DocumentPresenter(requireContext())
initAdapter()
binding.swipeRefreshLayout.isRefreshing = true
}
private fun initAdapter() {
adapter = DocumentAdapter()
adapter.bookmarkAction = { addRemove, path ->
documentPresenter.saveBookmarkChange(addRemove, path)
}
adapter.itemClick = { item ->
// if (AdmobHelper.isShowOpenDocumentInter()) {
// AdmobInterstitialUtils.showInterstitialAd(requireActivity()) {
// if (it) {
// lastOpenDocumentShowAd = System.currentTimeMillis()
// }
// requireActivity().jumpDocument(item)
// }
// } else {
// requireActivity().jumpDocument(item)
// }
}
adapter.moreAction = { item ->
documentMoreAction.invoke(item)
}
binding.rv.adapter = adapter
}
binding.swipeRefreshLayout.isRefreshing = true
private var documentMoreAction: (item: DocumentBean) -> Unit = { item ->
val mainActivity = (requireActivity() as MainActivity)
if (item.type == TYPE_PDF) {
requireContext().showPdfHomeMoreDialog(item, this, documentPresenter)
}
if (item.type == TYPE_WORD || item.type == TYPE_EXCEL || item.type == TYPE_PPT) {
requireContext().showDocumentHomeMoreDialog(item, this, documentPresenter)
}
}
override fun setListener() {
......@@ -117,5 +157,32 @@ class DocumentFragment() : BaseFragment<FragmentDocumentBinding>() {
return listOf()
}
fun splitPdf(path: String, pwd: String?) {
// startActivity(Intent(requireContext(), PdfSplitActivity::class.java).apply {
// putExtra("path", path)
// putExtra("pwd", pwd)
// })
}
fun mergePdf(path: String) {
// startActivity(Intent(requireContext(), PdfSelectActivity::class.java).apply {
// putExtra("doWhat", ConstObject.DO_MERGE_PDF)
// })
}
fun removeItem(item: DocumentBean) {
val list = arrayListOf<DocumentBean>()
list.addAll(adapter.items)
list.removeIf { it.path == item.path }
adapter.submitList(list)
}
@SuppressLint("NotifyDataSetChanged")
fun changePdfLock(item: DocumentBean) {
val pdf = adapter.items.find { it.path == item.path }
pdf?.state = requireContext().checkPdfEncryption(item.path)
adapter.notifyDataSetChanged()
}
}
\ No newline at end of file
......@@ -20,6 +20,8 @@ import com.base.pdfreader2.utils.SpStringUtils.BOOKMARK_KEY
import com.base.pdfreader2.utils.SpStringUtils.LAST_VIEW_KEY
import com.base.pdfreader2.utils.getMediaFile
import com.base.pdfreader2.utils.upDateDemoStore
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class DocumentPresenter(
......@@ -198,6 +200,7 @@ class DocumentPresenter(
UI_SORT_NAME_A_Z -> {
return list.sortedBy { File(it.path).name }
}
UI_SORT_NAME_Z_A -> {
return list.sortedByDescending { File(it.path).name }
}
......@@ -206,4 +209,36 @@ class DocumentPresenter(
return list
}
fun saveBookmarkChange(addRemove: Boolean, path: String) {
if (addRemove) {
SpStringUtils.addSpString(BOOKMARK_KEY, path)
} else {
SpStringUtils.deleteSpString(BOOKMARK_KEY, path)
}
}
fun renameDocumentBean(
file: File,
newName: String,
fragment: DocumentFragment,
) {
try {
val newFile = File(file.parentFile, newName)
val result = file.renameTo(newFile)
if (result) {
}
} catch (e: Exception) {
e.printStackTrace()
}
fragment.refreshData()
}
fun deleteDocument(item: DocumentBean, documentFragment: DocumentFragment) {
val flag = File(item.path).delete()
if (flag) {
documentFragment.removeItem(item)
}
}
}
\ No newline at end of file
package com.base.pdfreader2.ui.main
import android.app.Activity
import android.content.Intent
import android.graphics.Color
import android.view.View
import android.view.inputmethod.EditorInfo
......
......@@ -9,6 +9,7 @@ import com.base.pdfreader2.bean.ConstObject.UI_SORT_FINAL_MODIFIED
import com.base.pdfreader2.bean.ConstObject.UI_SORT_LAST_MODIFIED
import com.base.pdfreader2.bean.ConstObject.UI_SORT_NAME_A_Z
import com.base.pdfreader2.bean.ConstObject.UI_SORT_NAME_Z_A
import com.base.pdfreader2.databinding.DialogDeleteBinding
import com.base.pdfreader2.databinding.DialogSortBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
......@@ -96,4 +97,26 @@ object DialogView {
okAction.invoke()
}
}
fun Context.showDeleteDialog(deleteAction: () -> Unit) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogDeleteBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
binding.tvCancel.setOnClickListener {
dialog.dismiss()
}
binding.tvDelete.setOnClickListener {
dialog.dismiss()
deleteAction.invoke()
}
}
}
\ No newline at end of file
package com.base.pdfreader2.ui.view
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import com.base.pdfreader2.R
import com.base.pdfreader2.bean.DocumentBean
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_EXCEL
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_PPT
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_WORD
import com.base.pdfreader2.databinding.DialogDocumentDetailBinding
import com.base.pdfreader2.databinding.DialogDocumentHomeMoreBinding
import com.base.pdfreader2.ui.main.DocumentFragment
import com.base.pdfreader2.ui.main.DocumentPresenter
import com.base.pdfreader2.ui.view.DialogView.showDeleteDialog
import com.base.pdfreader2.ui.view.NameDialog.showDocumentRenameDialog
import com.base.pdfreader2.utils.IntentShareUtils.documentShare
import com.base.pdfreader2.utils.KotlinExt.toFormatSize
import com.base.pdfreader2.utils.KotlinExt.toFormatTime3
import com.base.pdfreader2.utils.KotlinExt.toFormatTime4
import com.base.pdfreader2.utils.SpStringUtils
import com.base.pdfreader2.utils.SpStringUtils.LAST_VIEW_KEY
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import java.io.File
object DocumentDialog {
@SuppressLint("SetTextI18n", "NotifyDataSetChanged")
fun Context.showDocumentHomeMoreDialog(
item: DocumentBean,
documentFragment: DocumentFragment,
documentPresenter: DocumentPresenter,
): BottomSheetDialog {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogDocumentHomeMoreBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val file = File(item.path)
binding.tvName.text = file.name
binding.tvInfo.text = file.lastModified().toFormatTime4() + " " + file.length().toFormatSize()
if (item.isBookmarked) {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_s)
} else {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_n)
}
when (item.type) {
TYPE_WORD -> {
binding.ivDocument.setImageResource(R.mipmap.wordicon)
}
TYPE_EXCEL -> {
binding.ivDocument.setImageResource(R.mipmap.excelicon)
}
TYPE_PPT -> {
binding.ivDocument.setImageResource(R.mipmap.ppticon)
}
}
binding.llRename.setOnClickListener {
showDocumentRenameDialog(file.name, okAction = { newName ->
dialog.dismiss()
documentPresenter.renameDocumentBean(file, newName, documentFragment)
})
}
binding.llDetail.setOnClickListener {
showDocumentDetail(item.path)
}
binding.llShare.setOnClickListener {
documentShare(item)
}
binding.llDelete.setOnClickListener {
dialog.dismiss()
showDeleteDialog {
documentPresenter.deleteDocument(item, documentFragment)
}
}
return dialog
}
fun Context.showDocumentDetail(path: String) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogDocumentDetailBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val file = File(path)
binding.tvName.text = file.name
binding.tvPath.text = file.absolutePath
val lastView = SpStringUtils.getSpStringList(LAST_VIEW_KEY).find { it.contains(file.absolutePath) }
if (lastView != null) {
val lastTime = lastView.split("_/_")[1]
binding.tvLastView.text = lastTime.toLong().toFormatTime3()
} else {
binding.tvLastView.text = file.lastModified().toFormatTime3()
}
binding.tvLastChange.text = file.lastModified().toFormatTime3()
binding.tvFileSize.text = file.length().toFormatSize()
binding.tvBtnOk.setOnClickListener {
dialog.dismiss()
}
}
}
\ No newline at end of file
package com.base.pdfreader2.ui.view
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.core.widget.addTextChangedListener
import com.base.pdfreader2.R
import com.base.pdfreader2.databinding.DialogDocumentRenameBinding
import com.base.pdfreader2.utils.KotlinExt.toFormatTime2
import com.base.pdfreader2.utils.ToastUtils.toast
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
object NameDialog {
/**
* 重命名
*/
fun Context.showDocumentRenameDialog(
name: String? = null,
okAction: ((newName: String) -> Unit)? = null,
dismissAction: (() -> Unit)? = null
) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogDocumentRenameBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
val window = dialog.window
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
binding.edit.addTextChangedListener {
binding.tvOk.isEnabled = !it.isNullOrEmpty()
}
val tempName = "Split_" + System.currentTimeMillis().toFormatTime2()
binding.edit.setText(name ?: tempName)
if (name == null) {
binding.edit.selectAll()
} else {
val nameS = name.split(".")[0]
binding.edit.setSelection(0, nameS.length)
}
binding.edit.requestFocus()
binding.tvCancel.setOnClickListener {
dialog.dismiss()
}
binding.tvOk.setOnClickListener {
dialog.dismiss()
val newName = binding.edit.text.toString()
if (newName.isEmpty()) {
toast("name can't be empty!")
return@setOnClickListener
}
okAction?.invoke(newName)
}
dialog.setOnDismissListener {
dismissAction?.invoke()
}
}
}
\ No newline at end of file
package com.base.pdfreader2.ui.view
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import com.base.pdfreader2.R
import com.base.pdfreader2.bean.DocumentBean
import com.base.pdfreader2.databinding.DialogPdfHomeMoreBinding
import com.base.pdfreader2.ui.main.DocumentFragment
import com.base.pdfreader2.ui.main.DocumentPresenter
import com.base.pdfreader2.ui.view.DialogView.showDeleteDialog
import com.base.pdfreader2.ui.view.DocumentDialog.showDocumentDetail
import com.base.pdfreader2.ui.view.NameDialog.showDocumentRenameDialog
import com.base.pdfreader2.ui.view.PwdDialog.showPdfPwdDialog
import com.base.pdfreader2.utils.IntentShareUtils
import com.base.pdfreader2.utils.KotlinExt.toFormatSize
import com.base.pdfreader2.utils.KotlinExt.toFormatTime
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import java.io.File
object PdfDialog {
//pdf首页弹窗
@SuppressLint("NotifyDataSetChanged", "SetTextI18n")
fun Context.showPdfHomeMoreDialog(
item: DocumentBean,
documentFragment: DocumentFragment,
documentPresenter: DocumentPresenter,
): BottomSheetDialog {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogPdfHomeMoreBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val file = File(item.path)
binding.tvName.text = file.name
binding.tvInfo.text = file.lastModified().toFormatTime() + " " + file.length().toFormatSize()
if (item.isBookmarked) {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_s)
} else {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_n)
}
binding.ivBookmark.setOnClickListener {
item.isBookmarked = !item.isBookmarked
if (item.isBookmarked) {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_s)
} else {
binding.ivBookmark.setImageResource(R.mipmap.h_soucang_n)
}
documentPresenter.saveBookmarkChange(item.isBookmarked, item.path)
documentFragment.refreshData()
}
binding.llRename.setOnClickListener {
showDocumentRenameDialog(file.name, okAction = { newName ->
dialog.dismiss()
documentPresenter.renameDocumentBean(file, newName, documentFragment)
})
}
binding.llSplit.setOnClickListener {
dialog.dismiss()
if (item.state == 1) {
showPdfPwdDialog(
state = item.state, path = item.path, firstDialog = dialog, isCheckPwd = true, verificationAction = {
documentFragment.splitPdf(item.path, it)
})
} else {
documentFragment.splitPdf(item.path, null)
}
}
binding.llMerge.setOnClickListener {
dialog.dismiss()
documentFragment.mergePdf(item.path)
}
binding.llDelete.setOnClickListener {
dialog.dismiss()
showDeleteDialog {
documentPresenter.deleteDocument(item, documentFragment)
}
}
binding.llDetail.setOnClickListener {
showDocumentDetail(item.path)
}
binding.llShare.setOnClickListener {
val intent = IntentShareUtils.sharePdfIntent(item.uri)
runCatching {
startActivity(intent)
}
}
if (item.state == 1) {
binding.tvLock.text = getString(R.string.unlock_pdf)
}
if (item.state == 0) {
binding.tvLock.text = getString(R.string.lock_pdf)
}
binding.llLock.setOnClickListener {
showPdfPwdDialog(state = item.state, path = item.path,
firstDialog = dialog,
isCheckPwd = false,
encryptionAction = {
dialog.dismiss()
documentFragment.changePdfLock(item)
})
}
dialog.setOnDismissListener {
}
return dialog
}
// fun Activity.showPdfMoreDialog(
// pdfView: PdfView,
// pageNumber: Int,
// pafPath: String,
// ) {
// val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
// val binding = DialogPdfMoreBinding.inflate(LayoutInflater.from(this))
// dialog.setContentView(binding.root)
// dialog.setCanceledOnTouchOutside(false)
//
// dialog.show()
//
// val parentView = binding.root.parent as View
// val behavior = BottomSheetBehavior.from(parentView)
// //展开
// behavior.state = BottomSheetBehavior.STATE_EXPANDED
//
// binding.llJump.setOnClickListener {
// showJumpPageNumberDialog(pageNumber) { pageIndex ->
// dialog.dismiss()
// pdfView.jumpPage(pageIndex)
// }
// }
// binding.llSplit.setOnClickListener {
// dialog.dismiss()
// pdfView.jumpSplit()
// }
// binding.llDetail.setOnClickListener {
// showDocumentDetail(pafPath)
// }
// binding.llShare.setOnClickListener {
// dialog.dismiss()
// runCatching {
// val pkg = this.packageName
// LogEx.logDebug("showPdfMoreDialog", "pkg=$pkg")
// val uri = FileProvider.getUriForFile(
// this, this.packageName + ".provider", File(pafPath)
// )
// startActivity(Intent.createChooser(IntentShareUtils.sharePdfIntent(uri), "Share PDF"))
// }
// }
// binding.llPrint.setOnClickListener {
// val uri = FileProvider.getUriForFile(
// this, this.packageName + ".provider", File(pafPath)
// )
// startActivity(Intent.createChooser(IntentShareUtils.sharePdfPrintIntent(uri), "Print PDF"))
// }
//
// }
// @SuppressLint("SetTextI18n")
// fun Context.showPdfPwdDialog(
// state: Int,
// path: String = "",
// uri: String? = null,
// firstDialog: Dialog? = null,
// isCheckPwd: Boolean = false,
// verificationAction: ((pwd: String) -> Unit)? = null,
// encryptionAction: (() -> Unit)? = null,
// cancelAction: (() -> Unit)? = null,
// ) {
// val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
// val binding = DialogPdfPasswordBinding.inflate(LayoutInflater.from(this))
// dialog.setContentView(binding.root)
// dialog.setCanceledOnTouchOutside(false)
//
// val window = dialog.window
// window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
//
// dialog.show()
//
// val parentView = binding.root.parent as View
// val behavior = BottomSheetBehavior.from(parentView)
// //展开
// behavior.state = BottomSheetBehavior.STATE_EXPANDED
//
// if (!isCheckPwd) {
// if (state == 1) {
// binding.tvTittle.text = getString(R.string.delete_password)
// binding.tvTip.text = getString(R.string.delete_password_the_file_is_not_password_protected)
// }
// if (state == 0) {
// binding.tvTittle.text = getString(R.string.set_password)
// binding.tvTip.text = getString(R.string.set_password_protection_pdf)
//
// }
// } else {
// binding.tvTittle.text = getString(R.string.input_password)
// val file = File(path)
// binding.tvTip.text = getString(R.string.password_protected, file.name)
// binding.tvInputTip.visibility = View.VISIBLE
// }
//
// binding.edit.requestFocus()
// binding.edit.addTextChangedListener {
// binding.tvConfirm.isEnabled = it.toString().isNotEmpty()
// binding.tvErrorTip.visibility = View.GONE
// }
//
// binding.tvCancel.setOnClickListener {
// dialog.dismiss()
// cancelAction?.invoke()
// }
// binding.tvConfirm.setOnClickListener {
//
// val pwd = binding.edit.text.toString()
//
// if (!isCheckPwd) {
//
// //加锁逻辑
// if (state == 0) {
// PdfBoxUtils.setPassword(path, pwd, pwd)
// toast("Success Encryption")
// encryptionAction?.invoke()
// dialog.dismiss()
// firstDialog?.dismiss()
// }
// //解锁逻辑
// if (state == 1) {
// val result = PdfBoxUtils.checkPwd(path, pwd, uri)
// LogEx.logDebug("checkPwd", "result=$result")
// if (result) {
// PdfBoxUtils.clearPassword(path, pwd)
// toast("clear Encryption")
// encryptionAction?.invoke()
// dialog.dismiss()
// firstDialog?.dismiss()
// } else {
// binding.tvErrorTip.visibility = View.VISIBLE
// }
// }
// } else {
// //验证密码逻辑
// val result = PdfBoxUtils.checkPwd(path, pwd, uri)
// if (!result) {
// binding.tvErrorTip.visibility = View.VISIBLE
// return@setOnClickListener
// }
// dialog.dismiss()
// firstDialog?.dismiss()
// verificationAction?.invoke(pwd)
// }
//
// }
// binding.ivEye.setOnClickListener {
//
// if (binding.edit.transformationMethod == null) {
// // 隐藏密码
// binding.edit.transformationMethod = PasswordTransformationMethod()
// binding.ivEye.setImageResource(R.mipmap.weishuru)
// } else {
// // 显示密码
// binding.edit.transformationMethod = null
// binding.ivEye.setImageResource(R.mipmap.yishuru)
// }
// }
//
// }
}
\ No newline at end of file
package com.base.pdfreader2.ui.view
import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Context
import android.text.method.PasswordTransformationMethod
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.core.widget.addTextChangedListener
import com.base.pdfreader2.R
import com.base.pdfreader2.databinding.DialogPdfPasswordBinding
import com.base.pdfreader2.utils.LogEx
import com.base.pdfreader2.utils.PdfBoxUtils
import com.base.pdfreader2.utils.PdfBoxUtils.checkPwd
import com.base.pdfreader2.utils.ToastUtils.toast
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import java.io.File
object PwdDialog {
@SuppressLint("SetTextI18n")
fun Context.showPdfPwdDialog(
state: Int,
path: String = "",
uri: String? = null,
firstDialog: Dialog? = null,
isCheckPwd: Boolean = false,
verificationAction: ((pwd: String) -> Unit)? = null,
encryptionAction: (() -> Unit)? = null,
cancelAction: (() -> Unit)? = null,
) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogPdfPasswordBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
val window = dialog.window
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
if (!isCheckPwd) {
if (state == 1) {
binding.tvTittle.text = getString(R.string.delete_password)
binding.tvTip.text = getString(R.string.delete_password_the_file_is_not_password_protected)
}
if (state == 0) {
binding.tvTittle.text = getString(R.string.set_password)
binding.tvTip.text = getString(R.string.set_password_protection_pdf)
}
} else {
binding.tvTittle.text = getString(R.string.input_password)
val file = File(path)
binding.tvTip.text = getString(R.string.password_protected, file.name)
binding.tvInputTip.visibility = View.VISIBLE
}
binding.edit.requestFocus()
binding.edit.addTextChangedListener {
binding.tvConfirm.isEnabled = it.toString().isNotEmpty()
binding.tvErrorTip.visibility = View.GONE
}
binding.tvCancel.setOnClickListener {
dialog.dismiss()
cancelAction?.invoke()
}
binding.tvConfirm.setOnClickListener {
val pwd = binding.edit.text.toString()
if (!isCheckPwd) {
//加锁逻辑
if (state == 0) {
PdfBoxUtils.setPassword(path, pwd, pwd)
toast("Success Encryption")
encryptionAction?.invoke()
dialog.dismiss()
firstDialog?.dismiss()
}
//解锁逻辑
if (state == 1) {
val result = checkPwd(path, pwd, uri)
LogEx.logDebug("checkPwd", "result=$result")
if (result) {
PdfBoxUtils.clearPassword(path, pwd)
toast("clear Encryption")
encryptionAction?.invoke()
dialog.dismiss()
firstDialog?.dismiss()
} else {
binding.tvErrorTip.visibility = View.VISIBLE
}
}
} else {
//验证密码逻辑
val result = checkPwd(path, pwd, uri)
if (!result) {
binding.tvErrorTip.visibility = View.VISIBLE
return@setOnClickListener
}
dialog.dismiss()
firstDialog?.dismiss()
verificationAction?.invoke(pwd)
}
}
binding.ivEye.setOnClickListener {
if (binding.edit.transformationMethod == null) {
// 隐藏密码
binding.edit.transformationMethod = PasswordTransformationMethod()
binding.ivEye.setImageResource(R.mipmap.weishuru)
} else {
// 显示密码
binding.edit.transformationMethod = null
binding.ivEye.setImageResource(R.mipmap.yishuru)
}
}
}
}
\ No newline at end of file
package com.base.pdfreader2.utils
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.content.FileProvider
import com.base.pdfreader2.R
import com.base.pdfreader2.bean.DocumentBean
import com.base.pdfreader2.bean.DocumentBean.Companion.TYPE_PDF
import java.io.File
object IntentShareUtils {
fun Context.documentShare(documentBean: DocumentBean) {
val uri = FileProvider.getUriForFile(
this, this.packageName + ".provider", File(documentBean.path)
)
var intent: Intent? = null
var desc = getString(R.string.share_pdf)
if (documentBean.type == DocumentBean.TYPE_PPT) {
intent = sharePptIntent(uri)
desc = getString(R.string.share_ppt)
}
if (documentBean.type == DocumentBean.TYPE_WORD) {
intent = shareWordIntent(uri)
desc = getString(R.string.share_word)
}
if (documentBean.type == DocumentBean.TYPE_EXCEL) {
intent = shareExcelIntent(uri)
desc = getString(R.string.share_excel)
}
intent?.let { startActivity(Intent.createChooser(it, desc)) }
}
fun sharePdfIntent(uri: Uri): Intent {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = "application/pdf"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授权临时权限
}
return shareIntent
}
fun sharePptIntent(uri: Uri): Intent {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = "application/vnd.ms-powerpoint"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授权临时权限
}
return shareIntent
}
fun shareWordIntent(uri: Uri): Intent {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = "application/msword"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授权临时权限
}
return shareIntent
}
fun shareExcelIntent(uri: Uri): Intent {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, uri)
type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授权临时权限
}
return shareIntent
}
fun sharePdfPrintIntent(uri: Uri): Intent {
// 创建打印的 Intent
val intent = Intent(Intent.ACTION_SEND)
intent.setDataAndType(uri, "application/pdf")
// 启动打印服务
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
return intent
}
fun Context.shareMutDocuments(
type: String, uris: ArrayList<Uri>
) {
var desc = "Share PDF files"
val intent = when (type) {
TYPE_PDF -> {
shareMutPdfIntent(uris)
}
else -> shareMutPdfIntent(uris)
}
val chooserIntent = Intent.createChooser(intent, desc)
startActivity(chooserIntent)
}
fun shareMutPdfIntent(uris: ArrayList<Uri>): Intent {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND_MULTIPLE
type = "application/pdf"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授权临时权限
putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
}
return shareIntent
}
}
\ No newline at end of file
package com.base.pdfreader2.utils
import android.content.Context
import android.widget.Toast
object ToastUtils {
fun Context.toast(content: String) {
Toast.makeText(this, content, Toast.LENGTH_SHORT).show()
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#7FDCEE"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F1F1F1" />
<corners android:topLeftRadius="25dp" android:topRightRadius="25dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FB2B39" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_00b8de_10" android:state_enabled="true" />
<item android:drawable="@drawable/bg_7fdcee_10" android:state_enabled="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="0.5dp"
android:color="#BABABA" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f3f3f3_tlr25"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="65dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:includeFontPadding="false"
android:text="@string/delete"
android:textColor="#333333"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl">
<TextView
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="32dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
android:singleLine="true"
android:text="@string/are_you_sure_you_want_to_delete_it"
android:textColor="#333333"
android:textSize="18sp"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="26dp"
android:layout_marginBottom="20dp">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="163dp"
android:layout_height="48dp"
android:background="@drawable/bg_f1f2f6_10"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#505050"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="163dp"
android:layout_height="48dp"
android:layout_marginStart="14dp"
android:background="@drawable/bg_fb2b39_10"
android:gravity="center"
android:text="@string/delete"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f1f1f1_tlr25"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl"
android:layout_width="match_parent"
android:layout_height="65dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="Detail"
android:textColor="#333333"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="?android:selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:includeFontPadding="false"
android:text="File Name"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:includeFontPadding="false"
android:textColor="#9A9A9A"
android:textSize="14sp"
tools:text="DEMO.pdf" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="?android:selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:includeFontPadding="false"
android:text="Storage Path"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:textColor="#9A9A9A"
android:textSize="14sp"
tools:text="/data/user/0/com.pdfviewer.scanner/files/ demo/DEMO.pdf" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="?android:selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:includeFontPadding="false"
android:text="Last View"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_last_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:singleLine="true"
android:textColor="#9A9A9A"
android:textSize="14sp"
tools:text="2024-09-10 13:58:00" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="?android:selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:includeFontPadding="false"
android:text="Last Change"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_last_change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:singleLine="true"
android:textColor="#9A9A9A"
android:textSize="14sp"
tools:text="2024-09-10 13:58:00" />
</LinearLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="?android:selectableItemBackground">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:includeFontPadding="false"
android:text="File Size"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_file_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="2"
android:singleLine="true"
android:textColor="#9A9A9A"
android:textSize="14sp"
tools:text="666.66 KB" />
</LinearLayout>
</FrameLayout>
<TextView
android:id="@+id/tv_btn_ok"
android:layout_width="338dp"
android:layout_height="48dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:layout_marginBottom="25dp"
android:background="@drawable/bg_00b8de_10"
android:gravity="center"
android:text="OK"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f1f1f1_tlr25"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl"
android:layout_width="match_parent"
android:layout_height="88dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_document"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="-50dp"
android:src="@mipmap/pdficon"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/iv_document"
app:layout_constraintEnd_toStartOf="@id/iv_bookmark"
app:layout_constraintStart_toEndOf="@id/iv_document"
app:layout_constraintTop_toTopOf="@id/iv_document">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="17sp"
android:textStyle="bold"
tools:text="PDF_2024091.pdf" />
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:includeFontPadding="false"
tools:text="2024-09-10 590.23 KB" />
</LinearLayout>
<ImageView
android:id="@+id/iv_bookmark"
android:layout_width="24dp"
android:layout_height="32dp"
android:layout_marginEnd="27dp"
android:src="@mipmap/h_soucang_n"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl">
<LinearLayout
android:id="@+id/ll_rename"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/rename"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/rename"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_detail"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/particulars"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/detail"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_share"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/share"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/share"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_delete"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="20dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/delete"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/delete"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f3f3f3_tlr25"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="65dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:includeFontPadding="false"
android:text="@string/rename"
android:textColor="#333333"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="32dp"
android:background="@drawable/bg_stoke_bababa_10"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
android:singleLine="true"
android:text="DEMO.pdf"
android:textColor="#333333"
android:textSize="18sp"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="26dp"
android:layout_marginBottom="20dp">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="163dp"
android:layout_height="48dp"
android:background="@drawable/bg_f1f2f6_10"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#505050"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_ok"
android:layout_width="163dp"
android:layout_height="48dp"
android:layout_marginStart="14dp"
android:background="@drawable/bg_selector_btn"
android:gravity="center"
android:text="@string/ok"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f1f1f1_tlr25"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl"
android:layout_width="match_parent"
android:layout_height="88dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_pdf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="-50dp"
android:src="@mipmap/h_pdfiocn"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/iv_pdf"
app:layout_constraintEnd_toStartOf="@id/iv_bookmark"
app:layout_constraintStart_toEndOf="@id/iv_pdf"
app:layout_constraintTop_toTopOf="@id/iv_pdf">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="17sp"
android:textStyle="bold"
tools:text="PDF_2024091.pdf" />
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:includeFontPadding="false"
tools:text="2024-09-10 590.23 KB" />
</LinearLayout>
<ImageView
android:id="@+id/iv_bookmark"
android:layout_width="24dp"
android:layout_height="32dp"
android:layout_marginEnd="27dp"
android:src="@mipmap/h_soucang_n"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl">
<LinearLayout
android:id="@+id/ll_rename"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/rename"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/rename"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_merge"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/merge"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/merge_pdf"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_split"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/split"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/split_pdf"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_lock"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/lock"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_lock"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/lock_pdf"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_detail"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/particulars"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/detail"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_share"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/share"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/share"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_delete"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="20dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="13dp"
android:src="@mipmap/delete"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="13dp"
android:layout_weight="1"
android:ellipsize="end"
android:includeFontPadding="false"
android:singleLine="true"
android:text="@string/delete"
android:textColor="#333333"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="20dp"
android:src="@mipmap/jianotou"
tools:ignore="ContentDescription" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_f3f3f3_tlr25"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="65dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:includeFontPadding="false"
android:text="@string/set_password"
android:textColor="#333333"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="26dp"
android:src="@mipmap/suo"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl">
<TextView
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="22dp"
android:text="@string/set_password_protection_pdf"
android:textColor="#333333"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_input_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="@string/enter_the_password_to_open_the_file"
android:visibility="gone"
tools:ignore="HardcodedText" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
android:gravity="center"
app:endIconDrawable="@mipmap/weishuru"
app:endIconMode="custom"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_stoke_bababa_10"
android:ellipsize="end"
android:gravity="center_vertical"
android:hint="Input..."
android:inputType="textPassword"
android:paddingHorizontal="20dp"
android:singleLine="true"
android:textColor="#333333"
android:textSize="18sp" />
<ImageView
android:id="@+id/iv_eye"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="24dp"
android:src="@mipmap/weishuru"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_error_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="@string/password_error"
android:textColor="#FA2232"
android:visibility="gone"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="26dp"
android:layout_marginBottom="20dp">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="163dp"
android:layout_height="48dp"
android:background="@drawable/bg_f1f2f6_10"
android:gravity="center"
android:text="@string/cancel"
android:textColor="#505050"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="163dp"
android:layout_height="48dp"
android:layout_marginStart="14dp"
android:background="@drawable/bg_selector_btn"
android:enabled="false"
android:gravity="center"
android:text="@string/confirm"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -124,4 +124,8 @@
<string name="completed">Completed</string>
<string name="clean">Clean</string>
<string name="scan">Scan</string>
<string name="share_pdf">Share PDF</string>
<string name="share_ppt">Share PPT</string>
<string name="share_word">Share Word</string>
<string name="share_excel">Share Excel</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment