danjdt / android-pdfviewer

A Android PDF Viewer that render pdf using PdfRenderer and displays it in a RecyclerView.
MIT License
154 stars 31 forks source link

java.lang.ClassCastException: dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper cannot be cast to android.app.Activity #11

Closed OndraBasler closed 1 year ago

OndraBasler commented 2 years ago

Hi, I have encountered this issue when I used PdfViewer in fragment annotated @AndroidEntryPoint. It looks like a clash between Hilt and your library. Here is the stack trace and a snippet of my implementation of PdfViewer. I had to fix this issue by using this workaround. Could you fix it in the library?

W/System.err: java.lang.ClassCastException: dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper cannot be cast to android.app.Activity
W/System.err:     at com.danjdt.pdfviewer.PdfViewer.onFileLoaded(PdfViewer.kt:68)
W/System.err:     at com.danjdt.pdfviewer.decoder.LoadFileFromUrlAsyncTask.doInBackground(LoadFileFromUrlAsyncTask.kt:19)
W/System.err:     at com.danjdt.pdfviewer.decoder.LoadFileFromUrlAsyncTask.doInBackground(LoadFileFromUrlAsyncTask.kt:12)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:334)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:246)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err:     at java.lang.Thread.run(Thread.java:784)
PdfViewer.Builder(binding.root)
    .setOnErrorListener(object : OnErrorListener {
        override fun onAttachViewError(e: Exception) {
            handleError(e)
        }
        override fun onFileLoadError(e: Exception) {
            handleError(e)
        }
        override fun onPdfRendererError(e: IOException) {
            handleError(e)
        }
    })
    .build()
    .load(args.url)
KennyGoers commented 2 years ago

You'll have to change the code to not assume that the context is an activity, which is usually isn't. And you'll have to do it on other places too. This library is a great start but needs a fair amount of TLC to make its use broader.