Commit 8ad2b48e authored by wanglei's avatar wanglei

...提交部分功能...

parent 158488da
......@@ -41,7 +41,7 @@ class DocumentAdapter(val itemClick: (bean: DocumentBean) -> Unit) :
@SuppressLint("NotifyDataSetChanged")
fun addData(type: String, drawable: Int, list: List<Pair<File, Uri>>) {
docList.clear()
val beans = list.map { pair ->
val file = pair.first
val uri = pair.second
......
......@@ -25,7 +25,7 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
var UI_MODE: String = MODE_PDF
private lateinit var adapter: DocumentAdapter
private lateinit var dialog: Dialog
private var dialog: Dialog? = null
public override val binding: FragmentDocumentListBinding by lazy {
FragmentDocumentListBinding.inflate(layoutInflater)
......@@ -55,8 +55,18 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
}
}
adapter = DocumentAdapter { bean ->
val launcher = (requireActivity() as MainActivity).launcher
requireContext().showDocumentDetailDialog(UI_MODE, bean, launcher)
if (dialog == null) {
val launcher = (requireActivity() as MainActivity).launcher
dialog = requireContext().showDocumentDetailDialog(UI_MODE,
bean,
launcher,
dismissAction = {
dialog = null
initData()
})
}
}
binding.rv.adapter = adapter
......@@ -89,16 +99,6 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
when (UI_MODE) {
MODE_PDF -> {
// loadDocument(filter = {
// val fileType = it.path.substring(it.path.length - 4, it.path.length)
// val flag = fileType == ".pdf"
// LogEx.logDebug(TAG, "fileType=$fileType flag=$flag")
// flag
// }) { files ->
// launch(Dispatchers.Main) {
// adapter.addData(MODE_PDF, R.mipmap.pdf, files)
// }
// }
val files = arrayListOf<Pair<File, Uri>>()
requireContext().geFileMedia(files, arrayOf("application/pdf"))
launch(Dispatchers.Main) {
......
package com.base.superpdfreader.helps
import android.content.Intent
import android.net.Uri
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultCaller
......@@ -44,4 +45,21 @@ class ActivityLauncher(activityResultCaller: ActivityResultCaller) {
}
//endregion
//region saf
// private var safResultCallback: ActivityResultCallback<Uri?>? = null
// private val safLauncher =
// activityResultCaller.registerForActivityResult(
// ActivityResultContracts.OpenDocument(),
// ) { uri ->
// safResultCallback?.onActivityResult(uri)
// }
//
// fun launch(array: Array<String>, safResultCallback: ActivityResultCallback<Uri?>?) {
// this.safResultCallback = safResultCallback
// safLauncher.launch(array)
// }
//end region
}
\ No newline at end of file
......@@ -22,9 +22,6 @@ object MediaStoreHelp {
val projection = arrayOf(
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA,
// MediaStore.Files.FileColumns.MIME_TYPE,
// MediaStore.Files.FileColumns.TITLE,
// MediaStore.Files.FileColumns.SIZE,
)
// 选择条件,筛选出MIME类型为application/zip的文件
......
package com.base.superpdfreader.view
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater
import android.widget.Toast
import androidx.core.content.ContextCompat
import com.base.superpdfreader.R
import com.base.superpdfreader.databinding.DialogPermissonOpenBinding
import com.base.superpdfreader.databinding.ItemDeleteTipBinding
import com.base.superpdfreader.databinding.ItemEditBinding
import com.base.superpdfreader.view.DialogViews.showRenameDialog
object DialogViews {
......@@ -54,4 +60,54 @@ object DialogViews {
dialog.show()
return dialog
}
}
\ No newline at end of file
fun Context.showRenameDialog(name: String, pClick: (name: String) -> Unit) {
val view = LayoutInflater.from(this).inflate(R.layout.item_edit, null, false)
val itemBinding = ItemEditBinding.bind(view)
itemBinding.editName.setText(name)
val dialog = AlertDialog.Builder(this)
.setTitle("Rename")
.setView(view)
.setPositiveButton("Rename") { dialog, which ->
val input = itemBinding.editName.text.toString()
if (input == "") {
Toast.makeText(this, "Name cannot be empty", Toast.LENGTH_SHORT).show()
} else {
pClick.invoke(input)
}
}.setNegativeButton("Cancel", null).create()
// renameDialog.window.setBackgroundDrawable()
dialog.show()
val pButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
val nButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
pButton.textSize = 16f
pButton.setTextColor(ContextCompat.getColor(this, R.color.color_pdf))
nButton.textSize = 16f
nButton.setTextColor(ContextCompat.getColor(this, R.color.color_pdf))
}
fun Context.showDeleteConfirm(pClick: () -> Unit) {
val view = LayoutInflater.from(this).inflate(R.layout.item_delete_tip, null, false)
val itemBinding = ItemDeleteTipBinding.bind(view)
val dialog = AlertDialog.Builder(this)
.setView(view)
.setPositiveButton("OK") { dialog, which ->
pClick.invoke()
}.setNegativeButton("CANCEL", null).create()
dialog.show()
val pButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE)
val nButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
pButton.textSize = 16f
pButton.setTextColor(ContextCompat.getColor(this, R.color.color_pdf))
nButton.textSize = 16f
nButton.setTextColor(ContextCompat.getColor(this, R.color.color_pdf))
}
}
package com.base.superpdfreader.view
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.widget.EditText
import android.widget.Toast
import androidx.core.content.ContextCompat
import com.base.superpdfreader.R
import com.base.superpdfreader.activity.DocBrowserActivity
import com.base.superpdfreader.activity.PdfBrowserActivity
import com.base.superpdfreader.activity.XlsBrowserActivity
import com.base.superpdfreader.bean.DocumentBean
import com.base.superpdfreader.databinding.DialogDocumentDetailBinding
import com.base.superpdfreader.databinding.ItemEditBinding
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_EXCEL
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_PDF
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_PPT
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_WORD
import com.base.superpdfreader.helps.ActivityLauncher
import com.base.superpdfreader.helps.LogEx
import com.base.superpdfreader.view.DialogViews.showDeleteConfirm
import com.base.superpdfreader.view.DialogViews.showRenameDialog
import com.google.android.material.bottomsheet.BottomSheetDialog
import java.io.File
import java.io.OutputStream
object DocumentDetailDialog {
private val TAG = "DocumentDetailDialog"
@SuppressLint("SetTextI18n", "QueryPermissionsNeeded")
fun Context.showDocumentDetailDialog(UI_MODE: String, bean: DocumentBean, launcher: ActivityLauncher) {
fun Context.showDocumentDetailDialog(
UI_MODE: String,
bean: DocumentBean,
launcher: ActivityLauncher,
dismissAction: (() -> Unit)? = null
): BottomSheetDialog {
val dialog = BottomSheetDialog(this)
val binding = DialogDocumentDetailBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
......@@ -122,24 +137,77 @@ object DocumentDetailDialog {
}
}
binding.llCopy.setOnClickListener {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
flags = takeFlags
setType("application/pdf")
addCategory(Intent.CATEGORY_OPENABLE)
putExtra(Intent.EXTRA_TITLE, bean.name)
}
launcher.launch(intent) { result ->
val srcUri = bean.uri
val treeUri: Uri? = result.data?.data
val copyUri: Uri = result.data?.data ?: Uri.EMPTY
LogEx.logDebug(TAG, "srcUri=$srcUri copyUri=$copyUri")
copyFileToUri(srcUri, copyUri)
}
dialog.dismiss()
}
binding.llShareCopy.setOnClickListener {
val shareIntent = Intent(Intent.ACTION_SEND).apply {
setType("application/pdf")
putExtra(Intent.EXTRA_STREAM, bean.uri)
}
val chooser: Intent = Intent.createChooser(shareIntent, "share pdf")
// 检查是否有可以处理此Intent的应用
if (shareIntent.resolveActivity(packageManager) != null) {
startActivity(chooser)
} else {
Toast.makeText(this, "No application to share", Toast.LENGTH_SHORT).show()
}
dialog.dismiss()
}
binding.llRename.setOnClickListener {
showRenameDialog(bean.name) { name ->
runCatching {
val file = File(bean.path)
val dir = file.parentFile
file.renameTo(File(dir, name))
}
dialog.dismiss()
}
}
binding.llDelete.setOnClickListener {
showDeleteConfirm {
val file = File(bean.path)
runCatching {
file.delete()
}
dialog.dismiss()
}
}
dialog.setOnDismissListener {
dismissAction?.invoke()
}
return dialog
}
@SuppressLint("Recycle")
fun Context.copyFileToUri(targetUri: Uri, sourceUri: Uri) {
fun Context.copyFileToUri(sourceUri: Uri, targetUri: Uri) {
LogEx.logDebug(TAG, "copyFileToUri")
val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
grantUriPermission(this.packageName, targetUri, takeFlags)
contentResolver.openInputStream(sourceUri).use { input ->
val outputStream: OutputStream = contentResolver.openOutputStream(
getOutputUri(targetUri, "your_filename.ext")
) ?: return
val outputStream: OutputStream = contentResolver.openOutputStream(targetUri) ?: return
input?.let {
val buffer = ByteArray(1024)
......@@ -151,15 +219,4 @@ object DocumentDetailDialog {
}
}
}
// 辅助函数,用于在目标Uri下创建文件
private fun getOutputUri(baseUri: Uri, filename: String): Uri {
return Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority("com.android.externalstorage.documents")
.appendPath("tree") // 根据SAF的Uri结构,这可能需要调整
.appendPath(baseUri.lastPathSegment)
.appendPath(filename)
.build()
}
}
\ No newline at end of file
......@@ -14,7 +14,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<View
android:id="@+id/v_top"
......@@ -88,13 +89,13 @@
<com.noober.background.view.BLTextView
android:id="@+id/tv_import"
android:minWidth="135dp"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginVertical="20dp"
android:layout_marginEnd="16dp"
android:enabled="false"
android:gravity="center"
android:minWidth="135dp"
android:text="IMPORT"
android:textColor="@color/white"
android:textSize="17sp"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="25dp"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:text="Are you sure want to delete this file?"
android:textColor="@color/black"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="15dp"
android:layout_marginVertical="20dp"
android:singleLine="true"
android:theme="@style/MyMyEditText"
tools:ignore="Autofill,LabelFor,TextFields" />
</LinearLayout>
\ No newline at end of file
......@@ -6,16 +6,24 @@
android:layout_height="wrap_content"
android:layout_margin="5dp">
<com.noober.background.view.BLImageView
android:id="@+id/iv"
<androidx.cardview.widget.CardView
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_margin="15dp"
app:bl_corners_radius="9dp"
app:cardCornerRadius="9dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<ImageView
android:id="@+id/iv_delete"
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyMyEditText">
<item name="colorControlNormal">@android:color/darker_gray</item>
<item name="colorControlActivated">@color/color_pdf</item>
</style>
</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