package Ġcom . min dev . min dev _ pdf viewer Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . pdf . Pdf Renderer Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ Ċ @ Target Api ( Build . VERSION _ CODES . LO L LI POP ) Ċ class ĠPdf Core ( private Ġval Ġcontext : ĠContext , Ġpdf File : ĠFile ) Ġ: ĠCor outine Scope Ġby ĠPdf Scope () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġcache Path Ġ= Ġ" pdf _ cache " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpdf Renderer : ĠPdf Renderer ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Cache () ĊĠĠĠĠĠĠĠ Ġopen Pdf File ( pdf File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġpdf Renderer ?. close () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget PDF Page Page () Ġ= Ġpdf Renderer ?. page Count Ġ?: Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġinit Cache () Ġ= Ġwith ( File ( context . cacheDir , Ġcache Path )) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exists ()) Ġdelete Re cursively () ĊĠĠĠĠĠĠĠ Ġmkdir s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bitmap From Cache ( page : ĠInt ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Path Ġ= ĠFile ( File ( context . cacheDir , Ġcache Path ), Ġpage . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! load Path . exists ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode File ( load Path . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġwrite Bitmap To Cache ( page Position : ĠInt , Ġbitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠFile ( File ( context . cacheDir , Ġcache Path ), Ġpage Position . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġcreate New File () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let (:: File OutputStream ) ĊĊĠĠĠĠĠĠĠ Ġwith ( output Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Pdf File ( pdf File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĠParcel FileDescriptor . open ( pdf File , ĠParcel FileDescriptor . MODE _ READ _ ONLY ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġpdf Renderer Ġ= ĠPdf Renderer ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ Ġit . printStackTrace () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Page ( page : ĠInt , Ġready : Ġ(( bitmap : ĠBitmap ?, ĠcurrentPage : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ>= Ġget PDF Page Page ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġbuild Bitmap ( page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this @ Pdf Core ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready ?. invoke ( it , Ġpage ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Bitmap ( no : ĠInt , Ġon Bitmap : Ġ( Bitmap ?) Ġ-> ĠUnit ) Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġget Bitmap From Cache ( no ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Renderer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġit . open Page ( no ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( width Ġ* Ġ 2 , Ġheight Ġ* Ġ 2 , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ?: Ġreturn @ with Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender ( bitmap !! , Ġnull , Ġnull , ĠPdf Renderer . Page . RENDER _ MODE _ FOR _ DISPLAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bitmap To Cache ( no , Ġbitmap !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ }