@@ -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()
0 commit comments