package Ġcom . goog let est . firebase . app distribution . test app Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . AppCompat Button Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . app distribution . App Distribution Release Ċ import Ġcom . google . firebase . app distribution . Firebase App Distribution Ċ import Ġcom . google . firebase . app distribution . Update Progress Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġvar Ġfirebase App Distribution : ĠFirebase App Distribution Ġ= ĠFirebase App Distribution . getInstance () ĊĠĠĠ Ġvar Ġupdate Task : ĠTask < Void >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġrelease : ĠApp Distribution Release ? Ġ= Ġnull ĊĠĠĠ Ġval ĠexecutorService : ĠExecutor Service Ġ= ĠExec utors . new Fixed ThreadPool ( 1 ) ĊĠĠĠ Ġlateinit Ġvar Ġsign In Button : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġsign Out Button : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġcheck For Update Button : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġupdate App Button : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġupdate If New Release Available Button : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġupdate If New Release Available Button Background : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġsign In Button Background : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġsign Out Button Background : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġcheck For Update Button Background : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġupdate App Button Background : ĠAppCompat Button ĊĠĠĠ Ġlateinit Ġvar Ġprogress Percentage : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġsign In Status : ĠTextView ĊĠĠĠ Ġlateinit Ġvar Ġprogress Percent : ĠTextView ĊĠĠĠ Ġlateinit Ġvar ĠprogressBar : ĠProgress Bar ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġsign In Button Ġ= ĠfindViewById < AppCompat Button >( R . id . sign _ in _ button ) ĊĠĠĠĠĠĠĠ Ġsign Out Button Ġ= ĠfindViewById < AppCompat Button >( R . id . sign _ out ) ĊĠĠĠĠĠĠĠ Ġcheck For Update Button Ġ= ĠfindViewById < AppCompat Button >( R . id . check _ for _ update ) ĊĠĠĠĠĠĠĠ Ġupdate App Button Ġ= ĠfindViewById < AppCompat Button >( R . id . update _ app ) ĊĠĠĠĠĠĠĠ Ġupdate If New Release Available Button Ġ= ĠfindViewById < AppCompat Button >( R . id . basic _ config ) ĊĠĠĠĠĠĠĠ Ġupdate If New Release Available Button Background Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < AppCompat Button >( R . id . basic _ config 2 ) ĊĠĠĠĠĠĠĠ Ġsign In Button Background Ġ= ĠfindViewById < AppCompat Button >( R . id . sign _ in _ button 2 ) ĊĠĠĠĠĠĠĠ Ġsign Out Button Background Ġ= ĠfindViewById < AppCompat Button >( R . id . sign _ out 2 ) ĊĠĠĠĠĠĠĠ Ġcheck For Update Button Background Ġ= ĠfindViewById < AppCompat Button >( R . id . check _ for _ update 2 ) ĊĠĠĠĠĠĠĠ Ġupdate App Button Background Ġ= ĠfindViewById < AppCompat Button >( R . id . update _ app 2 ) ĊĠĠĠĠĠĠĠ Ġprogress Percentage Ġ= ĠfindViewById < TextView >( R . id . progress _ percentage ) ĊĠĠĠĠĠĠĠ Ġsign In Status Ġ= ĠfindViewById < TextView >( R . id . sign _ in _ status ) ĊĠĠĠĠĠĠĠ Ġprogress Percent Ġ= ĠfindViewById < TextView >( R . id . progress _ percentage ) ĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById < ProgressBar >( R . id . progress _ bar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . app _ name ). text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sample ĠApp Ġv ${ Build Config . VERSION _ NAME } Ġ(${ Build Config . VERSION _ CODE })" ĊĠĠĠĠĠĠĠ Ġsetup UI ( is Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , Ġis Update Available Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠButton ĠList eners Ġ*/ ĊĠĠĠĠĠĠĠ Ġupdate If New Release Available Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update Task Ġ== Ġnull Ġ|| Ġupdate Task ?. is Complete Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution . update If New Release Available (). add On Failure Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Listener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate If New Release Available Button Background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update Task Ġ== Ġnull Ġ|| Ġupdate Task ?. is Complete Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution . update If New Release Available (). add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Listener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. signIn Tester () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Update Available Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġfailure Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Button Background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. signIn Tester () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġfailure Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , Ġis Update Available Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck For Update Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check For New Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Update Available Ġ= Ġit Ġ!= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Ġ= Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġfailure Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck For Update Button Background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check For New Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġrelease Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġfailure Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Update Available Ġ= Ġrelease Ġ!= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Ġ= Ġrelease ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign Out Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution . sign Out Tester () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , Ġis Update Available Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign Out Button Background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ Ġfirebase App Distribution . sign Out Tester () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , Ġis Update Available Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate App Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. update App () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Progress Listener Ġ{ Ġprogress Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Canceled Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup UI ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Signed In Ġ= Ġfirebase App Distribution . is Tester Signed In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Update Available Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate App Button Background . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase App Distribution . update App (). add On Progress Listener Ġ{ Ġprogress Listener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Second Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSecond Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ProgressBar () Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġprogress Percent . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠprogressBar . isIn determinate Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfailure Listener ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġex Ġ= Ġexception Ġas Ġcom . google . firebase . app distribution . Firebase App Distribution Exception ĊĠĠĠĠĠĠĠ ĠLog . d (" Firebase App Distribution ", Ġ" MAIN ACTIVITY : ERROR ĠERROR . ĠCODE : Ġ" Ġ+ Ġexception . errorCode ) ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Error Ġupdating Ġto Ġnew Ġrelease ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ("${ ex . message }: Ġ${ ex . errorCode }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Neutral Button (" Ok ay ") Ġ{ Ġdialog , Ġ_ Ġ-> Ġdialog . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprogress Listener ( update Progress : ĠUpdate Progress ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpercentage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( update Progress . apk Bytes Downloaded Ġ* Ġ 1 0 0 ) Ġ/ Ġupdate Progress . apk File Total Bytes ). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . set Progress ( percentage , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprogress Percent . text Ġ= Ġ"$ percentage Ġ% " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UI ( ĊĠĠĠĠĠĠĠ Ġis Signed In : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġis Update Available : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġrelease : ĠApp Distribution Release ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġprogress Percentage . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġif Ġ( is Update Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Status . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Release Ġavailable Ġ- Ġ${ release ?. display Version } Ġ(${ release ?. version Code })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Button Background . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Update Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Update Button Background . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate App Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate App Button Background . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Out Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Out Button Background . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsign In Status . text Ġ= Ġif Ġ( is Signed In ) Ġ" Tester Ġsigned ĠIn !" Ġelse Ġ" Not ĠSigned ĠIn " ĊĠĠĠĠĠĠĠ Ġsign In Button . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġsign In Button Background . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġsign Out Button . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġsign Out Button Background . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġcheck For Update Button . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġcheck For Update Button Background . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġupdate App Button . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġupdate App Button Background . visibility Ġ= Ġif Ġ( is Signed In ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġupdate App Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġupdate App Button Background . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} Ċ } Ċ