package Ġcom . kp stv . xc lip per . ui . helpers . fragments Ċ Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . android . play . core . app update . App Update Manager Ċ import Ġcom . google . android . play . core . app update . App Update ManagerFactory Ċ import Ġcom . google . android . play . core . install . Install State Ċ import Ġcom . google . android . play . core . install . Install State Updated Listener Ċ import Ġcom . google . android . play . core . install . model . App Update Type Ċ import Ġcom . google . android . play . core . install . model . Install Status Ċ import Ġcom . google . android . play . core . install . model . Update Availability Ċ import Ġcom . kp stv . hv log . HV Log Ċ import Ġcom . kp stv . update . Updater Ċ import Ġcom . kp stv . update . workers . Update Download Worker Ċ import Ġcom . kp stv . xc lip per . Build Config Ċ import Ġcom . kp stv . xc lip per . R Ċ import Ġcom . kp stv . xc lip per . data . model . Web Settings Ċ import Ġcom . kp stv . xc lip per . data . model . Web Settings Converter Ċ import Ġcom . kp stv . xc lip per . extensions . Logger Ċ import Ġcom . kp stv . xc lip per . extensions . utils . Ret rofit Utils Ċ import Ġcom . kp stv . xc lip per . extensions . utils . asString Ċ import Ġcom . kp stv . xc lip per . service . worker . Github Check Worker Ċ import Ġcom . kp stv . xc lip per . service . worker . Github Update Worker Ċ import Ġcom . kp stv . xc lip per . ui . dialogs . Custom Lot tie Dialog Ċ import Ġcom . kp stv . xc lip per . ui . fragments . Home Ċ import Ġcom . kp stv . xc lip per . ui . helpers . Abstract Fragment Helper Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġcreated Ġto Ġmanage Ġupdates . ĠI Ġcreated Ġthis Ġto Ġprevent Ġmy ĠHome Ġfragment Ċ Ġ* Ġfor Ġholding Ġless Ġresponsibility . Ċ Ġ*/ Ċ class ĠUpdate Helper ( ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠFragment Activity , Ċ ) Ġ: ĠAbstract Fragment Helper < Home >( activity , ĠHome :: class ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSET T INGS _ URL Ġ= Ġ" https :// github . com / Ka ust ub h Pat ange / X Clip per / raw / master / X Clip per . Android / settings . json " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRE PO _ OWNER Ġ= Ġ" Ka ust ub h Pat ange " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRE PO _ NAME Ġ= Ġ" X Clip per " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUPDATE _ REQUEST _ CODE Ġ= Ġ 5 5 5 ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Updater () Ġ: ĠUp dater Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUp dater . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setCurrent App Version ( Build Config . VERSION _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Repo Owner ( REPO _ OWNER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Repo Name ( REPO _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġapp Update Manager : ĠApp Update Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġgithub Updater : ĠUp dater Ġ= Ġcreate Updater () ĊĊĠĠĠ Ġoverride Ġfun Ġon Fragment View Created () Ġ{ ĊĠĠĠĠĠĠĠ ĠGithub Check Worker . schedule ( activity ) ĊĠĠĠĠĠĠĠ Ġactivity . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fragment Res umed () Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Callback On Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fragment Destroyed () Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Update Manager ?. unregister Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse String Ġ= ĠRet rofit Utils . fetch ( SETTINGS _ URL ). get OrNull ()?. asString () ĊĠĠĠĠĠĠĠ Ġval Ġweb Settings Ġ= ĠWeb Settings Converter . from StringTo Web Settings ( response String ) Ġ?: ĠWeb Settings () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( web Settings . use New Updater ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Updates From Github () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Updates From Google Play () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcheck For Updates From Github () Ġ{ ĊĠĠĠĠĠĠĠ Ġgithub Updater . fetch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Available Ġ= Ġ{ Ġrelease Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Update Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Click Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Download Worker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. schedule < Github Update Worker >( activity , Ġrelease , ĠGithub Update Worker . UNIQUE _ WORK _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck For Updates From Google Play (): ĠUnit Ġ= Ġwith ( activity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Update Manager Ġ= ĠApp Update ManagerFactory . create ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġapp Update Info Task Ġ= Ġapp Update Manager . app Update Info ĊĠĠĠĠĠĠĠ Ġapp Update Manager . register Listener ( listener ) ĊĠĠĠĠĠĠĠ Ġapp Update Info Task . add On Success Listener Ġ{ Ġapp Update Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Update Info . update Availability () Ġ== ĠUpdate Availability . UPDATE _ AVAILABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġapp Update Info . is Update Type Allowed ( App Update Type . FLEX IBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager . start Update Flow For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Update Type . FLEX IBLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUPDATE _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w ( e , Ġ" In - app Ġupdates Ġworkflow Ġdid Ġnot Ġsucceed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis @ Update Helper . app Update Manager Ġ= Ġapp Update Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlistener : ĠInstall State Updated Listener Ġ= Ġobject Ġ: ĠInstall State Updated Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon State Update ( state : ĠInstall State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . install Status () Ġ== ĠInstall Status . DOWNLOAD ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Downloaded Ġ= Ġstate . bytes Downloaded () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Bytes To Download Ġ= Ġstate . total Bytes To Download () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH V Log . d ( m Ġ= Ġ" Bytes ĠDown loaded : Ġ$ bytes Downloaded , ĠTotal Bytes : Ġ$ total Bytes To Download ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state . install Status () Ġ== ĠInstall Status . DOWN LOADED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Update Download Complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state . install Status () Ġ== ĠInstall Status . INST ALLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager ?. unregister Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Update Download Complete () Ġ= Ġwith ( activity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity . is Destroyed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager ?. complete Update () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . update _ download _ complete )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . update _ download _ install )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . ok )) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager ?. complete Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠWindow Manager . Bad Token Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager ?. complete Update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġin Ġbetween Ġuser Ġput Ġthe Ġapp Ġto Ġbackground Ġduring Ġupdate ĊĠĠĠĠ Ġ* Ġdownload , Ġwe Ġwill Ġinform Ġthem Ġas Ġdownload Ġcompletes Ġwhen ĊĠĠĠĠ Ġ* Ġit Ġis Ġbrought Ġto Ġforeground Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġregister Callback On Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( app Update Manager Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Updates From Google Play () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġapp Update Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . app Update Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . add On Success Listener Ġ{ Ġapp Update Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Update Info . install Status () Ġ== ĠInstall Status . DOWN LOADED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Update Download Complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Update Dialog ( on Update Click : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCustom Lot tie Dialog ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Lot tie Res ( R . raw . update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( activity . getString ( R . string . update _ available )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( activity . getString ( R . string . update _ available _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Neutral Button ( R . string . later ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . update _ button , ĠonUpdate Click ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} Ċ } Ċ