package Ġit . se phi ro th . android . app . app unt i . utils Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . media . Thumbnail Utils Ċ import Ġandroid . provider . Media Store Ċ import Ġcom . sh ock wave . pdf ium . Pdf ium Core Ċ import Ġcom . squareup . pic asso .* Ċ import Ġcom . squareup . pic asso . Pic asso . Loaded From Ċ import Ġit . se phi ro th . android . app . app unt i . Build Config Ċ import Ġit . se phi ro th . android . library . kotlin _ extensions . net . resolve MimeType FromFile Part Ċ import Ġsha 1 Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException ĊĊ Ċ object ĠPic asso Utils Ġ{ ĊĊĠĠĠ Ġclass ĠVideo RequestHandler Ġ: ĠRequest Handler () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠS CHE ME _ VIDEO Ġ= Ġ" video " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Handle Request ( data : ĠRequest ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" can Handle Request ( uri =${ data . uri }, Ġscheme =${ data . uri . scheme }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscheme Ġ= Ġdata . uri . scheme ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS CHE ME _ VIDEO Ġ== Ġscheme Ġ|| Ġdata . uri . resolve MimeType FromFile Part () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . startsWith (" video /", Ġtrue ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( data : ĠRequest , Ġpolicy : ĠInt ): ĠRequest Handler . Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" load (${ data . uri }, Ġ$ policy ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbm Ġ= Ġdata . uri . path ?. let Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThumb nail Utils . create Video Thumbnail ( path , ĠMedia Store . Images . Thumb nails . MIN I _ KIND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIOException (" Cannot Ġcreate Ġvideo Ġthumbnail ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequest Handler . Result ( bm , ĠLoaded From . NETWORK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPDF RequestHandler ( private Ġval Ġcontext : ĠContext ) Ġ: ĠRequest Handler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpdf ium Core : ĠPdf ium Core Ġ= ĠPdf ium Core ( context ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcache : ĠDisk L ru Image Cache Ġ= ĠDisk L ru Image Cache . get ( context ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" PDF RequestHandler () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Handle Request ( data : ĠRequest ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" can Handle Request ( uri =${ data . uri }, Ġscheme =${ data . uri . scheme }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . uri . resolve MimeType FromFile Part ()?. startsWith ( MIME _ TYPE , Ġtrue ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload ( request : ĠRequest , Ġnetwork Policy : ĠInt ): ĠResult ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" load (${ request . uri }, Ġ$ network Policy ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Key Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . uri . toString (). sha 1 (). toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} -${ request . target Width }-${ request . target Height }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Network Policy . should Read From Disk Cache ( network Policy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . get ( cacheKey )?. let Ġ{ Ġbmp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequest Handler . Result ( bmp , ĠLoaded From . DISK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġcontext . content Resolver . open FileDescriptor ( request . uri , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpdf Document Ġ= Ġpdf ium Core . new Document ( fd ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf ium Core . open Page ( pdf Document , ĠPAGE _ NUMBER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġpdf ium Core . getPage Width Point ( pdf Document , ĠPAGE _ NUMBER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġpdf ium Core . getPage Height Point ( pdf Document , ĠPAGE _ NUMBER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" pdf Ġsize =$ width ,$ height ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . target Width Ġ> Ġ 0 Ġ&& Ġrequest . target Height Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġrequest . target Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġrequest . target Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf ium Core . render Page Bitmap ( pdf Document , Ġbmp , ĠPAGE _ NUMBER , Ġ 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" bitmap Ġsize : Ġ${ bmp . width } Ġx Ġ${ bmp . height }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbmp ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Network Policy . should WriteTo Disk Cache ( network Policy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( cacheKey , Ġbmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequest Handler . Result ( bmp , ĠLoaded From . NETWORK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf ium Core . close Document ( pdf Document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPAGE _ NUMBER Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIME _ TYPE Ġ= Ġ" application / pdf " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget ( context : ĠContext ): ĠPic asso Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġpic asso Instance ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi 2 Ġ= Ġpic asso Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdown loader Ġ= ĠOk Http 3 Downloader ( context , ĠInteger . MAX _ VALUE . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreated Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . Builder ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. downloader ( downloader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add RequestHandler ( Video RequestHandler ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add RequestHandler ( PDF RequestHandler ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. logging Enabled ( Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. indicators Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . set Singleton Instance ( created ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpic asso Instance Ġ= Ġcreated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPic asso . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Static Field Leak ") ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġpic asso Instance : ĠPic asso ? Ġ= Ġnull Ċ } Ċ