package Ġru . ra 6 6 it . updater for spotify . presentation . ui . activity Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġru . ra 6 6 it . updater for spotify .* Ċ import Ġru . ra 6 6 it . updater for spotify . data . network . Network Checker Ċ import Ġru . ra 6 6 it . updater for spotify . domain . model . Download Status State Ċ import Ġru . ra 6 6 it . updater for spotify . domain . model . Spot ify Status State Ċ import Ġru . ra 6 6 it . updater for spotify . presentation . ui . custom view . sn ackbar . Download Snackbar Ċ import Ġru . ra 6 6 it . updater for spotify . presentation . ui . custom view . swiper ef resh . Refresh Layout Ċ import Ġru . ra 6 6 it . updater for spotify . presentation . utils . String Service Ċ import Ġru . ra 6 6 it . updater for spotify . presentation . view model . Spot ify ViewModel Ċ import Ġjava . io . File Ċ import Ġjavax . inject . Inject Ċ import Ġandroidx . core . content . File Provider Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġspot ify ViewModel : ĠSpotify ViewModel ĊĊĠĠĠ Ġprivate Ġval Ġrefresh Listener Ġ= Ġobject Ġ: ĠRefresh Layout . On Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify ViewModel . get Latest Spot ify () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġspot ify Data Observer Ġ= ĠObserver < Spot ify Status State > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSpotify Status State . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error ( it . exception . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSpotify Status State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSpotify Status State . Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġit . spotify ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data . spotify State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify Not Installed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Install Now ( data . installed Version , Ġdata . latest Version Name , Ġdata . is Downloading ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify Have Update Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Have Update ( data . installed Version , Ġdata . latest Version Name , Ġdata . is Downloading ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify Is Latest Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Have Latest Version () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdownload Data Observer Ġ= ĠObserver < Download Status State > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownload Status State . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar ?. show ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownload Status State . Progress Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar ?. let Ġ{ Ġsn ackBar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fab . is Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! sn ackBar . is Shown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackBar . show ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackBar . update Progress ( it . progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownload Status State . Cancel Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownload Status State . Complete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Install Application Activity ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownload Status State . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar ?. setError ( it . exception . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Install Application Activity ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstall Ġ= Ġ ĠIntent ( Intent . ACTION _ INSTALL _ PACKAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . add Flags ( Intent . FLAG _ ACTIVITY _ SINGLE _ TOP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( this @ MainActivity , Ġthis @ MainActivity . packageName Ġ+ Ġ". provider ", Ġ Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . data Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . startActivity ( install ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstall Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . setData And Type ( uri , Ġ" application / vnd . android . package - archive ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . startActivity ( install ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġsn ackbar : ĠDownload Snackbar ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġsn ackbar Close Listener : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġspot ify ViewModel . cancel Downloading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ ĠUp dater App . application Component . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġswipe Layout . setOn Refresh Listener ( refresh Listener ) ĊĊĠĠĠĠĠĠĠ Ġsn ackbar Ġ= ĠDownload Snackbar ( container , ĠSn ackbar . LENGTH _ IN DEFIN ITE , Ġsn ackbar Close Listener ) ĊĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ Ġdownload Spot ify () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġspot ify ViewModel . spotify LiveData . observe ( this , Ġspot ify Data Observer ) ĊĠĠĠĠĠĠĠ Ġspot ify ViewModel . download File LiveData . observe ( this , Ġdownload Data Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . tool _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ item _ settings Ġ-> ĠstartActivity ( Intent ( this , ĠSettings Activity :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġspot ify ViewModel . update UI () ĊĠĠĠĠĠĠĠ Ġspot ify ViewModel . start Notification () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Have Latest Version () Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Layout . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠ Ġcards Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġcard Latest . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġtv Installed Version . text Ġ= ĠString Service . getById ( R . string . up _ to _ date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Have Update ( installed Version : ĠString , Ġlatest Version Name : ĠString , Ġis Downloading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Layout . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠ Ġcards Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġcard Latest . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġtv Installed Version . text Ġ= Ġinstalled Version ĊĠĠĠĠĠĠĠ Ġtv Latest Version . text Ġ= Ġlatest Version Name ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Downloading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( R . drawable . ic _ autore new _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Install Now ( installed Version : ĠString , Ġlatest Version Name : ĠString , Ġis Downloading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Layout . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠ Ġcards Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġcard Latest . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġtv Installed Version . text Ġ= Ġinstalled Version ĊĠĠĠĠĠĠĠ Ġtv Latest Version . text Ġ= Ġlatest Version Name ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Downloading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( R . drawable . ic _ file _ download _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Layout . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠ Ġcards Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĠĠĠĠĠĠĠ Ġshow Snackbar ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Layout . set Refresh ing ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Snackbar ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( fab , Ġmessage , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload Spot ify () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhave Permission Ġ= ĠContext Compat . check Self Permission ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĊĠĠĠĠĠĠĠ Ġif Ġ( have Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload File () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave File Permission Code Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload File () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Network Checker . is Network Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspot ify ViewModel . download Spot ify () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( getString ( R . string . no _ internet _ connection )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave File Permission Code Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ