package Ġcom . github . ash ut osh g ng wr . no ice . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . text . Html Ċ import Ġandroid . text . Sp anned Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . annotation . Nullable Ċ import Ġcom . github . ash ut osh g ng wr . no ice . R Ċ import Ġcom . google . android . material . text view . Material TextView Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠCount down TextView Ġ: ĠMaterial TextView Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHTML Ġtemplate Ġto Ġuse Ġon Ġthe ĠTextView . ĠCount down Ġis Ġset Ġusing Ġ[ String . format ] Ġand Ġ[ Html . from Html ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠCOUNT DOWN _ TEMPLATE Ġ= Ġ""" ĊĠĠĠĠĠ Ġ< strong >% 0 2 d </ strong >< small >< small > h </ small ></ small > ĊĠĠĠĠĠ Ġ< strong >% 0 2 d </ strong >< small >< small > m </ small ></ small > ĊĠĠĠĠĠ Ġ< strong >% 0 2 d </ strong >< small >< small > s </ small ></ small > ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġtime Ġinterval Ġbetween Ġeach Ġupdate Ġto Ġthe Ġview 's Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠUPDATE _ INTERVAL Ġ= Ġ 5 0 0 L ĊĠ Ġ} ĊĊĠ Ġconstructor (@ NonNull Ġcontext : ĠContext ) Ġ: Ġsuper ( context ) ĊĠ Ġconstructor (@ NonNull Ġcontext : ĠContext , Ġ@ Nullable Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) ĊĠ Ġconstructor (@ NonNull Ġcontext : ĠContext , Ġ@ Nullable Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠ Ġcontext , Ġattrs , Ġdef Style Attr ĊĠ Ġ) ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġcount down Until Millis Ġden otes Ġthe Ġtime Ġuntil Ġwhich Ġthe Ġcount down Ġshould Ġrun . ĠIt Ġis ĊĠĠ Ġ* Ġcount down Ġduration Ġ( millis ) Ġadded Ġto Ġ[ System Clock . uptime Millis ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġcount down Until Millis Ġ= ĠSystem Clock . uptime Millis () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUpdates Ġthe Ġview Ġcontent Ġand Ġregisters Ġa Ġdelayed Ġcallback Ġto Ġitself Ġfor Ġin def initely Ġrefresh ing ĊĠĠ Ġ* Ġthe Ġview Ġcontent . ĠUse Ġ[ android . view . View . remove Callbacks ] Ġto Ġremove Ġthe Ġcallback . ĠIf Ġwon 't ĊĠĠ Ġ* Ġregister Ġitself Ġas Ġa Ġdelayed Ġcallback Ġif Ġcount down Ġtimer Ġhas Ġfinished Ġor Ġif Ġthe Ġview Ġis Ġnot ĊĠĠ Ġ* Ġattached Ġto Ġa Ġwindow Ġanymore . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġupdate Callback Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠ Ġupdate Count down () ĊĠĠĠĠĠ Ġif Ġ( System Clock . uptime Millis () Ġ< Ġcount down Until Millis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Delayed ( this , ĠUPDATE _ INTERVAL ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠ Ġpost ( update Callback ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠ Ġremove Callbacks ( update Callback ) ĊĠĠĠ Ġsuper . on Detached From Window () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠStarts Ġthe Ġcount down Ġfrom Ġgiven Ġtime Ġperiod Ġin Ġmillis ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġmillis Ġcount down Ġperiod Ġin Ġmillis ĊĠĠ Ġ*/ ĊĠ Ġfun Ġstart Count down ( millis : ĠLong ) Ġ{ ĊĠĠĠ Ġ// Ġremove Ġany Ġpre - registered Ġcallbacks . Ġstart Count down () Ġmay Ġbe Ġcalled Ġmultiple Ġtimes . ĊĠĠĠ Ġremove Callbacks ( update Callback ) ĊĠĠĠ Ġcount down Until Millis Ġ= ĠSystem Clock . uptime Millis () Ġ+ Ġmillis ĊĠĠĠ Ġpost ( update Callback ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUpdates Ġthe Ġtimer Ġbased Ġon Ġ[ countdown Until Millis ]. ĠIt Ġalso Ġsets Ġthe Ġtext Ġstyle Ġto Ġ` disabled ` ĊĠĠ Ġ* Ġif Ġcount down Ġis Ġnot Ġrunning . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġupdate Count down () Ġ{ ĊĠĠĠ Ġvar Ġhours Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġminutes Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġseconds Ġ= Ġ 0 L ĊĠĠĠ Ġval Ġremaining Millis Ġ= Ġcount down Until Millis Ġ- ĠSystem Clock . uptime Millis () ĊĊĠĠĠ Ġif Ġ( remaining Millis Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġhours Ġ= ĠTimeUnit . MILLISECONDS . to Hours ( remaining Millis ) ĊĠĠĠĠĠ Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( remaining Millis ) Ġ% Ġ 6 0 ĊĠĠĠĠĠ Ġseconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( remaining Millis ) Ġ% Ġ 6 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtext Ġ= ĠCOUNT DOWN _ TEMPLATE . format ( hours , Ġminutes , Ġseconds ). to Sp anned () ĊĠĠĠ Ġupdate TextAppearance ( remaining Millis Ġ<= Ġ 0 ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġtext Ġappearance Ġto Ġone Ġof Ġ[ R . style . TextAppearance _ App _ Count down TextView _ Disabled ] Ġor ĊĠĠ Ġ* Ġ[ R . style . TextAppearance _ App _ Count down TextView ] Ġbased Ġon Ġ` disabled ` Ġflag . ĊĠĠ Ġ* ĠNote : ĠThis Ġdoesn 't Ġdisable Ġthe Ġview Ġitself . ĊĠĠ Ġ* Ġ@ param Ġdisabled Ġwhether Ġthe Ġview Ġshould Ġbe Ġdisabled . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġupdate TextAppearance ( disabled : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġstyle Ġ= Ġif Ġ( disabled ) Ġ{ ĊĠĠĠĠĠ ĠR . style . TextAppearance _ App _ Count down TextView _ Disabled ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠR . style . TextAppearance _ App _ Count down TextView ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠ Ġset TextAppearance ( style ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠ Ġset TextAppearance ( context , Ġstyle ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConverts Ġthe ĠHTML Ġstring Ġto Ġ[ Sp anned ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠString . to Sp anned (): ĠSp anned Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠ ĠHtml . from Html ( this , ĠHtml . FROM _ HTML _ MODE _ LEG ACY ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠ ĠHtml . from Html ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ