package Ġcom . b ren tp an ther . bitcoin widget Ċ Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . app . Job Intent Service Ċ import Ġkotlin . concurrent . thread Ċ Ċ class ĠPrice Broadcast Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanual Refresh Ġ= Ġintent . getBoolean Extra ( Update Price Service . EXTRA _ MAN UAL _ REFRESH , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġapp Widget Id Ġ= Ġintent . getInt Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠP refs ( app Widget Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! prefs . exists ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġviews Ġ= ĠRemote Views ( context . packageName , Ġprefs . theme Layout ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġdon 't Ġalways Ġneed Ġto Ġdownload Ġa Ġnew Ġprice , Ġsometimes Ġjust Ġthe Ġlayout Ġcan Ġbe Ġupdated . ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġupdate Ġthe Ġprice Ġif Ġits Ġa Ġmanual Ġrefresh , Ġor Ġif Ġwe Ġare Ġclose Ġto Ġthe Ġinterval ĊĠĠĠĠĠĠĠ Ġval Ġupdate Price Ġ= Ġmanual Refresh Ġ|| Ġ( System . currentTimeMillis () Ġ- Ġprefs . last Update ) Ġ> Ġ( prefs . interval Ġ* Ġ 6 0 0 0 0 Ġ* Ġ. 2 5 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( update Price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrestriction Ġ= ĠNetwork Status Helper . get Restriction ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( restriction Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manual Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġrestriction , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Alarm ( context , Ġapp Widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manual Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWidget Views . set Loading ( views ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġth rott led Ġ= ĠNetwork Status Helper . check Th rott led ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsince Ġ= ĠSystem . currentTimeMillis () Ġ- Ġprefs . last Update ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( th rott led Ġ|| Ġsince Ġ< Ġ 1 2 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġeither Ġth rott led Ġby Ġthe Ġsystem , Ġor Ġare Ġtrying Ġto Ġrefresh Ġtoo Ġoften ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthen Ġwe Ġwill Ġnot Ġget Ġscheduled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġdon 't Ġenqueue Ġany Ġwork , Ġjust Ġ" finish " Ġafter Ġa Ġshort Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread ( start Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 7 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWidget Views . setText ( context , Ġviews , Ġprefs , Ġprefs . last Value , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClick ( context , Ġapp Widget Id , Ġviews ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Widget Manager Ġ= ĠApp Widget Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget Manager . update App Widget ( app Widget Id , Ġviews ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( context . application Context , ĠUpdate Price Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . put Extras ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJob Intent Service . enqueue Work ( context . application Context , ĠUpdate Price Service :: class . java , Ġ 7 4 8 3 , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Alarm ( context , Ġapp Widget Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWidget Views . setText ( context , Ġviews , Ġprefs , Ġprefs . last Value , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset OnClick ( context , Ġapp Widget Id , Ġviews ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Alarm ( context : ĠContext , Ġwidget Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalarm Ġ= Ġcontext . getSystem Service ( Context . ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĠĠĠĠĠĠĠ Ġval Ġwidget Update Intent Ġ= ĠIntent ( App Widget Manager . ACTION _ APP WIDGET _ UPDATE , Ġnull , Ġcontext , ĠPrice Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġwidget Update Intent . putExtra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġwidget Id ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( context , Ġwidget Id , Ġwidget Update Intent , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcancel Ġany Ġexisting Ġal arms ĊĠĠĠĠĠĠĠ Ġalarm . cancel ( pending Intent ) ĊĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= ĠP refs ( widget Id ). interval Ġ* Ġ 6 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġalarm . set ( Alarm Manager . EL AP SED _ REAL TIME , ĠSystem Clock . elapsed Realtime () Ġ+ Ġupdate , Ġpending Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠPrice Broadcast Receiver :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset OnClick ( context : ĠContext , Ġapp Widget Id : ĠInt , Ġviews : ĠRemote Views ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprice Update Ġ= ĠIntent ( context , ĠPrice Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprice Update . putExtra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġapp Widget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprice Update . putExtra ( Update Price Service . EXTRA _ MAN UAL _ REFRESH , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Price Update Ġ= ĠPending Intent . get Broadcast ( context , Ġapp Widget Id , Ġprice Update , ĠPending Intent . FLAG _ CANCEL _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviews . setOn Click Pending Intent ( R . id . parent , Ġpending Price Update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Widget Manager Ġ= ĠApp Widget Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Widget Manager . update App Widget ( app Widget Id , Ġviews ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ