/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠE man uel ĠM ach ado Ġda ĠSil va Ġ< eman uel . m ch @ gmail . com > Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġbill . toy box . infra Ċ Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġbill . reak t ive . Publisher Ċ Ċ private Ġenum Ġclass ĠLifecycle Ġ{ ĠRES UME , ĠPA USE Ġ} Ċ Ċ abstract Ġclass ĠObservable Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlifecycle Observer s Ġ= Ġmutable Set Of < Observer >() ĊĠĠĠ Ġvar Ġon Options ItemSelected Observer : Ġ(( Observable Activity , ĠMenuItem ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ// region ĠActivity Ġoverrides ĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Options ItemSelected Observer ?. invoke ( this , Ġitem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġlifecycle Observer s . filter Ġ{ Ġit . lifecycle Ġ== ĠLifecycle . RE SU ME Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach ( Observer :: run ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġlifecycle Observer s . filter Ġ{ Ġit . lifecycle Ġ== ĠLifecycle . PAUSE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach ( Observer :: run ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Observer s . clear () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĠActivity Ġoverrides ĊĊĠĠĠ Ġfun Ġdo On Resume ( action : ĠObservable Activity . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Observer s . add ( Observer ( Lifecycle . RE SU ME , Ġaction )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠPublisher < T >. subscribe Until Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubscription Ġ= Ġsubscribe () ĊĠĠĠĠĠĠĠ Ġlifecycle Observer s Ġ+= ĠObserver ( Lifecycle . PAUSE , Ġsubscription :: cancel , Ġone Time Run Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠObserver ( val Ġlifecycle : ĠLifecycle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠObservable Activity . () Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Time Run : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( lifecycle : ĠLifecycle , Ġno Args Action : Ġ() Ġ-> ĠUnit , Ġone Time Run : ĠBoolean Ġ= Ġfalse ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( lifecycle , Ġaction Ġ= Ġ{ Ġno Args Action . invoke () Ġ}, Ġone Time Run Ġ= Ġone Time Run ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke ( this @ Observable Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( one Time Run ) Ġlifecycle Observer s Ġ-= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ