Commit 8ad2b48e authored by wanglei's avatar wanglei

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

parent 158488da
...@@ -41,7 +41,7 @@ class DocumentAdapter(val itemClick: (bean: DocumentBean) -> Unit) : ...@@ -41,7 +41,7 @@ class DocumentAdapter(val itemClick: (bean: DocumentBean) -> Unit) :
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
fun addData(type: String, drawable: Int, list: List<Pair<File, Uri>>) { fun addData(type: String, drawable: Int, list: List<Pair<File, Uri>>) {
docList.clear()
val beans = list.map { pair -> val beans = list.map { pair ->
val file = pair.first val file = pair.first
val uri = pair.second val uri = pair.second
......
...@@ -25,7 +25,7 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() { ...@@ -25,7 +25,7 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
var UI_MODE: String = MODE_PDF var UI_MODE: String = MODE_PDF
private lateinit var adapter: DocumentAdapter private lateinit var adapter: DocumentAdapter
private lateinit var dialog: Dialog private var dialog: Dialog? = null
public override val binding: FragmentDocumentListBinding by lazy { public override val binding: FragmentDocumentListBinding by lazy {
FragmentDocumentListBinding.inflate(layoutInflater) FragmentDocumentListBinding.inflate(layoutInflater)
...@@ -55,8 +55,18 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() { ...@@ -55,8 +55,18 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
} }
} }
adapter = DocumentAdapter { bean -> adapter = DocumentAdapter { bean ->
if (dialog == null) {
val launcher = (requireActivity() as MainActivity).launcher val launcher = (requireActivity() as MainActivity).launcher
requireContext().showDocumentDetailDialog(UI_MODE, bean, launcher) dialog = requireContext().showDocumentDetailDialog(UI_MODE,
bean,
launcher,
dismissAction = {
dialog = null
initData()
})
}
} }
binding.rv.adapter = adapter binding.rv.adapter = adapter
...@@ -89,16 +99,6 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() { ...@@ -89,16 +99,6 @@ class DocumentListFragment() : BaseFragment<FragmentDocumentListBinding>() {
private fun initData() = lifecycleScope.launch(Dispatchers.IO) { private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
when (UI_MODE) { when (UI_MODE) {
MODE_PDF -> { 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>>() val files = arrayListOf<Pair<File, Uri>>()
requireContext().geFileMedia(files, arrayOf("application/pdf")) requireContext().geFileMedia(files, arrayOf("application/pdf"))
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
......
package com.base.superpdfreader.helps package com.base.superpdfreader.helps
import android.content.Intent import android.content.Intent
import android.net.Uri
import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultCaller import androidx.activity.result.ActivityResultCaller
...@@ -44,4 +45,21 @@ class ActivityLauncher(activityResultCaller: ActivityResultCaller) { ...@@ -44,4 +45,21 @@ class ActivityLauncher(activityResultCaller: ActivityResultCaller) {
} }
//endregion //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 { ...@@ -22,9 +22,6 @@ object MediaStoreHelp {
val projection = arrayOf( val projection = arrayOf(
MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DATA,
// MediaStore.Files.FileColumns.MIME_TYPE,
// MediaStore.Files.FileColumns.TITLE,
// MediaStore.Files.FileColumns.SIZE,
) )
// 选择条件,筛选出MIME类型为application/zip的文件 // 选择条件,筛选出MIME类型为application/zip的文件
......
package com.base.superpdfreader.view package com.base.superpdfreader.view
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.Toast
import androidx.core.content.ContextCompat
import com.base.superpdfreader.R import com.base.superpdfreader.R
import com.base.superpdfreader.databinding.DialogPermissonOpenBinding 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 { object DialogViews {
...@@ -54,4 +60,54 @@ object DialogViews { ...@@ -54,4 +60,54 @@ object DialogViews {
dialog.show() dialog.show()
return dialog return dialog
} }
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 package com.base.superpdfreader.view
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.ContentResolver import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.widget.EditText
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat
import com.base.superpdfreader.R import com.base.superpdfreader.R
import com.base.superpdfreader.activity.DocBrowserActivity import com.base.superpdfreader.activity.DocBrowserActivity
import com.base.superpdfreader.activity.PdfBrowserActivity import com.base.superpdfreader.activity.PdfBrowserActivity
import com.base.superpdfreader.activity.XlsBrowserActivity import com.base.superpdfreader.activity.XlsBrowserActivity
import com.base.superpdfreader.bean.DocumentBean import com.base.superpdfreader.bean.DocumentBean
import com.base.superpdfreader.databinding.DialogDocumentDetailBinding 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_EXCEL
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_PDF 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_PPT
import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_WORD import com.base.superpdfreader.fragment.DocumentListFragment.Companion.MODE_WORD
import com.base.superpdfreader.helps.ActivityLauncher 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 com.google.android.material.bottomsheet.BottomSheetDialog
import java.io.File
import java.io.OutputStream import java.io.OutputStream
object DocumentDetailDialog { object DocumentDetailDialog {
private val TAG = "DocumentDetailDialog"
@SuppressLint("SetTextI18n", "QueryPermissionsNeeded") @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 dialog = BottomSheetDialog(this)
val binding = DialogDocumentDetailBinding.inflate(LayoutInflater.from(this)) val binding = DialogDocumentDetailBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root) dialog.setContentView(binding.root)
...@@ -122,24 +137,77 @@ object DocumentDetailDialog { ...@@ -122,24 +137,77 @@ object DocumentDetailDialog {
} }
} }
binding.llCopy.setOnClickListener { 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 -> launcher.launch(intent) { result ->
val srcUri = bean.uri 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 { binding.llDelete.setOnClickListener {
showDeleteConfirm {
val file = File(bean.path)
runCatching {
file.delete()
}
dialog.dismiss()
}
} }
dialog.setOnDismissListener {
dismissAction?.invoke()
}
return dialog
} }
@SuppressLint("Recycle") @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 -> contentResolver.openInputStream(sourceUri).use { input ->
val outputStream: OutputStream = contentResolver.openOutputStream(
getOutputUri(targetUri, "your_filename.ext") val outputStream: OutputStream = contentResolver.openOutputStream(targetUri) ?: return
) ?: return
input?.let { input?.let {
val buffer = ByteArray(1024) val buffer = ByteArray(1024)
...@@ -151,15 +219,4 @@ object DocumentDetailDialog { ...@@ -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 @@ ...@@ -14,7 +14,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/white" android:background="@color/white"
android:orientation="vertical"> android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<View <View
android:id="@+id/v_top" android:id="@+id/v_top"
...@@ -88,13 +89,13 @@ ...@@ -88,13 +89,13 @@
<com.noober.background.view.BLTextView <com.noober.background.view.BLTextView
android:id="@+id/tv_import" android:id="@+id/tv_import"
android:minWidth="135dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginVertical="20dp" android:layout_marginVertical="20dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:enabled="false" android:enabled="false"
android:gravity="center" android:gravity="center"
android:minWidth="135dp"
android:text="IMPORT" android:text="IMPORT"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="17sp" 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 @@ ...@@ -6,16 +6,24 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="5dp"> android:layout_margin="5dp">
<com.noober.background.view.BLImageView <androidx.cardview.widget.CardView
android:id="@+id/iv"
android:layout_width="75dp" android:layout_width="75dp"
android:layout_height="75dp" android:layout_height="75dp"
android:layout_margin="15dp" android:layout_margin="15dp"
app:bl_corners_radius="9dp" app:cardCornerRadius="9dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="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 <ImageView
android:id="@+id/iv_delete" 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