package Ġref resco . street names čĊč Ċ import Ġandroid . app . Activity č Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . content . SharedPreferences č Ċ import Ġandroid . graphics .* č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . preference . Preference Manager č Ċ import Ġandroid . util . Log č Ċ import Ġandroid . widget . TextView č Ċ import Ġkotlinx . android . synt hetic . main . activity _ view _ map .* č Ċ import Ġkotlinx . coroutines . experimental . Dispatch ers č Ċ import Ġkotlinx . coroutines . experimental . async č Ċ import Ġref resco . street names . geo . Feature č Ċ import Ġjava . io . File č Ċ import Ġjava . io . Object InputStream č Ċ import Ġandroid . util . Attribute Set č Ċ import Ġandroid . view . View č Ċ import Ġandroid . widget . LinearLayout č Ċ import Ġkotlin . math . cos č Ċ import Ġkotlin . math . max č Ċ import Ġkotlin . math . min č Ċ import Ġref resco . street names . geo . Street Collection čĊčĊč Ċ class ĠView Map Activity Ġ: ĠActivity () Ġ{ čĊčĊĠĠĠ Ġprivate Ġvar Ġstreet Collection : ĠStreet Collection ? Ġ= Ġnull čĊĠĠĠ Ġfun Ġget Street Collection (): ĠStreet Collection Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġstreet Collection !! čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ view _ map ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġshared Pref : ĠSharedPreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) čĊĠĠĠĠĠĠĠ Ġval Ġcurrent Region Pref : ĠString Ġ= Ġshared Pref . getString ( SETTINGS _ KEY _ PRE F _ CURRENT _ REGION , Ġ"") čĊčĊčĊĠĠĠĠĠĠĠ Ġval ĠtextView Status : ĠTextView Ġ= ĠfindViewById < TextView >( R . id . textView Status ) čĊčĊčĊĠĠĠĠĠĠĠ ĠtextView Status . setText (" Activity Ġloaded ") čĊčĊĠĠĠĠĠĠĠ Ġ/* čĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= ĠfindViewById < LinearLayout >( R . id . linear Layout ) čĊĠĠĠĠĠĠĠ Ġval Ġcan v ass Ġ= ĠCan v ass ( this ) čĊĠĠĠĠĠĠĠ Ġlayout . addView ( can v ass ) č Ċ */ čĊčĊĠĠĠĠĠĠĠ Ġopen Region ( current Region Pref ) čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġdata Ġclass ĠInt Pair ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) čĊĠĠĠ Ġfun Ġscreen Size (): ĠInt Pair Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġwindow Manager . default Display čĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠPoint () čĊĠĠĠĠĠĠĠ Ġdisplay . getSize ( size ) čĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġsize . x čĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġsize . y čĊĠĠĠĠĠĠĠ Ġreturn ĠInt Pair ( width , Ġheight ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġdraw Map () Ġ{ čĊčĊĠĠĠĠĠĠĠ ĠtextView Status . setText (" draw Map () ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġdraw Canvas Ġ= ĠCan v ass ( this ) čĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= ĠfindViewById < LinearLayout >( R . id . linear Layout ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġlayout . get LayoutParams () čĊĠĠĠĠĠĠĠ Ġparams . height Ġ= ĠLinearLayout . LayoutParams . MATCH _ PARENT čĊĠĠĠĠĠĠĠ Ġparams . width Ġ= ĠLinearLayout . LayoutParams . MATCH _ PARENT čĊčĊĠĠĠĠĠĠĠ Ġlayout . addView ( draw Canvas , Ġparams ) čĊĠĠĠĠĠĠĠ Ġlayout . request Layout (); čĊčĊĠĠĠĠĠĠĠ Ġval Ġstreet Collection Ġ= Ġget Street Collection () čĊčĊčĊĠĠĠĠĠĠĠ Ġval Ġ( screen width , Ġ_) Ġ= Ġscreen Size () čĊčĊĠĠĠĠĠĠĠ Ġval Ġcos Phi 0 Ġ= Ġcos (( street Collection . max Lng Ġ- Ġstreet Collection . min Lng ) Ġ/ Ġ 2 . 0 ); čĊčĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġscreen width čĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġ( width / cos Phi 0 ). toInt () čĊčĊčĊĠĠĠĠĠĠĠ ĠLog . v (" draw Map ", Ġ" street Collection . stre ets . size Ġ= Ġ${ street Collection . stre ets . size }") čĊčĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 0 f čĊĠĠĠĠĠĠĠ Ġfor (( name , Ġline Collection ) Ġin Ġstreet Collection . stre ets ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġline Collection . lines ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ( 1 f Ġ- Ġline . line Coords [ 0 ])* width Ġ- Ġwidth / 2 f čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ( 1 f Ġ- Ġline . line Coords [ 1 ])* height Ġ- Ġheight / 2 f čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Canvas . start Path ( x , Ġy ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 3 Ġuntil Ġline . line Coords . size Ġstep Ġ 3 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ( 1 f Ġ- Ġline . line Coords [ i ])* width Ġ- Ġwidth / 2 f čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ( 1 f Ġ- Ġline . line Coords [ i + 1 ])* height Ġ- Ġheight / 2 f čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Canvas . add Point To Path ( x , Ġy ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠtextView Status . setText (" draw Map () Ġended ") čĊčĊĠĠĠĠĠĠĠ Ġdraw Canvas . invalidate () čĊčĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġfun Ġopen Region ( filename : ĠString ) Ġ{ čĊčĊĠĠĠĠĠĠĠ ĠtextView Status . setText (" Open Ġ$ filename ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġoutfile Ġ= Ġ"$ filename . ser " čĊčĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( this . getCache Dir (), Ġoutfile ) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Status . setText (" Exists Ġ$ filename ") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġload FromFile Async ( Ġfile , this ) čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠDownload Activity :: class . java ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġload FromFile Async ( file : ĠFile , Ġactivity : ĠView Map Activity ) Ġ= Ġasync ( Dispatch ers . Main ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Status . setText (" Opening Ġ${ file . name }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠTurn Ġon Ġbusy Ġindicator . čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġasync ( Dispatch ers . Default ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// We 're Ġon Ġa Ġbackground Ġthread Ġhere . čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Execute Ġblocking Ġcalls , Ġsuch Ġas Ġretrofit Ġcall . execute (). body () Ġ+ Ġcaching . čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" Street ", Ġ" File Ġloading ...") čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġfile . inputStream () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject InputStream Ġ= ĠObject InputStream ( inputStream ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . street Collection Ġ= Ġobject InputStream . read Object () Ġas ĠStreet Collection čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . io . Invalid Class Exception ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Street ", Ġ" Could Ġnot Ġload Ġfrom Ġfile :\ n $ e ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreet Collection Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" File ", Ġ" loaded ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity . street Collection Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" Features :", Ġ" stre ets Ġis Ġnull ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" Features :", Ġ" Length =${ activity . street Collection !!. stre ets . size }") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjob . await (); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// We 're Ġback Ġon Ġthe Ġmain Ġthread Ġhere . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update ĠUI Ġcontrols Ġsuch Ġas ĠRecyclerView Ġadapter Ġdata . čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" load from file async ", Ġe . toString ()) čĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠTurn Ġoff Ġbusy Ġindicator . čĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Status . setText (" Loaded Ġ${ file . name }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Map () čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġclass ĠCan v ass Ġ: ĠView Ġ{ čĊĠĠĠĠĠĠĠ Ġconstructor ( ctx : ĠContext ) Ġ: Ġsuper ( ctx ) čĊĠĠĠĠĠĠĠ Ġconstructor ( ctx : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( ctx , Ġattrs ) čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Paint : ĠPaint čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpath List : ĠArrayList < Path > čĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent Path : ĠPath čĊčĊĠĠĠĠĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint Ġ= ĠPaint (); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . set Anti Alias ( true ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . setColor ( Color . BLACK ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . setStyle ( Paint . Style . ST RO KE ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . set Stroke Join ( Paint . Join . ROUND ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint . set Stroke Width ( 1 f ); čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= ĠPath () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath List Ġ= ĠArrayList < Path >() čĊĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠĠĠĠĠ Ġfun Ġstart Path ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= ĠPath () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath List . add ( current Path ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . moveTo ( x , Ġy ) čĊčĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġadd Point To Path ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . lineTo ( x , Ġy ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw RGB ( 2 5 5 , Ġ 2 5 5 , Ġ 2 5 5 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! path List . isEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġpath List ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġm Paint ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊč Ċ } čĊčĊčĊ