/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġå¤§ åīį èī¯ ä»ĭ Ġ( OH MA E ĠR y os uke ) Ċ Ġ* Ċ Ġ* ĠThis Ġsoftware Ġis Ġreleased Ġunder Ġthe ĠMIT ĠLicense . Ċ Ġ* Ġhttp :// opensource . org / licenses / MIT Ċ Ġ*/ Ċ Ċ package Ġnet . mm 2 d . up np . internal . manager Ċ Ċ import Ġnet . mm 2 d . up np . Service Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠClass Ġthat Ġmanages ĠSubscribe Ġstatus Ġof Ġ[ Service ]. Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ å¤§ åīį èī¯ ä»ĭ Ġ( OH MA E ĠR y os uke )]( mailto : ry o @ mm 2 d . net ) Ċ Ġ* Ċ Ġ* Ġ@ constructor Ġinitialize Ċ Ġ* Ġ@ param Ġservice Ġ[ Service ] Ċ Ġ* Ġ@ param Ġsubscription Timeout ĠTime Ġto Ġtime Ġout Ċ Ġ* Ġ@ param Ġkeep Renew Ġtrue : Ġperiodically Ġexecute Ġrenew Ċ Ġ*/ Ċ internal Ġclass ĠSubscribe Service ( ĊĠĠĠ Ġval Ġservice : ĠService , ĊĠĠĠ Ġprivate Ġvar Ġsubscription Timeout : ĠLong , ĊĠĠĠ Ġprivate Ġvar Ġkeep Renew : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġfail Count : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġsubscription Start : ĠLong Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprivate Ġvar Ġsubscription Expiry Time : ĠLong Ġ= Ġsubscription Start Ġ+ Ġsubscription Timeout ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthe Ġstatus Ġhas Ġexceeded Ġthe Ġupper Ġlimit Ġof Ġthe Ġnumber Ġof Ġretries . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue : Ġfailed , Ġfalse : Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Failed (): ĠBoolean Ġ= Ġfail Count Ġ>= ĠRET RY _ COUNT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnext Ġscan Ġtime . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġtime Ġto Ġexecute ĠRen ew Ġnext Ġif Ġkeep Ġis Ġspecified , ĊĠĠĠĠ Ġ* Ġotherwise Ġthe Ġtime Ġto Ġexpire ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnext Ġscan Ġtime ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetNext Scan Time (): ĠLong Ġ= Ġif Ġ(! keep Renew ) Ġsubscription Expiry Time Ġelse Ġcalculate Renew Time () ĊĊĠĠĠ Ġfun Ġrenew ( timeout : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscription Start Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsubscription Timeout Ġ= Ġtimeout ĊĠĠĠĠĠĠĠ Ġsubscription Expiry Time Ġ= Ġsubscription Start Ġ+ Ġsubscription Timeout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Keep Renew ( keep : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkeep Renew Ġ= Ġkeep ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġand Ġreturn Ġthe Ġtime Ġto Ġexecute ĠRen ew Ġ( UTC ( ms )). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExecute Ġon Ġthe Ġbasis Ġof ĠHal ftime Ġof ĠSubscribe 's Ġtimeout . ĊĠĠĠĠ Ġ* ĠIf Ġexecution Ġis Ġun successful , Ġexecute Ġon Ġthe Ġbasis Ġof ĠTimeout 's Ġtime . ĊĠĠĠĠ Ġ* ĠAllow Ġup Ġto Ġone Ġcommunication Ġfailure . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlso , Ġby Ġexecuting Ġslightly Ġbefore Ġthe Ġreference Ġtime , ĊĠĠĠĠ Ġ* Ġit Ġis Ġpossible Ġto Ġoperate Ġeven Ġif Ġthe Ġtime Ġis Ġslightly Ġoffset Ġfor Ġeach Ġdevice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTime Ġto Ġdo ĠRen ew ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalculate Renew Time (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinterval Ġ= Ġsubscription Timeout Ġ* Ġ( fail Count Ġ+ Ġ 1 ) Ġ/ ĠRET RY _ COUNT ĊĠĠĠĠĠĠĠ Ġif Ġ( interval Ġ> ĠM ARGIN _ TIME Ġ* Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ġ-= ĠM ARGIN _ TIME ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ġ/= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsubscription Start Ġ+ Ġinterval ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġwhether Ġit Ġis Ġexpired . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow ĠCurrent Ġtime ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue : Ġexpired , Ġfalse : Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Expired ( now : ĠLong ): ĠBoolean Ġ= Ġsubscription Expiry Time Ġ< Ġnow ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġrenew Subscribe Ġif Ġthere Ġis Ġa Ġcondition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnow ĠCurrent Ġtime ĊĠĠĠĠ Ġ* Ġ@ return Ġfalse : Ġfailed , Ġtrue : Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrenew Subscribe ( now : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! keep Renew Ġ|| Ġcalculate Renew Time () Ġ> Ġnow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( service . renew Subscribe Sync ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Fail Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincrease Fail Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Fail Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġfail Count Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrease Fail Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġfail Count ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġservice . hashCode () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ=== Ġthis ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠSubscribe Service ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġservice Ġ== Ġother . service ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM ARGIN _ TIME Ġ= ĠTimeUnit . SECONDS . to Millis ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRET RY _ COUNT Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ } Ċ