package Ġcom . tp . forest fire monitor . presentation . view model Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġcom . google . android . gms . maps . model . Marker Ċ import Ġcom . tp . base . data . Repository Result Ċ import Ġcom . tp . base . lifecycle . Multiple LiveData Ċ import Ġcom . tp . base . lifecycle . Single Live Event Ċ import Ġcom . tp . forest fire monitor . data . area . model . Area Ċ import Ġcom . tp . forest fire monitor . data . area . model . Coordinate Ċ import Ġcom . tp . forest fire monitor . data . area . repository . Area DataSource Ċ import Ġcom . tp . forest fire monitor . data . fire . model . Current Fire Ċ import Ġcom . tp . forest fire monitor . data . fire . model . Fire H azard Ċ import Ġcom . tp . forest fire monitor . data . fire . model . F ires Result Ċ import Ġcom . tp . forest fire monitor . data . fire . repository . Fire DataSource Ċ import Ġcom . tp . forest fire monitor . extension . to Coordinate Ċ import Ġcom . tp . forest fire monitor . presentation . Item Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġjava . util .* Ċ Ċ class ĠMap ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġarea Repository : ĠArea DataSource , ĊĠĠĠ Ġprivate Ġval Ġfire Repository : ĠFire DataSource Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġprivate Ġvar Ġlast Notification F ires Ġ= Ġempty List < Current Fire >() ĊĠĠĠ Ġprivate Ġvar Ġlast Notification H az ards Ġ= Ġempty List < Fire H azard >() ĊĊĠĠĠ Ġprivate Ġval Ġselected ItemId Ġ= ĠMutable LiveData < String >(). apply Ġ{ Ġvalue Ġ= Ġ"" Ġ} ĊĠĠĠ Ġval Ġis Edit Area Mode Enabled Ġ= ĠMutable LiveData < Boolean >(). apply Ġ{ Ġvalue Ġ= Ġfalse Ġ} ĊĠĠĠ Ġprivate Ġval Ġarea : ĠLive Data < Area > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < Area >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( area Repository . get Area ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġit Ġ?: ĠArea () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġitems : ĠMutable LiveData < List < Item >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMultiple LiveData < List < Item >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sources ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarea , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Edit Area Mode Enabled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected ItemId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġarea , Ġis Edit Area Mode Enabled , Ġselected ItemId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem List Ġ= Ġarea . coordinates . to Items () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( is Edit Area Mode Enabled Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Items Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġif Ġ( current Items . isNull OrEmpty ()) Ġitem List Ġelse Ġcurrent Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . map Ġ{ ĠItem ( it . id , Ġit . coordinate , Ġis Drag gable Ġ= Ġit . id Ġ== Ġselected ItemId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġcurrent F ires Ġ= ĠMutable LiveData < List < Current Fire >> (). apply Ġ{ Ġvalue Ġ= ĠlistOf () Ġ} ĊĠĠĠ Ġprivate Ġval Ġfire H az ards Ġ= ĠMutable LiveData < List < Fire H azard >> (). apply Ġ{ Ġvalue Ġ= ĠlistOf () Ġ} ĊĠĠĠ Ġval Ġmap State : ĠLive Data < Map State > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMultiple LiveData < Map State >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sources ( items , Ġcurrent F ires , Ġfire H az ards ) Ġ{ Ġitems , Ġcurrent F ires , Ġfire H az ards Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠMap State ( items , Ġcurrent F ires , Ġfire H az ards ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpolygon Items : ĠMutable LiveData < List < Item >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMed iator LiveData < List < Item >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( map State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġit . items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġerror Ġ= ĠSingle Live Event < String >() ĊĠĠĠ Ġval Ġremove Tooltip Event Ġ= ĠSingle Live Event < Void >() ĊĊĠĠĠ Ġfun Ġopen Edit Area Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Edit Area Mode Enabled . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose Edit Area Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġselected ItemId . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġis Edit Area Mode Enabled . value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Edit Area () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġitems . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcurrent F ires . value Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġfire H az ards . value Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġcoordinates Ġ= Ġitems . to Coordinates () ĊĠĠĠĠĠĠĠ Ġval Ġarea Ġ= ĠArea ( coordinates Ġ= Ġcoordinates ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ Ġarea Repository . save Area ( area ) Ġ} ĊĠĠĠĠĠĠĠ Ġis Edit Area Mode Enabled . value Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Map Click ( lat Lng : ĠLat Lng ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnew Item Ġ= ĠItem ( UUID . randomUUID (). toString (), Ġlat Lng . to Coordinate ()) ĊĠĠĠĠĠĠĠ Ġval Ġnew Items Ġ= Ġitems . value . or Empty () Ġ+ Ġnew Item ĊĠĠĠĠĠĠĠ Ġitems . value Ġ= Ġnew Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Marker Click ( marker : ĠMarker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitems . value ?. find Ġ{ Ġit . id Ġ== Ġmarker . tag Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġremove Tooltip Event . call () ĊĠĠĠĠĠĠĠ Ġselected ItemId . value Ġ= Ġitem . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Marker Drag End ( marker : ĠMarker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnew Items Ġ= Ġitems . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠItem ( it . id , Ġget Marker Position OrDefault ( it , Ġmarker ), Ġit . is Drag gable ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġitems . value Ġ= Ġnew Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Marker Drag ( marker : ĠMarker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnew Polygon Items Ġ= Ġpolygon Items . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ ĠItem ( it . id , Ġget Marker Position OrDefault ( it , Ġmarker ), Ġit . is Drag gable ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġpolygon Items . value Ġ= Ġnew Polygon Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Remove Bal lo onClick () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Area Mode Enabled ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected ItemId Ġ= Ġrequire NotNull ( selected ItemId . value ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Items Ġ= Ġitems . value . or Empty (). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġindex ToRemove Ġ= Ġnew Items . indexOf First Ġ{ Ġit . id Ġ== Ġselected ItemId Ġ} ĊĠĠĠĠĠĠĠ Ġnew Items . remove At ( index ToRemove ) ĊĠĠĠĠĠĠĠ Ġitems . value Ġ= Ġnew Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload F ires () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarea Coordinates Ġ= Ġarea . value ?. coordinates ĊĠĠĠĠĠĠĠ Ġif Ġ( area Coordinates . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpolygon Coordinates Ġ= Ġarea Coordinates Ġ+ Ġarea Coordinates . first () ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġfire Repository . search F ires ( polygon Coordinates )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRepository Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfires Ġ= Ġresult . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent F ires . value Ġ= Ġfires . current F ires ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire H az ards . value Ġ= Ġfires . fire H az ards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRepository Result . Error Ġ-> Ġerror . value Ġ= Ġresult . exception . message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle New Notification ( fire s : ĠF ires Result ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" Map ViewModel ", Ġ" Handling Ġfire Ġresults Ġnotification ") ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent F ires . value Ġ= Ġcurrent F ires . value ?. minus ( last Notification F ires )?. plus ( fire s . current F ires ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire H az ards . value Ġ= Ġfire H az ards . value ?. minus ( last Notification H az ards )?. plus ( fire s . fire H az ards ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Notification F ires Ġ= Ġfires . current F ires ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Notification H az ards Ġ= Ġfires . fire H az ards ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Marker Position OrDefault ( item : ĠItem , Ġmarker : ĠMarker ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( item . id Ġ== Ġmarker . tag ) Ġmarker . position . to Coordinate () Ġelse Ġitem . coordinate ĊĊĠĠĠ Ġprivate Ġfun Ġis Edit Area Mode Enabled () Ġ= Ġis Edit Area Mode Enabled . value Ġ== Ġtrue ĊĊĠĠĠ Ġprivate Ġfun ĠList < Coordinate >. to Items () Ġ= Ġmap Ġ{ ĠItem ( UUID . randomUUID (). toString (), Ġit ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Item >. to Coordinates () Ġ= Ġmap Ġ{ Ġit . coordinate Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠMap State ( ĊĠĠĠĠĠĠĠ Ġval Ġitems : ĠList < Item > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġval Ġcurrent F ires : ĠList < Current Fire > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġval Ġfire H az ards : ĠList < Fire H azard > Ġ= ĠlistOf () ĊĠĠĠ Ġ) Ċ } Ċ