package Ġio . homeassistant . comp anion . android . phone Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . util . Log Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . google . android . gms . we arable . Data Client Ċ import Ġcom . google . android . gms . we arable . Data Event Ċ import Ġcom . google . android . gms . we arable . Data Event Buffer Ċ import Ġcom . google . android . gms . we arable . DataMap Ċ import Ġcom . google . android . gms . we arable . DataMap Item Ċ import Ġcom . google . android . gms . we arable . Message Event Ċ import Ġcom . google . android . gms . we arable . Put DataMap Request Ċ import Ġcom . google . android . gms . we arable . W ear able Ċ import Ġcom . google . android . gms . we arable . W ear able Listener Service Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġio . homeassistant . comp anion . android . Build Config Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Authentication Repository Ċ import Ġio . homeassistant . comp anion . android . common . data . integration . Device Registration Ċ import Ġio . homeassistant . comp anion . android . common . data . integration . Integration Repository Ċ import Ġio . homeassistant . comp anion . android . common . data . url . Url Repository Ċ import Ġio . homeassistant . comp anion . android . database . App Database Ċ import Ġio . homeassistant . comp anion . android . database . we ar . F avorites Ċ import Ġio . homeassistant . comp anion . android . home . Home Activity Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ class ĠPhone Settings Listener Ġ: ĠW ear able Listener Service (), ĠData Client . On Data Changed Listener Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġauthentication Repository : ĠAuthentication Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġurl Repository : ĠUrl Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġintegration UseCase : ĠIntegration Repository ĊĊĠĠĠ Ġprivate Ġval Ġmain Scope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠJob ()) ĊĊĠĠĠ Ġprivate Ġval ĠobjectMapper Ġ= Ġj ack son ObjectMapper () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Phone Settings Listener " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ UPDATE _ TIME Ġ= Ġ" UpdateTime " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ IS _ AUTHENT IC ATED Ġ= Ġ" is Authenticated " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ FA V OR ITES Ġ= Ġ" favorites " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message Received ( event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Message Ġreceived : Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġif Ġ( event . path Ġ== Ġ"/ request Config ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Phone Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Phone Data () Ġ= Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent F avorites Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Database . getInstance ( application Context ). favorites Dao (). getAll () Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠ Ġval Ġput Data Request Ġ= ĠPut DataMap Request . create ("/ config "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Map . put Long ( KEY _ UPDATE _ TIME , ĠSystem . nano Time ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Map . put Boolean ( KEY _ IS _ AUTHENT IC ATED , Ġintegration UseCase . is Registered ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Map . putString ( KEY _ FA V OR ITES , ĠobjectMapper . writeValue AsString ( current F avorites . map Ġ{ Ġit . id Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset U rg ent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Put Data Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠW ear able . getData Client ( this @ Phone Settings Listener ). put Data Item ( put Data Request ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Success Listener Ġ{ ĠLog . d ( TAG , Ġ" Successfully Ġsent Ġ/ config Ġto Ġdevice ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Failure Listener Ġ{ Ġe Ġ-> ĠLog . e ( TAG , Ġ" Failed Ġto Ġsend Ġ/ config Ġto Ġdevice ", Ġe ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Changed ( data Events : ĠData Event Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Data Changed Ġ${ data Events . count }") ĊĠĠĠĠĠĠĠ Ġdata Events . forEach Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . type Ġ== ĠData Event . TYPE _ CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . data Item . also Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . uri . path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ authenticate " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ( DataMap Item . from Data Item ( item ). data Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ update F avorites " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave F avorites ( DataMap Item . from Data Item ( item ). data Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata Events . release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogin ( data Map : ĠData Map ) Ġ= Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġdata Map . getString (" URL ") ĊĠĠĠĠĠĠĠ Ġval Ġauth Code Ġ= Ġdata Map . getString (" Auth Code ") ĊĠĠĠĠĠĠĠ Ġval Ġdevice Name Ġ= Ġdata Map . getString (" Device Name ") ĊĠĠĠĠĠĠĠ Ġval Ġdevice Tracking Enabled Ġ= Ġdata Map . getString (" Location Tracking ") ĊĊĠĠĠĠĠĠĠ Ġurl Repository . save Url ( url ) ĊĠĠĠĠĠĠĠ Ġauthentication Repository . register Authorization Code ( auth Code ) ĊĠĠĠĠĠĠĠ Ġintegration UseCase . register Device ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice Registration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Build Config . VERSION _ NAME } Ġ(${ Build Config . VERSION _ CODE })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsend Phone Data () ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠHome Activity . newInstance ( application Context ) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave F avorites ( data Map : ĠData Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfavor ites Ids : ĠList < String > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( data Map . getString ( KEY _ FA V OR ITES , Ġ" [] ")) ĊĠĠĠĠĠĠĠ Ġval Ġfavor ites Dao Ġ= ĠApp Database . getInstance ( application Context ). favorites Dao () ĊĠĠĠĠĠĠĠ Ġfavor ites Dao . delete All () ĊĠĠĠĠĠĠĠ Ġfavor ites Ids . forEach Indexed Ġ{ Ġindex , Ġentity Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Dao . add ( F avorites ( entityId , Ġindex )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ