Skip to content

Commit fc34de0

Browse files
committed
Add PdfSource and RenderQuality
1 parent a2f11aa commit fc34de0

File tree

9 files changed

+132
-359
lines changed

9 files changed

+132
-359
lines changed

app/src/main/java/com/rajat/sample/pdfviewer/ComposeActivity.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ import androidx.compose.material3.Surface
1919
import androidx.compose.material3.Text
2020
import androidx.compose.runtime.Composable
2121
import androidx.compose.runtime.mutableStateOf
22-
import androidx.compose.runtime.remember
2322
import androidx.compose.runtime.saveable.rememberSaveable
2423
import androidx.compose.ui.Modifier
2524
import androidx.compose.ui.platform.LocalLifecycleOwner
2625
import androidx.compose.ui.tooling.preview.Preview
2726
import androidx.compose.ui.unit.dp
2827
import com.rajat.pdfviewer.PdfRendererView
29-
import com.rajat.pdfviewer.compose.PdfRendererViewCompose
28+
import com.rajat.pdfviewer.PdfSource
29+
import com.rajat.pdfviewer.compose.Pdf
3030
import com.rajat.sample.pdfviewer.ui.theme.AndroidpdfviewerTheme
3131
import java.io.File
3232

@@ -103,7 +103,7 @@ fun MyPdfScreenFromUri(uri: Uri, modifier: Modifier = Modifier) {
103103
val lifecycleOwner = LocalLifecycleOwner.current
104104
PdfRendererViewCompose(
105105
modifier = modifier,
106-
uri = uri,
106+
source = PdfSource.FromUri(uri),
107107
lifecycleOwner = lifecycleOwner,
108108
statusCallBack = object : PdfRendererView.StatusCallBack {
109109
override fun onPdfLoadStart() {
@@ -138,7 +138,7 @@ fun MyPdfScreenFromUrl(url: String, modifier: Modifier = Modifier) {
138138
val lifecycleOwner = LocalLifecycleOwner.current
139139
PdfRendererViewCompose(
140140
modifier = modifier,
141-
url = url,
141+
source = PdfSource.FromUrl(url),
142142
lifecycleOwner = lifecycleOwner,
143143
statusCallBack = object : PdfRendererView.StatusCallBack {
144144
override fun onPdfLoadStart() {
@@ -174,7 +174,7 @@ fun MyPdfScreenFromFile() {
174174
val lifecycleOwner = LocalLifecycleOwner.current
175175
val pdfFile = File("path/to/your/file.pdf") // Replace with your file path
176176
PdfRendererViewCompose(
177-
file = pdfFile,
177+
source = PdfSource.FromFile(pdfFile),
178178
lifecycleOwner = lifecycleOwner
179179
)
180180
}

app/src/main/java/com/rajat/sample/pdfviewer/MainActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts
77
import androidx.appcompat.app.AppCompatActivity
88
import androidx.lifecycle.lifecycleScope
99
import com.rajat.pdfviewer.PdfRendererView
10+
import com.rajat.pdfviewer.PdfSource
1011
import com.rajat.pdfviewer.PdfViewerActivity
1112
import com.rajat.pdfviewer.util.saveTo
1213
import com.rajat.sample.pdfviewer.databinding.ActivityMainBinding
@@ -96,8 +97,8 @@ class MainActivity : AppCompatActivity() {
9697
//Page change. Not require
9798
}
9899
}
99-
binding.pdfView.initWithUrl(
100-
url = download_file_url2,
100+
binding.pdfView.init(
101+
source = PdfSource.FromUrl(download_file_url2),
101102
lifecycleCoroutineScope = lifecycleScope,
102103
lifecycle = lifecycle
103104
)

pdfViewer/src/main/java/com/rajat/pdfviewer/PdfRendererView.kt

Lines changed: 70 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,15 @@ class PdfRendererView @JvmOverloads constructor(
4848
private var runnable = Runnable {}
4949
private var enableLoadingForPages: Boolean = false
5050
private var pdfRendererCoreInitialised = false
51-
private var pageMargin: Rect = Rect(0,0,0,0)
51+
private var pageMargin: Rect = Rect(0, 0, 0, 0)
5252
var statusListener: StatusCallBack? = null
5353
private var positionToUseForState: Int = 0
5454
private var restoredScrollPosition: Int = NO_POSITION
5555
private var disableScreenshots: Boolean = false
5656
private var postInitializationAction: (() -> Unit)? = null
57+
var pdfSource: PdfSource? = null
58+
private set
59+
var renderQuality: RenderQuality = RenderQuality.LOW
5760

5861
val totalPageCount: Int
5962
get() {
@@ -73,28 +76,51 @@ class PdfRendererView @JvmOverloads constructor(
7376
fun onPageChanged(currentPage: Int, totalPage: Int) {}
7477
}
7578

76-
fun initWithUrl(
79+
fun init(
80+
source: PdfSource, headers: HeaderData = HeaderData(),
81+
lifecycleCoroutineScope: LifecycleCoroutineScope,
82+
lifecycle: Lifecycle
83+
) {
84+
pdfSource = source
85+
when (source) {
86+
is PdfSource.FromFile -> initWithFile(source.file)
87+
is PdfSource.FromUri -> initWithUri(source.uri)
88+
is PdfSource.FromUrl -> {
89+
initWithUrl(
90+
url = source.url,
91+
headers = headers,
92+
lifecycleCoroutineScope = lifecycleCoroutineScope,
93+
lifecycle = lifecycle,
94+
)
95+
}
96+
}
97+
}
98+
99+
private fun initWithUrl(
77100
url: String,
78101
headers: HeaderData = HeaderData(),
79102
lifecycleCoroutineScope: LifecycleCoroutineScope,
80103
lifecycle: Lifecycle
81104
) {
82105
lifecycle.addObserver(this) // Register as LifecycleObserver
83-
PdfDownloader(lifecycleCoroutineScope,headers,url, object : PdfDownloader.StatusListener {
106+
PdfDownloader(lifecycleCoroutineScope, headers, url, object : PdfDownloader.StatusListener {
84107
override fun getContext(): Context = context
85108
override fun onDownloadStart() {
86109
statusListener?.onPdfLoadStart()
87110
}
111+
88112
override fun onDownloadProgress(currentBytes: Long, totalBytes: Long) {
89113
var progress = (currentBytes.toFloat() / totalBytes.toFloat() * 100F).toInt()
90114
if (progress >= 100)
91115
progress = 100
92116
statusListener?.onPdfLoadProgress(progress, currentBytes, totalBytes)
93117
}
118+
94119
override fun onDownloadSuccess(absolutePath: String) {
95120
initWithFile(File(absolutePath))
96121
statusListener?.onPdfLoadSuccess(absolutePath)
97122
}
123+
98124
override fun onError(error: Throwable) {
99125
error.printStackTrace()
100126
statusListener?.onError(error)
@@ -103,7 +129,8 @@ class PdfRendererView @JvmOverloads constructor(
103129
}
104130

105131
fun initWithFile(file: File) {
106-
init(file)
132+
val fileDescriptor = PdfRendererCore.getFileDescriptor(file)
133+
init(fileDescriptor)
107134
}
108135

109136
@Throws(FileNotFoundException::class)
@@ -126,7 +153,7 @@ class PdfRendererView @JvmOverloads constructor(
126153
var savedState = state
127154
if (savedState is Bundle) {
128155
val superState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
129-
savedState.getParcelable("superState",Parcelable::class.java)
156+
savedState.getParcelable("superState", Parcelable::class.java)
130157
} else {
131158
savedState.getParcelable("superState")
132159
}
@@ -137,16 +164,17 @@ class PdfRendererView @JvmOverloads constructor(
137164
}
138165
}
139166

140-
private fun init(file: File) {
141-
val fileDescriptor = PdfRendererCore.getFileDescriptor(file)
142-
init(fileDescriptor)
143-
}
144-
145167
private fun init(fileDescriptor: ParcelFileDescriptor) {
146168
// Proceed with safeFile
147169
pdfRendererCore = PdfRendererCore(context, fileDescriptor)
148170
pdfRendererCoreInitialised = true
149-
pdfViewAdapter = PdfViewAdapter(context,pdfRendererCore, pageMargin, enableLoadingForPages)
171+
pdfViewAdapter = PdfViewAdapter(
172+
context = context,
173+
renderer = pdfRendererCore,
174+
pageSpacing = pageMargin,
175+
enableLoadingForPages = enableLoadingForPages,
176+
renderQuality = renderQuality
177+
)
150178
val v = LayoutInflater.from(context).inflate(R.layout.pdf_rendererview, this, false)
151179
addView(v)
152180
recyclerView = findViewById(R.id.recyclerView)
@@ -191,7 +219,8 @@ class PdfRendererView @JvmOverloads constructor(
191219
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
192220

193221
val firstVisiblePosition = layoutManager.findFirstVisibleItemPosition()
194-
val firstCompletelyVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition()
222+
val firstCompletelyVisiblePosition =
223+
layoutManager.findFirstCompletelyVisibleItemPosition()
195224
val isPositionChanged = firstVisiblePosition != lastFirstVisiblePosition ||
196225
firstCompletelyVisiblePosition != lastCompletelyVisiblePosition
197226
if (isPositionChanged) {
@@ -204,14 +233,15 @@ class PdfRendererView @JvmOverloads constructor(
204233
updatePageNumberDisplay(positionToUse)
205234
lastFirstVisiblePosition = firstVisiblePosition
206235
lastCompletelyVisiblePosition = firstCompletelyVisiblePosition
207-
}else{
236+
} else {
208237
positionToUseForState = firstVisiblePosition
209238
}
210239
}
211240

212241
private fun updatePageNumberDisplay(position: Int) {
213242
if (position != NO_POSITION) {
214-
pageNo.text = context.getString(R.string.pdfView_page_no, position + 1, totalPageCount)
243+
pageNo.text =
244+
context.getString(R.string.pdfView_page_no, position + 1, totalPageCount)
215245
pageNo.visibility = View.VISIBLE
216246
if (position == 0) {
217247
pageNo.postDelayed({ pageNo.visibility = View.GONE }, 3000)
@@ -257,24 +287,43 @@ class PdfRendererView @JvmOverloads constructor(
257287
engine = PdfEngine.values().first { it.value == engineValue }
258288
showDivider = typedArray.getBoolean(R.styleable.PdfRendererView_pdfView_showDivider, true)
259289
divider = typedArray.getDrawable(R.styleable.PdfRendererView_pdfView_divider)
260-
enableLoadingForPages = typedArray.getBoolean(R.styleable.PdfRendererView_pdfView_enableLoadingForPages, enableLoadingForPages)
261-
val marginDim = typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_margin, 0)
290+
enableLoadingForPages = typedArray.getBoolean(
291+
R.styleable.PdfRendererView_pdfView_enableLoadingForPages,
292+
enableLoadingForPages
293+
)
294+
val marginDim =
295+
typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_margin, 0)
262296
pageMargin = Rect(marginDim, marginDim, marginDim, marginDim).apply {
263-
top = typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_marginTop, top)
264-
left = typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_marginLeft, left)
265-
right = typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_marginRight, right)
266-
bottom = typedArray.getDimensionPixelSize(R.styleable.PdfRendererView_pdfView_page_marginBottom, bottom)
297+
top = typedArray.getDimensionPixelSize(
298+
R.styleable.PdfRendererView_pdfView_page_marginTop,
299+
top
300+
)
301+
left = typedArray.getDimensionPixelSize(
302+
R.styleable.PdfRendererView_pdfView_page_marginLeft,
303+
left
304+
)
305+
right = typedArray.getDimensionPixelSize(
306+
R.styleable.PdfRendererView_pdfView_page_marginRight,
307+
right
308+
)
309+
bottom = typedArray.getDimensionPixelSize(
310+
R.styleable.PdfRendererView_pdfView_page_marginBottom,
311+
bottom
312+
)
267313
}
268-
disableScreenshots = typedArray.getBoolean(R.styleable.PdfRendererView_pdfView_disableScreenshots, false)
314+
disableScreenshots =
315+
typedArray.getBoolean(R.styleable.PdfRendererView_pdfView_disableScreenshots, false)
269316
applyScreenshotSecurity()
270317
typedArray.recycle()
271318
}
319+
272320
private fun applyScreenshotSecurity() {
273321
if (disableScreenshots) {
274322
// Disables taking screenshots and screen recording
275323
(context as? Activity)?.window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
276324
}
277325
}
326+
278327
fun closePdfRender() {
279328
if (pdfRendererCoreInitialised) {
280329
pdfRendererCore.closePdfRender()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.rajat.pdfviewer
2+
3+
import android.net.Uri
4+
import java.io.File
5+
6+
sealed class PdfSource {
7+
data class FromUrl(val url: String): PdfSource()
8+
data class FromFile(val file: File): PdfSource()
9+
data class FromUri(val uri: Uri): PdfSource()
10+
}

0 commit comments

Comments
 (0)