Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
S
Super PDF Reader
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Super PDF Reader
Commits
8ad2b48e
Commit
8ad2b48e
authored
Jun 26, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...提交部分功能...
parent
158488da
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
224 additions
and
44 deletions
+224
-44
DocumentAdapter.kt
...n/java/com/base/superpdfreader/adapter/DocumentAdapter.kt
+1
-1
DocumentListFragment.kt
.../com/base/superpdfreader/fragment/DocumentListFragment.kt
+13
-13
ActivityLauncher.kt
...in/java/com/base/superpdfreader/helps/ActivityLauncher.kt
+18
-0
MediaStoreHelp.kt
...main/java/com/base/superpdfreader/helps/MediaStoreHelp.kt
+0
-3
DialogViews.kt
...src/main/java/com/base/superpdfreader/view/DialogViews.kt
+57
-1
DocumentDetailDialog.kt
...java/com/base/superpdfreader/view/DocumentDetailDialog.kt
+77
-20
activity_image_selection.xml
app/src/main/res/layout/activity_image_selection.xml
+3
-2
item_delete_tip.xml
app/src/main/res/layout/item_delete_tip.xml
+18
-0
item_edit.xml
app/src/main/res/layout/item_edit.xml
+17
-0
item_image_selected.xml
app/src/main/res/layout/item_image_selected.xml
+12
-4
styles.xml
app/src/main/res/values/styles.xml
+8
-0
No files found.
app/src/main/java/com/base/superpdfreader/adapter/DocumentAdapter.kt
View file @
8ad2b48e
...
...
@@ -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
...
...
app/src/main/java/com/base/superpdfreader/fragment/DocumentListFragment.kt
View file @
8ad2b48e
...
...
@@ -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
)
{
...
...
app/src/main/java/com/base/superpdfreader/helps/ActivityLauncher.kt
View file @
8ad2b48e
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
app/src/main/java/com/base/superpdfreader/helps/MediaStoreHelp.kt
View file @
8ad2b48e
...
...
@@ -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的文件
...
...
app/src/main/java/com/base/superpdfreader/view/DialogViews.kt
View file @
8ad2b48e
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
))
}
}
app/src/main/java/com/base/superpdfreader/view/DocumentDetailDialog.kt
View file @
8ad2b48e
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
app/src/main/res/layout/activity_image_selection.xml
View file @
8ad2b48e
...
...
@@ -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"
...
...
app/src/main/res/layout/item_delete_tip.xml
0 → 100644
View file @
8ad2b48e
<?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>
app/src/main/res/layout/item_edit.xml
0 → 100644
View file @
8ad2b48e
<?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
app/src/main/res/layout/item_image_selected.xml
View file @
8ad2b48e
...
...
@@ -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"
...
...
app/src/main/res/values/styles.xml
0 → 100644
View file @
8ad2b48e
<?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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment