package Ġk nie z rec . com . flight info . cards . map Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation . Animation Listener Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġk nie z rec . com . flight info . R Ċ import Ġk nie z rec . com . flight info . cards . base . Resizable Activity Ċ import Ġk nie z rec . com . flight info . cards . base . Service Based Card View Ċ import Ġk nie z rec . com . flight info . common . Navigation Ċ import Ġk nie z rec . com . flight info . common . set Custom Marker Ċ import Ġk nie z rec . com . flight info . common . sn ackbar . Top Snackbar Ċ import Ġk nie z rec . com . flight info . databinding . Map Card Layout Binding Ċ import Ġk nie z rec . com . flight info . db . C ities DataSource Ċ import Ġk nie z rec . com . flight info . settings . Flight App Preferences Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . os md roid . api . I Map Controller Ċ import Ġorg . os md roid . events . Map Listener Ċ import Ġorg . os md roid . events . Scroll Event Ċ import Ġorg . os md roid . events . Zoom Event Ċ import Ġorg . os md roid . util . Geo Point Ċ import Ġorg . os md roid . views . overlay . Marker Ċ import Ġorg . os md roid . views . overlay . Polyline Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ Ċ /** Ċ Ġ* ĠCopyright Ġby ĠK amil ĠN ie z re ck i Ċ Ġ*/ Ċ Ċ private Ġconst Ġval ĠDEFAULT _ ZO OM Ġ= Ġ 3 Ċ private Ġconst Ġval ĠPATH _ WIDTH Ġ= Ġ 7 f Ċ Ċ class ĠMap Card View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠService Based Card View < Map Card View Presenter >( context , Ġattrs , Ġdef Style Attr ), ĊĠĠĠ ĠMap Card View Presenter . View Contract Ġ{ ĊĊĠ Ġprivate Ġval Ġm Route Changed Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Receive ( ctx : ĠContext ?, Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠ Ġm Presenter . on Route Changed ( intent ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġm Polyline Path : ĠPoly line ĊĊĠ Ġprivate Ġvar Ġm Map Controller : ĠI Map Controller ĊĠ Ġprivate Ġvar Ġm Location Marker : ĠMarker ĊĠ Ġprivate Ġvar Ġm Sn ackBar : ĠTop Snackbar ? Ġ= Ġnull ĊĊĠ Ġprivate Ġval Ġm Binding Ġ: ĠMap Card Layout Binding Ġ= ĊĠĠĠ ĠMap Card Layout Binding . inflate ( LayoutInflater . from ( context ), Ġthis , Ġtrue ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġm Binding . apply Ġ{ ĊĠĠĠĠĠ Ġbtn Resize . setOnClickListener Ġ{ Ġm Presenter . on Resize Button Clicked () Ġ} ĊĠĠĠĠĠ Ġbtn Go To My Location . setOnClickListener Ġ{ Ġm Presenter . on Go To Location CL ick ed () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Map Controller Ġ= Ġm Binding . map View . controller ĊĠĠĠ Ġm Location Marker Ġ= ĠMarker ( m Binding . map View ) ĊĠĠĠ Ġm Polyline Path Ġ= ĠPoly line () ĊĠĠĠ Ġsetup Map () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinit Presenter (): ĠMap Card View Presenter Ġ{ ĊĠĠĠ Ġreturn ĠMap Card View Presenter ( Flight App Preferences ( context ), ĠC ities DataSource ( context )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsetup Map () Ġ{ ĊĠĠĠ Ġm Polyline Path . apply Ġ{ ĊĠĠĠĠĠ Ġcolor Ġ= ĠContext Compat . getColor ( context , ĠR . color . purple _ dark ) ĊĠĠĠĠĠ Ġwidth Ġ= ĠPATH _ WIDTH ĊĠĠĠĠĠ Ġis Ge odes ic Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Location Marker . apply Ġ{ ĊĠĠĠĠĠ Ġset Anchor ( Marker . AN CH OR _ CENTER , ĠMarker . AN CH OR _ CENTER ) ĊĠĠĠĠĠ Ġset Custom Marker ( context , ĠR . drawable . small _ plane _ icon ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Map Controller . apply Ġ{ ĊĠĠĠĠĠ Ġset Center ( m Presenter . default Geo Point ) ĊĠĠĠĠĠ Ġset Zoom ( DEFAULT _ ZO OM ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Binding . map View . invalidate () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Cache Dir (): ĠFile Ġ{ ĊĠĠĠ Ġreturn Ġcontext . cacheDir ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġregister On Max Zoom Reached Listener ( listener : ĠZoom Listener ) Ġ{ ĊĠĠĠ Ġm Binding . map View . set Map Listener ( object Ġ: ĠMap Listener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( event : ĠScroll Event ?) Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Zoom ( event : ĠZoom Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . source . max Zoom Level Ġ== Ġevent . zoom Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener . invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshow Zoom Tip () Ġ{ ĊĠĠĠ Ġif Ġ( m Sn ackBar ?. is Shown Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Sn ackBar Ġ= ĊĠĠĠĠĠĠĠ ĠTop Snackbar . make ( root View . findViewById ( R . id . toolbar ), ĠR . string . max _ zoom _ tip , ĠTop Snackbar . LENGTH _ VERY _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( R . color . purple _ dark ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Action ( R . string . settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation . goTo Settings ( context , Ġhighlight Custom Settings Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ Ġm Sn ackBar ?. dismiss () Ġ}, Ġ 1 0 0 0 ) Ġ// ĠHide Ġin Ġdelay Ġto Ġavoid Ġanimation Ġissues . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠ Ġm Sn ackBar ?. dismiss () ĊĠĠĠ Ġm Location Marker . on Detach ( m Binding . map View ) ĊĠĠĠ Ġm Polyline Path . on Detach ( m Binding . map View ) ĊĠĠĠ Ġm Binding . map View . overlay s ?. clear () ĊĠĠĠ ĠMarker . clean Defaults () ĊĠĠĠ Ġsuper . on Detached From Window () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdraw Path ( point A : ĠGeo Point , Ġpoint B : ĠGeo Point ) Ġ{ ĊĠĠĠ Ġm Binding . map View . overlay s . remove ( m Polyline Path ) ĊĠĠĠ Ġm Polyline Path . points Ġ= ĠlistOf ( point A , Ġpoint B ) ĊĠĠĠ Ġm Binding . map View . overlay s . add ( m Polyline Path ) ĊĠĠĠ Ġm Binding . map View . invalidate () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġclear Path () Ġ{ ĊĠĠĠ Ġm Binding . map View . overlay s . remove ( m Polyline Path ) ĊĠĠĠ Ġm Binding . map View . invalidate () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrotate Location Marker ( rotation : ĠFloat ) Ġ{ ĊĠĠĠ Ġm Location Marker . rotation Ġ= Ġrotation ĊĠĠĠ Ġm Binding . map View . invalidate () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdraw Point On Map ( lat : ĠDouble , Ġlong : ĠDouble ) Ġ{ ĊĠĠĠ Ġval Ġgeo Point Ġ= ĠGeo Point ( lat , Ġlong ) ĊĠĠĠ Ġm Location Marker . position Ġ= Ġgeo Point ĊĠĠĠ Ġm Binding . map View . overlay s ?. add ( 0 , Ġm Location Marker ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcenter On Map ( lat : ĠDouble , Ġlong : ĠDouble ) Ġ{ ĊĠĠĠ Ġval Ġgeo Point Ġ= ĠGeo Point ( lat , Ġlong ) ĊĠĠĠ Ġm Map Controller . set Center ( geo Point ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġreload Map () Ġ{ ĊĠĠĠ Ġm Binding . map View . reload Map Files () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcenter On Default Point () Ġ{ ĊĠĠĠ Ġm Map Controller . apply Ġ{ ĊĠĠĠĠĠ Ġset Center ( m Presenter . default Geo Point ) ĊĠĠĠĠĠ Ġset Zoom ( DEFAULT _ ZO OM ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġneeds Location Permission (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġchange Card Size ( expand : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġval Animator : ĠValue Animator ĊĊĠĠĠ Ġif Ġ( expand ) Ġ{ ĊĠĠĠĠĠ Ġval Animator Ġ= ĠValue Animator . of Int ( height , Ġ( height Ġ* Ġ 2 )). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġchange Height ( animation . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠ Ġscroll To Bottom () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġanimate Icon Change ( R . drawable . ic _ shrink ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Animator Ġ= ĠValue Animator . of Int ( height , Ġ( height Ġ/ Ġ 2 )). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġchange Height ( animation . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġanimate Icon Change ( R . drawable . ic _ expand ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Animator . apply Ġ{ ĊĠĠĠĠĠ Ġduration Ġ= Ġcontext . resources . getInteger ( R . integer . transition _ duration ). to Long () ĊĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠ Ġ}. start () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġregister Route Changed Receiver () Ġ{ ĊĠĠĠ Ġval Ġaction Route Changed Ġ= ĠIntent Filter ( Navigation . getAction For Route Change ()) ĊĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). register Receiver ( ĊĠĠĠĠĠĠĠ Ġm Route Changed Receiver , ĊĠĠĠĠĠĠĠ Ġaction Route Changed ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġunregister Route Changed Receiver () Ġ{ ĊĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ). unregister Receiver ( m Route Changed Receiver ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcopy Map ( callback : ĠMap Copied Callback ) Ġ{ ĊĠĠĠ Ġval Ġmap Helper Ġ= ĠMap Helper ( context ) ĊĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠ Ġval Ġres Ġ= Ġasync ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap Helper . do Copy () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcallback . invoke ( res . await ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchange Height ( height : ĠInt ) Ġ{ ĊĠĠĠ Ġm Binding . mv Root Layout . apply Ġ{ ĊĠĠĠĠĠ Ġlayout Params . height Ġ= Ġheight ĊĠĠĠ Ġ}. request Layout () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġscroll To Bottom () Ġ{ ĊĠĠĠ Ġ( context Ġas ĠRes izable Activity ). scrollTo Bottom () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġanimate Icon Change (@ Drawable Res Ġnew Icon Res Id : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġduration Ġ= Ġ 1 8 0 L ĊĠĠĠ Ġval Ġanim Out Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . slide _ out _ back wards ) ĊĠĠĠ Ġval Ġanim In Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . slide _ in _ forward s ) ĊĊĠĠĠ Ġanim Out . duration Ġ= Ġduration ĊĠĠĠ Ġanim In . duration Ġ= Ġduration ĊĊĠĠĠ Ġanim Out . set Animation Listener ( object Ġ: ĠAnimation Listener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAnimation ) Ġ{} ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAnimation ) Ġ{} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAnimation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Binding . btn Resize . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġset Image Resource ( new Icon Res Id ) ĊĠĠĠĠĠĠĠĠĠ Ġstart Animation ( anim In ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġm Binding . btn Resize . start Animation ( anim Out ) ĊĠ Ġ} Ċ }