/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 1 ĠBor is ĠTim of ee v Ġ< bt im of ee v @ em unix . org > Ċ Ġ* ĠDistributed Ġunder Ġthe ĠMIT ĠLicense Ġ( license Ġterms Ġare Ġat Ġhttp :// opensource . org / licenses / MIT ). Ċ Ġ*/ Ċ Ċ package Ġorg . em unix . instead launcher . ui . repository Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Application Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġio . reactivex . rx java 3 . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . em unix . instead launcher . Instead Launcher Ċ import Ġorg . em unix . instead launcher . R Ċ import Ġorg . em unix . instead launcher . data . Game Ċ import Ġorg . em unix . instead launcher . event . Consum able Event Ċ import Ġorg . em unix . instead launcher . event . Update Repo Event Ċ import Ġorg . em unix . instead launcher . helpers .* Ċ import Ġorg . em unix . instead launcher . services . Scan Games Ċ import Ġorg . em unix . instead launcher . services . Update Repository Ċ import Ġjava . io . IOException Ċ import Ġjava . util . zip . Zip Exception ĊĊ Ċ class ĠRepository ViewModel ( var Ġapp : ĠApplication ) Ġ: ĠAndroid ViewModel ( app ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġgames Ġ= ĠInstead Launcher . db . games (). observe All () ĊĠĠĠ Ġprivate Ġval Ġshow Progress : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġshow Error View : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġshow Game List : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġshow Install Game Dialog : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġshow Snackbar Ġ= ĠMutable LiveData < Consum able Event < Int >>() ĊĠĠĠ Ġprivate Ġval Ġshow Toast Ġ= ĠMutable LiveData < Consum able Event < Int >>() ĊĊĠĠĠ Ġprivate Ġval Ġevent Bus Ġ= ĠInstead Launcher . app Component . event Bus () ĊĠĠĠ Ġprivate Ġvar Ġevent Disposable : ĠDis posable ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Disposable Ġ= Ġevent Bus . listen ( Update Repo Event :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġit . isError ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Progress . value Ġ= Ġit . isLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Game List . value Ġ= Ġit . is Games Loaded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( app . is Service Running ( Update Repository :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error View . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Progress . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Game List . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( app ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Update Repo Ġ= Ġprefs . getBoolean (" pref _ update _ repo _ startup ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Update Repo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Repository () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Progress State (): ĠLive Data < Boolean > Ġ= Ġshow Progress ĊĊĠĠĠ Ġfun Ġget Error ViewState (): ĠLive Data < Boolean > Ġ= Ġshow Error View ĊĊĠĠĠ Ġfun Ġget Game List State (): ĠLive Data < Boolean > Ġ= Ġshow Game List ĊĊĠĠĠ Ġfun Ġget Install Game Dialog State (): ĠLive Data < Boolean > Ġ= Ġshow Install Game Dialog ĊĊĠĠĠ Ġfun Ġget Snackbar Message (): ĠLive Data < Consum able Event < Int >> Ġ= Ġshow Snackbar ĊĊĠĠĠ Ġfun Ġget Toast Message (): ĠLive Data < Consum able Event < Int >> Ġ= Ġshow Toast ĊĊĠĠĠ Ġfun Ġupdate Repository () Ġ{ ĊĠĠĠĠĠĠĠ ĠUpdate Repository . start ( app ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Games (): ĠLive Data < List < Game >> Ġ= Ġgames ĊĊĠĠĠ Ġfun Ġsearch Games ( query : ĠString ): ĠLive Data < List < Game >> Ġ= ĠInstead Launcher . db . games (). search ( query ) ĊĊĠĠĠ Ġfun Ġinstall Game ( uri : ĠUri ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Install Game Dialog . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunzip Game ( uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNot Instead Game Zip Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar . value Ġ= ĠCon sum able Event ( R . string . error _ not _ instead _ game _ zip ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠZip Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast . value Ġ= ĠCon sum able Event ( R . string . error _ failed _ to _ unpack _ zip ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast . value Ġ= ĠCon sum able Event ( R . string . error _ failed _ to _ unpack _ zip ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Install Game Dialog . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠScan Games . start ( app ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġunzip Game ( uri : ĠUri ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Game Zip ( uri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġapp . content Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException (" inputStream Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Instead Game Zip Ġ= ĠGame Parser (). is Instead Game Zip ( inputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Instead Game Zip ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġunzip ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġapp . content Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException (" inputStream Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgames Dir Ġ= ĠInstead Launcher . app Component . storage (). get Games Directory () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . unzip ( games Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Game Zip ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunzip ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Instead Game Zip Exception (" main . lua Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} Ċ } Ċ