package Ġapp . l awn ch air Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app widget . App Widget Host Ċ import Ġandroid . app widget . App Widget Host View Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . app widget . App Widget Provider Info Ċ import Ġandroid . content . Context Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroidx . core . content . edit Ċ import Ġcom . android . launcher 3 . Utilities Ċ import Ġcom . android . launcher 3 . util . MainThread Initialized Object Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Sharing Started Ċ import Ġkotlinx . coroutines . flow . callback Flow Ċ import Ġkotlinx . coroutines . flow . share In Ċ Ċ class ĠHead less Widgets Manager ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠMain Scope () Ġ+ ĠCor outine Name (" Head less Widgets Manager ") ĊĠĠĠ Ġprivate Ġval Ġprefs Ġ= ĠUtilities . getDevice Prefs ( context ) ĊĠĠĠ Ġprivate Ġval Ġwidget Manager Ġ= ĠApp Widget Manager . getInstance ( context ) ĊĠĠĠ Ġprivate Ġval Ġhost Ġ= ĠHead less App Widget Host ( context ) ĊĠĠĠ Ġprivate Ġval Ġsubscriptions Map Ġ= Ġmutable Map Of < String , ĠWidget Subscription >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġhost . start Listening () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubscribe Updates ( info : ĠApp Widget Provider Info , Ġpref Key : ĠString ): ĠFlow < App Widget Host View > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsubscription Ġ= Ġsubscriptions Map [ pref Key ] ĊĠĠĠĠĠĠĠ Ġif Ġ( subscription Ġ!= Ġnull Ġ&& Ġinfo . provider Ġ!= Ġsubscription . info . provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . cancel Callback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( subscription Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsubscription . flow ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsubscription Ġ= Ġcreate Subscription ( info , Ġpref Key ) ĊĠĠĠĠĠĠĠ Ġsubscriptions Map [ pref Key ] Ġ= Ġsubscription ĊĠĠĠĠĠĠĠ Ġreturn Ġsubscription . flow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Subscription ( info : ĠApp Widget Provider Info , Ġpref Key : ĠString ): ĠWidget Subscription Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscription Ġ= ĠWidget Subscription ( info ) ĊĠĠĠĠĠĠĠ Ġsubscription . flow Ġ= Ġcallback Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . cancel Callback Ġ= Ġ{ Ġclose () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidget Id Ġ= Ġbind Widget ( info , Ġpref Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Id Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ callback Flow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġhost . create View ( context , Ġwidget Id , Ġinfo ) Ġas ĠHead less App Widget Host View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . update Callback Ġ= Ġ{ Ġtry Send ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Cancellation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost . delete App Widget Id ( widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. share In ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh aring Started . While Sub scribed (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreplay Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsubscription ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Widget ( info : ĠApp Widget Provider Info , Ġpref Key : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġwidget Id Ġ= Ġprefs . getInt ( pref Key , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbound Info Ġ= Ġwidget Manager . getApp Widget Info ( widget Id ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Bound Ġ= Ġbound Info Ġ!= Ġnull Ġ&& Ġinfo . provider Ġ== Ġbound Info . provider ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Id Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost . delete App Widget Id ( widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Id Ġ= Ġhost . allocate App Widget Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Bound Ġ= Ġwidget Manager . bind App Widget Id If Allowed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Id , Ġinfo . profile , Ġinfo . provider , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost . delete App Widget Id ( widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidget Id Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprefs . edit Ġ{ Ġput Int ( pref Key , Ġwidget Id ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwidget Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠHead less App Widget Host ( context : ĠContext ) Ġ: ĠApp Widget Host ( context , Ġ 1 0 2 8 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget : ĠApp Widget Provider Info ? ĊĠĠĠĠĠĠĠ Ġ): ĠApp Widget Host View Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHead less App Widget Host View ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" View Constructor ") ĊĠĠĠ Ġprivate Ġclass ĠHead less App Widget Host View ( context : ĠContext ) Ġ: ĊĠĠĠĠĠĠĠ ĠApp Widget Host View ( context ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġupdate Callback : Ġ(( view : ĠApp Widget Host View ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate App Widget ( remote Views : ĠRemote Views ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . update App Widget ( remote Views ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Callback ?. invoke ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠWidget Subscription ( val Ġinfo : ĠApp Widget Provider Info ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġflow : ĠFlow < App Widget Host View > ĊĠĠĠĠĠĠĠ Ġvar Ġcancel Callback : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠINSTANCE Ġ= ĠMain Thread Initialized Object (:: Head less Widgets Manager ) ĊĠĠĠ Ġ} Ċ } Ċ