package Ġio . dot an uki . block ked . rx 2 id ler k tx Ċ Ċ import Ġandroidx . test . espress o . Id ling Resource Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . dis pos ables . Dis pos ables Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Integer ĊĊ Ċ class ĠDeleg ating Id ling Resource Scheduler ( ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠScheduler , ĊĠĠĠ Ġprivate Ġval Ġname : ĠString Ċ ) Ġ: ĠId ling Resource Scheduler () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġwork Ġ= ĠAtomicInteger () ĊĠĠĠ Ġprivate Ġvar Ġcallback : ĠId ling Resource . Resource Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġwork Delegate Ġ= Ġobject Ġ: ĠWork Delegate Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Work () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork . increment AndGet (); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop Work () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( work . decrement AndGet () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. on Transition To Idle (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetName () Ġ= Ġname ĊĊĠĠĠ Ġoverride Ġfun Ġis Idle Now () Ġ= Ġwork . get () Ġ== Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġregister Idle Transition Callback ( target : ĠId ling Resource . Resource Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Ġ= Ġtarget ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Worker (): ĠScheduler . Worker Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate Worker Ġ= Ġdelegate . create Worker () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠScheduler . Worker () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable ( delegate Worker ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġschedule ( action : ĠRunnable ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis pos ables . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDis pos ables . dis posed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Ġ= Ġcreate Work ( action , Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġdelegate Worker . schedule ( work ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Disposable Ġ= ĠScheduled Work Disposable ( work , Ġdis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( work Disposable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwork Disposable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġschedule ( action : ĠRunnable , Ġdelay Time : ĠLong , Ġunit : ĠTimeUnit ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis pos ables . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDis pos ables . dis posed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Ġ= Ġcreate Work ( action , Ġdelay Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġdelegate Worker . schedule ( work , Ġdelay Time , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( dis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Disposable Ġ= ĠScheduled Work Disposable ( work , Ġdis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( work Disposable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwork Disposable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġschedule Period ically ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction : ĠRunnable , Ġinitial Delay : ĠLong , Ġperiod : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit : ĠTimeUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis pos ables . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDis pos ables . dis posed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Ġ= Ġcreate Work ( action , Ġinitial Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġdelegate Worker . schedule Period ically ( work , Ġinitial Delay , Ġperiod , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( dis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Disposable Ġ= ĠScheduled Work Disposable ( work , Ġdis posable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( work Disposable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwork Disposable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Disposed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdis pos ables . is Disposed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Work ( incoming : ĠRunnable , Ġdelay : ĠLong ): ĠScheduled Work Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaction Ġ= Ġincoming ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġis ĠScheduled Work ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn wrap Ġany Ġre - scheduled Ġwork . ĠWe Ġwant Ġeach Ġscheduler Ġto Ġget Ġits Ġown Ġstate Ġmachine . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġaction . target ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġimmediate Ġ= Ġdelay Ġ== Ġ 0 L ĊĠĠĠĠĠĠĠ Ġif Ġ( immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Delegate . start Work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstarting State Ġ= Ġif Ġ( immediate ) ĠScheduled Work . STATE _ SCHEDUL ED Ġelse ĠScheduled Work . STATE _ IDLE ĊĠĠĠĠĠĠĠ Ġreturn ĠScheduled Work ( action , Ġwork Delegate , Ġstarting State ) ĊĠĠĠ Ġ} ĊĊ Ċ }