package Ġcom . k yle cor ry . trail _ sense . tools . maps . infrastructure Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . pdf . Pdf Renderer Ċ import Ġandroid . net . Uri Ċ import Ġcom . k yle cor ry . trail _ sense . R Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . geo . Coordinate Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . geo . car to graphy . Map Calibration Point Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . math . toDouble Compat Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . math . toFloat Compat Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . pixels . Percent Coordinate Ċ import Ġcom . k yle cor ry . tr ails ense core . infrastructure . persistence . External File Service Ċ import Ġcom . k yle cor ry . tr ails ense core . infrastructure . system . Ui Utils Ċ import Ġcom . k yle cor ry . tr ails ense core . infrastructure . view . View Measurement Utils Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context ĊĊ Ċ object ĠPDF Utils Ġ{ ĊĊĠĠĠ Ġfun Ġas Bitmap ( context : ĠContext , Ġuri : ĠUri , Ġpage : ĠInt Ġ= Ġ 0 ): ĠBitmap ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġcontext . content Resolver . open FileDescriptor ( uri , Ġ" r ") Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrenderer Ġ= ĠPdf Renderer ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Count Ġ= Ġrenderer . page Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page Ġ>= Ġpage Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfd . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpdf Page Ġ= Ġrenderer . open Page ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠView Measurement Utils . dpi ( context ) Ġ/ Ġ 7 2 Ġ* Ġpdf Page . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= ĠView Measurement Utils . dpi ( context ) Ġ/ Ġ 7 2 Ġ* Ġpdf Page . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( width . toInt (), Ġheight . toInt (), ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Color ( Color . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġ 0 f , Ġ 0 f , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Page . render ( bitmap , Ġnull , Ġnull , ĠPdf Renderer . Page . RENDER _ MODE _ FOR _ DISPLAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Page . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfd . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Geo spatial Calibration ( context : ĠContext , Ġuri : ĠUri ): ĠList < Map Calibration Point > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠOnly Ġload Ġthe Ġheading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠExternal File Service ( context ). read ( uri ) Ġ?: Ġreturn @ with Context ĠlistOf < Map Calibration Point >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ/ Type \ s */ Measure \ s */ Subtype \ s */ GEO \ s |. */ G PT S \ s *\ [( .* )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ/ Type \ s */ Viewport \ s |. */ B Box \ s *\ [( .* )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeo Matches Ġ= ĠRegex ("/ G PT S \\ s * \\ [( .* )] "). find ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġviewport Matches Ġ= ĠRegex ("/ B Box \\ s * \\ [( .* )] "). find ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Box Ġ= ĠRegex ("/ Media Box \\ s * \\ [( .* )] "). find ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeo Ġtype Ġ/ Bounds Ġtell Ġwhich Ġpoint Ġmatches Ġwhat Ġ[ left | right Ġtop | bottom ] Ġleft Ġ= Ġ 0 , Ġright Ġ= Ġ 1 , Ġtop Ġ= Ġ 0 , Ġbottom Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geo Matches Ġ!= Ġnull Ġ&& Ġviewport Matches Ġ!= Ġnull Ġ&& Ġmedia Box Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeo Ġ= Ġgeo Matches . group Values [ 1 ]. split (" Ġ"). map NotNull Ġ{ Ġit . toDouble Compat () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Ġ= Ġmedia Box . group Values [ 1 ]. split (" Ġ"). map NotNull Ġ{ Ġit . toFloat Compat () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġviewport Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviewport Matches . group Values [ 1 ]. split (" Ġ"). map NotNull Ġ{ Ġit . toFloat Compat () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( geo . size Ġ== Ġ 8 Ġ&& Ġbox . size Ġ== Ġ 4 Ġ&& Ġviewport . size Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġbox [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġbox [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Left Pct Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPercent Coordinate ( viewport [ 0 ] Ġ/ Ġwidth , Ġ 1 Ġ- Ġviewport [ 1 ] Ġ/ Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Right Pct Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPercent Coordinate ( viewport [ 2 ] Ġ/ Ġwidth , Ġ 1 Ġ- Ġviewport [ 3 ] Ġ/ Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Left Ġ= ĠCoordinate ( geo [ 2 ], Ġgeo [ 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Right Ġ= ĠCoordinate ( geo [ 6 ], Ġgeo [ 7 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap Calibration Point ( top Left , Ġtop Left Pct ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap Calibration Point ( bottom Right , Ġbottom Right Pct ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }