package Ġio . github . nam hy un gu . keymap . ui . added it key Ċ Ċ import Ġandroid . location . Location Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . firebase . firestore . Geo Point Ċ import Ġio . github . nam hy un gu . keymap . data . Key Ċ import Ġio . github . nam hy un gu . keymap . data . Place Ċ import Ġio . github . nam hy un gu . keymap . data . source . Key DataSource Ċ import Ġio . github . nam hy un gu . keymap . data . source . Reverse Geo coding Service Ċ import Ġio . github . nam hy un gu . keymap . util . Event Ċ import Ġio . github . nam hy un gu . keymap . util . to Geo hash Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠAdd Edit Key ViewModel Ġ@ ViewModel Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġkey DataSource : ĠKey DataSource , ĊĠĠĠ Ġprivate Ġval Ġreverse Geo coding Service : ĠReverse Geo coding Service , Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ ui State Ġ= ĠMutable LiveData ( Add Edit Key Ui State ()) ĊĠĠĠ Ġval Ġui State : ĠLive Data < Add Edit Key Ui State > Ġ= Ġ_ ui State ĊĊĠĠĠ Ġprivate Ġval Ġ_ key Saved Event Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġkey Saved Event : ĠLive Data < Event < Unit >> Ġ= Ġ_ key Saved Event ĊĊĠĠĠ Ġprivate Ġval Ġ_ key Deleted Event Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġkey Deleted Event : ĠLive Data < Event < Unit >> Ġ= Ġ_ key Deleted Event ĊĊĠĠĠ Ġprivate Ġval Ġ_ content IsEmpty Event Ġ= ĠMutable LiveData < Event < Unit >>() ĊĠĠĠ Ġval Ġcontent IsEmpty Event : ĠLive Data < Event < Unit >> Ġ= Ġ_ content IsEmpty Event ĊĊĠĠĠ Ġprivate Ġval Ġ_ start Pick Location Event Ġ= ĠMutable LiveData < Event < Location >>() ĊĠĠĠ Ġval Ġstart Pick Location Event : ĠLive Data < Event < Location >> Ġ= Ġ_ start Pick Location Event ĊĊĠĠĠ Ġprivate Ġvar Ġis Data Loaded Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġstart ( key Id : ĠString ?, Ġlocation : ĠLocation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Data Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey DataSource . getKey ( key Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Data Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġkey Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġkey . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġkey . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġkey . place !!. location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġkey . place . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Ġ= Ġkey . place . detail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Location ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Content ( content : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Description ( description : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Detail ( detail : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Ġ= Ġdetail ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Location ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Updated Ġ$ location ") ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Geo coding Service . reverse Geo coding ( location . latitude , Ġlocation . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġaddress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetIs Map Ready () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value !!. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Map Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Key () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġui State Ġ= Ġ_ ui State . value !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠcheckNotNull ( ui State . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠcheckNotNull ( ui State . location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeo hash Ġ= Ġlocation . to Geo hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠKey ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġif Ġ( ui State . id . isNotEmpty ()) Ġui State . id Ġelse Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġui State . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġui State . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace Ġ= ĠPlace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeo hash Ġ= Ġgeo hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlat Ġ= Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlon Ġ= Ġlocation . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates Ġ= ĠGeo Point ( location . latitude , Ġlocation . longitude ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Data Ġ= Ġaddress . toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Ġ= Ġui State . detail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey DataSource . save Key ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ key Saved Event . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ content IsEmpty Event . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Key ( key Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey DataSource . delete Key ( key Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ key Deleted Event . value Ġ= ĠEvent ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Pick Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġui State Ġ= Ġ_ ui State . value !! ĊĠĠĠĠĠĠĠ Ġif Ġ( ui State . location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ start Pick Location Event . value Ġ= ĠEvent ( ui State . location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }