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
158488da
Commit
158488da
authored
Jun 25, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...提交部分功能...
parent
5be40c4b
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
245 additions
and
50 deletions
+245
-50
build.gradle
app/build.gradle
+5
-1
ImageSelectionActivity.kt
...om/base/superpdfreader/activity/ImageSelectionActivity.kt
+15
-5
ImageToPdfActivity.kt
...va/com/base/superpdfreader/activity/ImageToPdfActivity.kt
+17
-3
PdfBrowserActivity.kt
...va/com/base/superpdfreader/activity/PdfBrowserActivity.kt
+14
-2
PdfConvertedActivity.kt
.../com/base/superpdfreader/activity/PdfConvertedActivity.kt
+40
-5
ImageDragAdapter.kt
.../java/com/base/superpdfreader/adapter/ImageDragAdapter.kt
+4
-2
ImageBean.kt
app/src/main/java/com/base/superpdfreader/bean/ImageBean.kt
+1
-1
PdfParameterBean.kt
...ain/java/com/base/superpdfreader/bean/PdfParameterBean.kt
+29
-0
KotlinExt.kt
app/src/main/java/com/base/superpdfreader/helps/KotlinExt.kt
+0
-24
PdfHelp.kt
...rc/main/java/com/base/superpdfreader/helps/pdf/PdfHelp.kt
+75
-0
DocumentDetailDialog.kt
...java/com/base/superpdfreader/view/DocumentDetailDialog.kt
+10
-1
PDFOperationDialog.kt
...n/java/com/base/superpdfreader/view/PDFOperationDialog.kt
+1
-1
PDFSaveDialog.kt
...c/main/java/com/base/superpdfreader/view/PDFSaveDialog.kt
+3
-1
activity_pdf_browser.xml
app/src/main/res/layout/activity_pdf_browser.xml
+30
-3
libs.versions.toml
gradle/libs.versions.toml
+1
-1
No files found.
app/build.gradle
View file @
158488da
...
...
@@ -15,6 +15,7 @@ android {
versionName
"1.0"
testInstrumentationRunner
"androidx.test.runner.AndroidJUnitRunner"
setProperty
(
"archivesBaseName"
,
"PDF-v${versionName}"
)
}
buildTypes
{
...
...
@@ -61,11 +62,14 @@ dependencies {
//XLS表格
implementation
(
"com.github.huangyanbin:SmartTable:2.2.0"
)
//https://blog.csdn.net/guoxiaolongonly/article/details/76992138
//pdf浏览
//https://github.com/DImuthuUpe/AndroidPdfViewer
implementation
(
"com.github.barteksc:android-pdf-viewer:2.8.2"
)
//pdf文件操作
//pdf文件操作
,AndroidPdfViewer依赖于它
implementation
(
"com.github.barteksc:pdfium-android:1.7.1"
)
//https://github.com/TomRoush/PdfBox-Android
implementation
(
"com.tom-roush:pdfbox-android:2.0.27.0"
)
//apache / poi 内容提取
//有个问题是gradle版本需要升级到8.4
...
...
app/src/main/java/com/base/superpdfreader/activity/ImageSelectionActivity.kt
View file @
158488da
...
...
@@ -24,6 +24,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
private
lateinit
var
imageSelectionAdapter
:
ImageSelectionAdapter
private
lateinit
var
selectedAdapter
:
ImageSelectionAdapter
private
var
add
:
String
=
""
override
val
binding
:
ActivityImageSelectionBinding
by
lazy
{
ActivityImageSelectionBinding
.
inflate
(
layoutInflater
)
...
...
@@ -32,7 +33,7 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
add
=
intent
.
extras
?.
getString
(
"Add"
,
""
)
?:
""
imageSelectionAdapter
=
ImageSelectionAdapter
(
UI_IMAGE_GRID
,
select
=
{
imageBean
->
imageSelectAction
(
imageBean
)
...
...
@@ -79,12 +80,21 @@ class ImageSelectionActivity : BaseActivity<ActivityImageSelectionBinding>() {
finishToMain
()
}
binding
.
tvImport
.
setOnClickListener
{
if
(
add
==
""
)
{
startActivity
(
Intent
(
this
@ImageSelectionActivity
,
ImageToPdfActivity
::
class
.
java
)
.
apply
{
val
pathList
=
selectedAdapter
.
getSelectBean
().
map
{
it
.
path
}
putExtra
(
"PathList"
,
pathList
.
toTypedArray
())
}
)
}
else
{
setResult
(
0
,
Intent
().
apply
{
val
pathList
=
selectedAdapter
.
getSelectBean
().
map
{
it
.
path
}
putExtra
(
"PathList"
,
pathList
.
toTypedArray
())
})
finish
()
}
}
}
...
...
app/src/main/java/com/base/superpdfreader/activity/ImageToPdfActivity.kt
View file @
158488da
package
com.base.superpdfreader.activity
import
android.content.Intent
import
android.graphics.Color
import
androidx.activity.addCallback
import
com.base.superpdfreader.adapter.ImageDragAdapter
...
...
@@ -41,11 +42,24 @@ class ImageToPdfActivity : BaseActivity<ActivityImageDragBinding>() {
finish
()
}
binding
.
ivAdd
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
val
intent
=
Intent
(
this
,
ImageSelectionActivity
::
class
.
java
).
apply
{
putExtra
(
"Add"
,
"Add"
)
}
launcher
.
launch
(
intent
)
{
result
->
val
array
=
result
.
data
?.
getStringArrayExtra
(
"PathList"
)
?:
arrayOf
()
val
dataList
=
arrayListOf
<
ImageBean
>().
apply
{
addAll
(
array
.
map
{
ImageBean
(
it
)
})
}
imageDragAdapter
.
setData
(
dataList
,
false
)
}
}
binding
.
tvConvert
.
setOnClickListener
{
showPDFSaveDialog
{
showPDFSaveDialog
{
pdfParameterBean
->
startActivity
(
Intent
(
this
,
PdfConvertedActivity
::
class
.
java
).
apply
{
pdfParameterBean
.
pathArray
=
pathList
.
map
{
it
.
path
}.
toTypedArray
()
putExtra
(
"Parameter"
,
Gson
().
toJson
(
pdfParameterBean
))
})
finish
()
}
}
}
...
...
app/src/main/java/com/base/superpdfreader/activity/PdfBrowserActivity.kt
View file @
158488da
...
...
@@ -4,12 +4,15 @@ import android.animation.Animator
import
android.animation.AnimatorListenerAdapter
import
android.animation.ValueAnimator
import
android.annotation.SuppressLint
import
android.graphics.Color
import
android.view.View
import
androidx.activity.addCallback
import
androidx.core.animation.addListener
import
androidx.lifecycle.lifecycleScope
import
com.base.superpdfreader.databinding.ActivityPdfBrowserBinding
import
com.base.superpdfreader.helps.BaseActivity
import
com.base.superpdfreader.helps.LogEx
import
com.base.superpdfreader.utils.BarUtils
import
com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Job
...
...
@@ -28,10 +31,11 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
ActivityPdfBrowserBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
val
path
=
intent
.
extras
?.
getString
(
"Path"
)
?:
""
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
val
path
=
intent
.
extras
?.
getString
(
"Path"
)
?:
""
val
file
=
File
(
path
)
if
(
file
.
exists
())
{
binding
.
pdfview
.
fromFile
(
file
)
...
...
@@ -49,6 +53,14 @@ class PdfBrowserActivity : BaseActivity<ActivityPdfBrowserBinding>() {
binding
.
pdfview
.
setOnClickListener
{
toggleTools
()
}
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
onBackPressedDispatcher
.
addCallback
{
finishToMain
()
}
}
...
...
app/src/main/java/com/base/superpdfreader/activity/PdfConvertedActivity.kt
View file @
158488da
package
com.base.superpdfreader.activity
import
android.os.Bundle
import
androidx.activity.enableEdgeToEdge
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.ViewCompat
import
androidx.core.view.WindowInsetsCompat
import
android.content.Intent
import
android.os.Environment
import
android.util.Log
import
androidx.lifecycle.lifecycleScope
import
com.base.superpdfreader.R
import
com.base.superpdfreader.bean.PdfParameterBean
import
com.base.superpdfreader.databinding.ActivityPdfConvertedBinding
import
com.base.superpdfreader.helps.BaseActivity
import
com.base.superpdfreader.helps.LogEx
import
com.base.superpdfreader.helps.pdf.PdfHelp.convertImagesToPdf
import
com.google.gson.Gson
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
java.io.File
class
PdfConvertedActivity
:
BaseActivity
<
ActivityPdfConvertedBinding
>()
{
private
val
TAG
=
"PdfConvertedActivity"
override
val
binding
:
ActivityPdfConvertedBinding
by
lazy
{
ActivityPdfConvertedBinding
.
inflate
(
layoutInflater
)
}
private
var
pdfParameterBean
:
PdfParameterBean
?
=
null
override
fun
initView
()
{
val
json
=
intent
.
extras
?.
getString
(
"Parameter"
)
?:
""
pdfParameterBean
=
Gson
().
fromJson
(
json
,
PdfParameterBean
::
class
.
java
)
LogEx
.
logDebug
(
TAG
,
"pdfParameterBean=$pdfParameterBean"
)
convertPdf
()
}
fun
convertPdf
()
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
var
path
=
""
pdfParameterBean
?.
let
{
val
document
=
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOCUMENTS
)
val
appName
=
resources
.
getString
(
R
.
string
.
app_name
)
val
dir
=
File
(
document
,
appName
)
if
(!
dir
.
exists
())
{
dir
.
mkdirs
()
}
val
pdfPath
=
File
(
dir
,
it
.
pdfName
+
".pdf"
)
path
=
pdfPath
.
absolutePath
convertImagesToPdf
(
it
,
path
)
}
launch
(
Dispatchers
.
Main
)
{
startActivity
(
Intent
(
this
@PdfConvertedActivity
,
PdfBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"Path"
,
path
)
})
finish
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/superpdfreader/adapter/ImageDragAdapter.kt
View file @
158488da
...
...
@@ -32,8 +32,10 @@ class ImageDragAdapter : RecyclerView.Adapter<ImageDragAdapter.AAA>() {
Glide
.
with
(
context
).
load
(
bean
.
path
).
centerCrop
().
into
(
binding
.
iv
)
}
fun
setData
(
data
:
List
<
ImageBean
>)
{
fun
setData
(
data
:
List
<
ImageBean
>,
isClean
:
Boolean
=
true
)
{
if
(
isClean
)
{
beanList
.
clear
()
}
beanList
.
addAll
(
data
)
notifyDataSetChanged
()
}
...
...
app/src/main/java/com/base/superpdfreader/bean/ImageBean.kt
View file @
158488da
package
com.base.superpdfreader.bean
data class
ImageBean
(
val
path
:
String
?
=
null
val
path
:
String
=
""
)
{
var
isCamera
:
Boolean
=
false
var
isSelect
:
Boolean
=
false
...
...
app/src/main/java/com/base/superpdfreader/bean/PdfParameterBean.kt
View file @
158488da
package
com.base.superpdfreader.bean
data class
PdfParameterBean
(
var
pdfName
:
String
=
""
,
var
orientation
:
Int
=
0
,
var
pageSize
:
Int
=
1
,
var
margin
:
Int
=
0
,
var
compression
:
Int
=
0
,
var
pathArray
:
Array
<
String
>
=
arrayOf
(),
var
password
:
String
?
=
null
)
{
companion
object
{
val
arrayOrientation
=
arrayOf
(
"Portrait"
,
"Landscape"
)
val
arrayPageSize
=
arrayOf
(
"Fit(Sample page size as image)"
,
"A4 (297x210 mm)"
,
"Use Letter(215x279.4 mm)"
)
val
arrayMargin
=
arrayOf
(
"No margin"
,
"Small"
,
"Big"
)
val
arrayCompression
=
arrayOf
(
"Low"
,
"Medium"
,
"High"
)
}
override
fun
equals
(
other
:
Any
?):
Boolean
{
if
(
this
===
other
)
return
true
if
(
javaClass
!=
other
?.
javaClass
)
return
false
other
as
PdfParameterBean
if
(
orientation
!=
other
.
orientation
)
return
false
if
(
pageSize
!=
other
.
pageSize
)
return
false
if
(
margin
!=
other
.
margin
)
return
false
if
(
compression
!=
other
.
compression
)
return
false
if
(!
pathArray
.
contentEquals
(
other
.
pathArray
))
return
false
if
(
password
!=
other
.
password
)
return
false
return
true
}
override
fun
hashCode
():
Int
{
var
result
=
orientation
result
=
31
*
result
+
pageSize
result
=
31
*
result
+
margin
result
=
31
*
result
+
compression
result
=
31
*
result
+
pathArray
.
contentHashCode
()
result
=
31
*
result
+
(
password
?.
hashCode
()
?:
0
)
return
result
}
}
app/src/main/java/com/base/superpdfreader/helps/KotlinExt.kt
View file @
158488da
...
...
@@ -7,30 +7,6 @@ import java.util.Locale
object
KotlinExt
{
private
val
aesMap
=
mutableMapOf
<
Int
,
String
>()
fun
View
.
setTrackedOnClickListener
(
action
:
(
view
:
View
)
->
Unit
)
{
setOnClickListener
{
action
(
this
)
var
view
:
View
?
=
this
while
(
view
!=
null
)
{
try
{
val
obj
=
JSONObject
()
obj
.
put
(
"view_id"
,
resources
.
getResourceEntryName
(
view
.
id
))
// EventHelper.event("click_id", ext = obj)
break
}
catch
(
_
:
Exception
)
{
view
=
view
.
parent
as
?
View
}
}
}
}
fun
Number
.
toFormatSize
(
count
:
Int
=
1
):
String
{
var
suffix
=
"B"
var
fSize
=
this
.
toDouble
()
...
...
app/src/main/java/com/base/superpdfreader/helps/pdf/PdfHelp.kt
0 → 100644
View file @
158488da
package
com.base.superpdfreader.helps.pdf
import
com.base.superpdfreader.bean.PdfParameterBean
import
com.base.superpdfreader.helps.LogEx
import
com.tom_roush.pdfbox.pdmodel.PDDocument
import
com.tom_roush.pdfbox.pdmodel.PDPage
import
com.tom_roush.pdfbox.pdmodel.PDPageContentStream
import
com.tom_roush.pdfbox.pdmodel.common.PDRectangle
import
com.tom_roush.pdfbox.pdmodel.graphics.image.PDImageXObject
import
java.io.File
import
java.io.IOException
object
PdfHelp
{
private
val
TAG
=
"PdfHelp"
fun
convertImagesToPdf
(
imagePath
:
PdfParameterBean
,
pdfPath
:
String
)
{
try
{
PDDocument
().
use
{
document
->
imagePath
.
pathArray
.
forEach
{
imagePath
->
val
page
=
PDPage
(
PDRectangle
.
A4
)
// 创建一个 A4 大小的页面
document
.
addPage
(
page
)
val
pdImage
=
PDImageXObject
.
createFromFileByExtension
(
File
(
imagePath
),
document
)
val
pageSize
=
page
.
mediaBox
var
x
=
0f
var
y
=
0f
var
scaledWidth
=
0f
var
scaledHeight
=
0f
var
needScale
=
false
if
(
pdImage
.
width
>
pageSize
.
width
||
pdImage
.
height
>
pageSize
.
height
)
{
// val scaleX = PDRectangle.A4.width / imageWidth
// val scaleY = PDRectangle.A4.height / imageHeight
needScale
=
true
val
scaleX
=
pageSize
.
width
/
pdImage
.
width
val
scaleY
=
pageSize
.
height
/
pdImage
.
height
val
scale
=
minOf
(
scaleX
,
scaleY
)
scaledWidth
=
pdImage
.
width
*
scale
scaledHeight
=
pdImage
.
height
*
scale
LogEx
.
logDebug
(
TAG
,
"======================scale=$scale================="
)
x
=
(
pageSize
.
width
-
scaledWidth
)
/
2f
y
=
(
pageSize
.
height
-
scaledHeight
)
/
2f
}
else
{
x
=
(
pageSize
.
width
-
pdImage
.
width
)
/
2f
y
=
(
pageSize
.
height
-
pdImage
.
height
)
/
2f
}
LogEx
.
logDebug
(
TAG
,
"x=$x y=$y"
)
LogEx
.
logDebug
(
TAG
,
"pageSize.width=${pageSize.width}"
)
LogEx
.
logDebug
(
TAG
,
"pageSize.height=${pageSize.height}"
)
LogEx
.
logDebug
(
TAG
,
"pdImage.width=${pdImage.width}"
)
LogEx
.
logDebug
(
TAG
,
"pdImage.height=${pdImage.height}"
)
LogEx
.
logDebug
(
TAG
,
"scaledWidth=${scaledWidth}"
)
LogEx
.
logDebug
(
TAG
,
"scaledHeight=${scaledHeight}"
)
PDPageContentStream
(
document
,
page
).
use
{
contentStream
->
if
(
needScale
)
{
contentStream
.
drawImage
(
pdImage
,
x
,
y
,
scaledWidth
,
scaledHeight
)
}
else
{
contentStream
.
drawImage
(
pdImage
,
x
,
y
)
}
}
}
document
.
save
(
pdfPath
)
// 保存 PDF
}
}
catch
(
e
:
IOException
)
{
e
.
printStackTrace
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/superpdfreader/view/DocumentDetailDialog.kt
View file @
158488da
...
...
@@ -6,6 +6,7 @@ import android.content.Context
import
android.content.Intent
import
android.net.Uri
import
android.view.LayoutInflater
import
android.widget.Toast
import
com.base.superpdfreader.R
import
com.base.superpdfreader.activity.DocBrowserActivity
import
com.base.superpdfreader.activity.PdfBrowserActivity
...
...
@@ -103,13 +104,21 @@ object DocumentDetailDialog {
binding
.
llEmail
.
setOnClickListener
{
dialog
.
dismiss
()
val
emailIntent
=
Intent
(
Intent
.
ACTION_SEND
).
apply
{
setType
(
"plain/text"
);
// 附加文件
putExtra
(
Intent
.
EXTRA_STREAM
,
bean
.
uri
)
addFlags
(
Intent
.
FLAG_GRANT_READ_URI_PERMISSION
)
}
val
chooser
:
Intent
=
Intent
.
createChooser
(
emailIntent
,
"select email app"
)
// 检查是否有可以处理此Intent的应用
if
(
emailIntent
.
resolveActivity
(
packageManager
)
!=
null
)
{
startActivity
(
emailIntent
)
startActivity
(
chooser
)
}
else
{
Toast
.
makeText
(
this
,
"No mail application found"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
binding
.
llCopy
.
setOnClickListener
{
...
...
app/src/main/java/com/base/superpdfreader/view/PDFOperationDialog.kt
View file @
158488da
...
...
@@ -17,7 +17,7 @@ object PDFOperationDialog {
binding
.
llImagePdf
.
setOnClickListener
{
startActivity
(
Intent
(
this
,
ImageSelectionActivity
::
class
.
java
))
dialog
.
show
()
dialog
.
dismiss
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/superpdfreader/view/PDFSaveDialog.kt
View file @
158488da
...
...
@@ -28,11 +28,13 @@ object PDFSaveDialog {
dialog
.
setCanceledOnTouchOutside
(
true
)
dialog
.
show
()
val
pdfParameterBean
=
PdfParameterBean
()
val
appName
=
resources
.
getString
(
R
.
string
.
app_name
)
val
pdfName
=
appName
+
" "
+
SimpleDateFormat
(
"yyyyMMdd HH.mm.ss"
).
format
(
System
.
currentTimeMillis
())
binding
.
editName
.
setText
(
pdfName
)
pdfParameterBean
.
pdfName
=
pdfName
val
pdfParameterBean
=
PdfParameterBean
()
binding
.
tvOrientation
.
text
=
arrayOrientation
[
0
]
binding
.
tvPageSize
.
text
=
arrayPageSize
[
1
]
binding
.
tvMargin
.
text
=
arrayMargin
[
0
]
...
...
app/src/main/res/layout/activity_pdf_browser.xml
View file @
158488da
...
...
@@ -7,20 +7,47 @@
android:layout_height=
"match_parent"
tools:context=
".activity.PdfBrowserActivity"
>
<View
android:id=
"@+id/v_top"
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
app:layout_constraintTop_toTopOf=
"parent"
/>
<com.github.barteksc.pdfviewer.PDFView
android:id=
"@+id/pdfview"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
android:layout_height=
"0dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/v_top"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id=
"@+id/ll_tools"
android:visibility=
"gone"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/white"
android:visibility=
"gone"
app:layout_constraintTop_toTopOf=
"@id/pdfview"
>
<FrameLayout
android:id=
"@+id/fl_back"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"10dp"
android:padding=
"10dp"
android:src=
"@mipmap/fanhui"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
tools:ignore=
"ContentDescription"
/>
</FrameLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"match_parent"
...
...
gradle/libs.versions.toml
View file @
158488da
[versions]
agp
=
"8.3.1"
kotlin
=
"1.8.0"
coreKtx
=
"1.8.
1
"
coreKtx
=
"1.8.
0
"
junit
=
"4.13.2"
junitVersion
=
"1.1.5"
espressoCore
=
"3.5.1"
...
...
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