package Ġio . homeassistant . comp anion . android . widgets . template Ċ Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Html . from Html Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Remote Views Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġio . homeassistant . comp anion . android . R Ċ import Ġio . homeassistant . comp anion . android . common . data . integration . Entity Ċ import Ġio . homeassistant . comp anion . android . database . App Database Ċ import Ġio . homeassistant . comp anion . android . database . widget . Template Widget Entity Ċ import Ġio . homeassistant . comp anion . android . widgets . Base Widget Provider Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠTemplate Widget Ġ: ĠBase Widget Provider () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Template Widget " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ TEMPLATE Ġ= Ġ" extra _ template " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Deleted ( context : ĠContext , Ġapp Widget Ids : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Dao Ġ= ĠApp Database . getInstance ( context ). template Widget Dao () ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġuser Ġdeletes Ġthe Ġwidget , Ġdelete Ġthe Ġpreference Ġassociated Ġwith Ġit . ĊĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Widget Dao . delete All ( app Widget Ids ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetAll Widget Ids ( context : ĠContext ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Dao Ġ= ĠApp Database . getInstance ( context ). template Widget Dao () ĊĠĠĠĠĠĠĠ Ġreturn Ġtemplate Widget Dao . getAll (). map Ġ{ Ġit . id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Widget Remote Views ( context : ĠContext , Ġapp Widget Id : ĠInt , Ġsuggested Entity : ĠEntity < Map < String , ĠAny >> ?): ĠRemote Views Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEvery Ġtime ĠApp Widget Manager . update App Widget (...) Ġis Ġcalled , Ġthe Ġbutton Ġlistener ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġlabel Ġneed Ġto Ġbe Ġre - assigned , Ġor Ġthe Ġnext Ġtime Ġthe Ġlayout Ġupdates ĊĠĠĠĠĠĠĠ Ġ// Ġ( e . g Ġhome Ġscreen Ġrotation ) Ġthe Ġwidget Ġwill Ġfall Ġback Ġon Ġits Ġdefault Ġlayout ĊĠĠĠĠĠĠĠ Ġ// Ġwithout Ġany Ġclick Ġlistener Ġbeing Ġapplied ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠTemplate Widget :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠUPDATE _ VIEW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġapp Widget Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Dao Ġ= ĠApp Database . getInstance ( context ). template Widget Dao () ĊĠĠĠĠĠĠĠ Ġval Ġwidget Ġ= Ġtemplate Widget Dao . get ( app Widget Id ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRemote Views ( context . packageName , ĠR . layout . widget _ template ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClick Pending Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . widget Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT Ġor ĠPending Intent . FLAG _ IM MUT ABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrendered Template Ġ= Ġtemplate Widget Dao . get ( app Widget Id )?. last Update Ġ?: Ġ" Loading " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrendered Template Ġ= Ġintegration UseCase . render Template ( widget . template , Ġmap Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Widget Dao . update Template Widget Last Update ( app Widget Id , Ġrendered Template ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset View Visibility ( R . id . widget Template Error , ĠView . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġrender Ġtemplate : Ġ${ widget . template }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset View Visibility ( R . id . widget Template Error , ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextView Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . widget Template Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Html ( rendered Template ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Entity Configuration ( context : ĠContext , Ġextras : ĠBundle ?, Ġapp Widget Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extras Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate : ĠString ? Ġ= Ġextras . getString ( EXTRA _ TEMPLATE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( template Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Did Ġnot Ġreceive Ġcomplete Ġwidget Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Dao Ġ= ĠApp Database . getInstance ( context ). template Widget Dao () ĊĊĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Widget Dao . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemplate Widget Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Widget Dao . get ( app Widget Id )?. last Update Ġ?: Ġ" Loading " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( context , ĠApp Widget Manager . getInstance ( context ), Ġint ArrayOf ( app Widget Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon Entity StateChanged ( context : ĠContext , Ġentity : ĠEntity <* >) Ġ{ ĊĠĠĠĠĠĠĠ ĠgetAll Widget Ids ( context ). forEach Ġ{ Ġapp Widget Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠTemplate Widget :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠUPDATE _ VIEW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġapp Widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ