package Ġorg . simple . clin ic . app update Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . annotation . Visible ForTesting . PRIVATE Ċ import Ġio . reactivex . Observable Ċ import Ġorg . simple . clin ic . Build Config Ċ import Ġorg . simple . clin ic . app update . App Update State . App Update State Error Ċ import Ġorg . simple . clin ic . app update . App Update State . Dont Show App Update Ċ import Ġorg . simple . clin ic . app update . App Update State . Show App Update Ċ import Ġorg . simple . clin ic . feature . Feature . Notify App Update Available Ċ import Ġorg . simple . clin ic . feature . Features Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠCheck App Update Availability Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġapp Context : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠObservable < App Update Config >, ĊĠĠĠ Ġprivate Ġval Ġupdate Manager : ĠUpdate Manager , ĊĠĠĠ Ġprivate Ġval Ġversion Update Check : Ġ( Int , ĠApplication , ĠApp Update Config ) Ġ-> ĠBoolean Ġ= Ġis Version Applicable For Update , ĊĠĠĠ Ġprivate Ġval Ġfeatures : ĠFeatures Ċ ) Ġ{ ĊĊĠ Ġfun Ġlisten (): ĠObservable < App Update State > Ġ{ ĊĠĠĠ Ġreturn Ġupdate Manager ĊĠĠĠĠĠĠĠ Ġ. update Info () ĊĠĠĠĠĠĠĠ Ġ. flatMap ( this :: should N udge For Update ) ĊĠĠĠĠĠĠĠ Ġ. onError Return (:: App Update State Error ) ĊĠ Ġ} ĊĊĠ Ġfun Ġlisten All Updates (): ĠObservable < App Update State > Ġ{ ĊĠĠĠ Ġreturn Ġupdate Manager ĊĠĠĠĠĠĠĠ Ġ. update Info () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Update Available Ġ&& Ġit . is Flex ible Update Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShow App Update ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD ont Show App Update ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. onError Return (:: App Update State Error ) ĊĠ Ġ} ĊĊĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠ Ġfun Ġshould N udge For Update ( update Info : ĠUpdate Info ): ĠObservable < App Update State > Ġ{ ĊĠĠĠ Ġval Ġcheck Update Ġ= Ġconfig ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcheck For Update ( update Info , Ġit ) Ġ} ĊĊĠĠĠ Ġval Ġshould Show Ġ= Ġcheck Update ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġshow Update Ġ-> Ġshow Update Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠShow App Update Ġ} ĊĊĠĠĠ Ġval Ġdo Not Show Ġ= Ġcheck Update ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġshow Update Ġ-> Ġshow Update . not () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠD ont Show App Update Ġ} ĊĊĠĠĠ Ġreturn ĠObservable . merge Array ( should Show , Ġdo Not Show ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck For Update ( update Info : ĠUpdate Info , Ġconfig : ĠApp Update Config ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġfeatures . isEnabled ( Notify App Update Available ) ĊĠĠĠĠĠĠĠ Ġ&& Ġupdate Info . is Update Available ĊĠĠĠĠĠĠĠ Ġ&& Ġupdate Info . is Flex ible Update Type ĊĠĠĠĠĠĠĠ Ġ&& Ġversion Update Check ( update Info . available Version Code , Ġapp Context , Ġconfig ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġval Ġis Version Applicable For Update Ġ= Ġ{ Ġavailable Version Code : ĠInt , Ġapp Context : ĠApplication , Ġconfig : ĠApp Update Config Ġ-> ĊĠ Ġval Ġpackage Info Ġ= Ġapp Context . package Manager . get Package Info ( Build Config . APPLICATION _ ID , Ġ 0 ) ĊĊĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠ Ġval Ġlong Version Code Ġ= Ġpackage Info . long Version Code ĊĠĠĠ Ġval Ġversion Code Ġ= Ġlong Version Code . and ( 0 xffffffff ) ĊĠĠĠ Ġavailable Version Code . minus ( version Code ) Ġ>= Ġconfig . difference Between Versions To N udge ĊĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġavailable Version Code . minus ( package Info . version Code ) Ġ>= Ġconfig . difference Between Versions To N udge ĊĠ Ġ} Ċ } Ċ