11package com.googletest.firebase.appdistribution.testapp
22
3+ import android.app.AlertDialog
34import android.content.Intent
5+ import android.os.Build
46import android.os.Bundle
57import android.util.Log
68import android.view.View
79import android.widget.ProgressBar
810import android.widget.TextView
911import androidx.appcompat.app.AppCompatActivity
1012import androidx.appcompat.widget.AppCompatButton
13+ import com.google.android.gms.tasks.Task
1114import com.google.firebase.appdistribution.AppDistributionRelease
1215import com.google.firebase.appdistribution.FirebaseAppDistribution
13- import com.google.firebase.appdistribution.FirebaseAppDistributionException as FirebaseAppDistributionException1
16+ import com.google.firebase.appdistribution.UpdateProgress
17+ import java.util.concurrent.ExecutorService
18+ import java.util.concurrent.Executors
1419
1520class MainActivity : AppCompatActivity () {
1621 var firebaseAppDistribution: FirebaseAppDistribution = FirebaseAppDistribution .getInstance()
22+ var updateTask: Task <Void >? = null
23+ var release: AppDistributionRelease ? = null
24+ val executorService: ExecutorService = Executors .newFixedThreadPool(1 )
25+ lateinit var signInButton: AppCompatButton
26+ lateinit var signOutButton: AppCompatButton
27+ lateinit var checkForUpdateButton: AppCompatButton
28+ lateinit var updateAppButton: AppCompatButton
29+ lateinit var updateIfNewReleaseAvailableButton: AppCompatButton
30+ lateinit var updateIfNewReleaseAvailableButtonBackground: AppCompatButton
31+ lateinit var signInButtonBackground: AppCompatButton
32+ lateinit var signOutButtonBackground: AppCompatButton
33+ lateinit var checkForUpdateButtonBackground: AppCompatButton
34+ lateinit var updateAppButtonBackground: AppCompatButton
35+ lateinit var progressPercentage: TextView
36+ lateinit var signInStatus: TextView
37+ lateinit var progressPercent: TextView
38+ lateinit var progressBar: ProgressBar
1739
1840 override fun onCreate (savedInstanceState : Bundle ? ) {
1941 super .onCreate(savedInstanceState)
2042 setContentView(R .layout.activity_main)
43+ signInButton = findViewById<AppCompatButton >(R .id.sign_in_button)
44+ signOutButton = findViewById<AppCompatButton >(R .id.sign_out)
45+ checkForUpdateButton = findViewById<AppCompatButton >(R .id.check_for_update)
46+ updateAppButton = findViewById<AppCompatButton >(R .id.update_app)
47+ updateIfNewReleaseAvailableButton = findViewById<AppCompatButton >(R .id.basic_config)
48+ updateIfNewReleaseAvailableButtonBackground =
49+ findViewById<AppCompatButton >(R .id.basic_config2)
50+ signInButtonBackground = findViewById<AppCompatButton >(R .id.sign_in_button2)
51+ signOutButtonBackground = findViewById<AppCompatButton >(R .id.sign_out2)
52+ checkForUpdateButtonBackground = findViewById<AppCompatButton >(R .id.check_for_update2)
53+ updateAppButtonBackground = findViewById<AppCompatButton >(R .id.update_app2)
54+ progressPercentage = findViewById<TextView >(R .id.progress_percentage)
55+ signInStatus = findViewById<TextView >(R .id.sign_in_status)
56+ progressPercent = findViewById<TextView >(R .id.progress_percentage)
57+ progressBar = findViewById<ProgressBar >(R .id.progress_bar)
2158 }
2259
2360 override fun onResume () {
@@ -26,108 +63,169 @@ class MainActivity : AppCompatActivity() {
2663 " Sample App v${BuildConfig .VERSION_NAME } (${BuildConfig .VERSION_CODE } )"
2764 setupUI(isSignedIn = firebaseAppDistribution.isTesterSignedIn, isUpdateAvailable = false )
2865
29- /* * Basic Configuration */
30- findViewById<AppCompatButton >(R .id.sign_in_button).visibility = View .GONE
31- findViewById<AppCompatButton >(R .id.check_for_update).visibility = View .GONE
32- findViewById<AppCompatButton >(R .id.sign_out).visibility = View .GONE
66+ /* * Button Listeners */
67+ updateIfNewReleaseAvailableButton.setOnClickListener {
68+ if (updateTask == null || updateTask?.isComplete == true ) {
69+ updateTask =
70+ firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener() {
71+ failureListener(it)
72+ }
73+ }
74+ }
3375
34- firebaseAppDistribution.updateIfNewReleaseAvailable()
35- .addOnSuccessListener {
36- firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
37- val ex = it as FirebaseAppDistributionException1
38- Log .d(" FirebaseAppDistribution" , " MAINACTIVITY:ERROR ERROR. CODE: " + it.errorCode)
76+ updateIfNewReleaseAvailableButtonBackground.setOnClickListener {
77+ executorService.execute {
78+ if (updateTask == null || updateTask?.isComplete == true ) {
79+ updateTask =
80+ firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
81+ failureListener(it)
82+ }
3983 }
4084 }
85+ }
86+
87+ signInButton.setOnClickListener {
88+ firebaseAppDistribution
89+ .signInTester()
90+ .addOnSuccessListener {
91+ setupUI(
92+ isSignedIn = firebaseAppDistribution.isTesterSignedIn,
93+ isUpdateAvailable = false )
94+ }
95+ .addOnFailureListener { failureListener(it) }
96+ }
97+
98+ signInButtonBackground.setOnClickListener {
99+ executorService.execute {
100+ firebaseAppDistribution
101+ .signInTester()
102+ .addOnSuccessListener {}
103+ .addOnFailureListener { failureListener(it) }
104+ }
105+ setupUI(
106+ isSignedIn = firebaseAppDistribution.isTesterSignedIn, isUpdateAvailable = false )
107+ }
108+
109+ checkForUpdateButton.setOnClickListener {
110+ firebaseAppDistribution
111+ .checkForNewRelease()
112+ .addOnSuccessListener {
113+ setupUI(
114+ isSignedIn = firebaseAppDistribution.isTesterSignedIn,
115+ isUpdateAvailable = it != null ,
116+ release = it)
117+ }
118+ .addOnFailureListener { failureListener(it) }
119+ }
120+
121+ checkForUpdateButtonBackground.setOnClickListener {
122+ executorService.execute {
123+ firebaseAppDistribution
124+ .checkForNewRelease()
125+ .addOnSuccessListener { release = it }
126+ .addOnFailureListener { failureListener(it) }
127+ }
128+ setupUI(
129+ isSignedIn = firebaseAppDistribution.isTesterSignedIn,
130+ isUpdateAvailable = release != null ,
131+ release = release)
132+ }
133+
134+ signOutButton.setOnClickListener {
135+ firebaseAppDistribution.signOutTester()
136+ setupUI(
137+ isSignedIn = firebaseAppDistribution.isTesterSignedIn, isUpdateAvailable = false )
138+ }
139+
140+ signOutButtonBackground.setOnClickListener {
141+ executorService.execute { firebaseAppDistribution.signOutTester() }
142+
143+ setupUI(
144+ isSignedIn = firebaseAppDistribution.isTesterSignedIn, isUpdateAvailable = false )
145+ }
146+
147+ updateAppButton.setOnClickListener {
148+ setProgressBar()
149+ firebaseAppDistribution
150+ .updateApp()
151+ .addOnProgressListener { progressListener(it) }
152+ .addOnCanceledListener {
153+ setupUI(
154+ isSignedIn = firebaseAppDistribution.isTesterSignedIn,
155+ isUpdateAvailable = false )
156+ }
157+ }
41158
42- // Start the second activity
43- // Handler().postDelayed(Runnable {
44- // startSecondActivity()
45- // }, 5000)
46-
47- /* * Advanced Configuration */
48- // val signInButton = findViewById<AppCompatButton>(R.id.sign_in_button)
49- // val checkForUpdateButton = findViewById<AppCompatButton>(R.id.check_for_update)
50- // val updateAppButton = findViewById<AppCompatButton>(R.id.update_app)
51- // val signOutButton = findViewById<AppCompatButton>(R.id.sign_out)
52- //
53- // signOutButton.setOnClickListener {
54- // firebaseAppDistribution.signOutTester()
55- // setupUI(
56- // isSignedIn = firebaseAppDistribution.isTesterSignedIn,
57- // isUpdateAvailable = false
58- // )
59- // }
60- //
61- // signInButton.setOnClickListener {
62- // firebaseAppDistribution.signInTester().addOnSuccessListener {
63- // setupUI(isSignedIn = true, isUpdateAvailable = false)
64- // }
65- // }
66- //
67- // checkForUpdateButton.setOnClickListener {
68- // firebaseAppDistribution.checkForNewRelease().addOnSuccessListener {
69- // setupUI(isSignedIn = true, isUpdateAvailable = it != null, release = it)
70- // }
71- // }
72- //
73- // updateAppButton.setOnClickListener {
74- // val progressBar = findViewById<ProgressBar>(R.id.progress_bar)
75- // val progressPercent = findViewById<TextView>(R.id.progress_percentage)
76- // progressBar.visibility = View.VISIBLE
77- // progressPercent.visibility = View.VISIBLE
78- // progressBar.isIndeterminate = false
79- // firebaseAppDistribution.updateApp().addOnProgressListener {
80- // progressBar.isIndeterminate = false
81- // val percentage = ((it.apkBytesDownloaded * 100) / it.apkFileTotalBytes).toInt()
82- // progressBar.setProgress(percentage, true)
83- // progressPercent.text = "$percentage %"
84- // }
85- // }
159+ updateAppButtonBackground.setOnClickListener {
160+ setProgressBar()
161+ executorService.execute {
162+ firebaseAppDistribution.updateApp().addOnProgressListener { progressListener(it) }
163+ }
164+ }
86165 }
87166
88167 fun startSecondActivity () {
89168 val intent = Intent (this , SecondActivity ::class .java)
90169 startActivity(intent)
91170 }
92171
172+ fun setProgressBar () {
173+ progressBar.visibility = View .VISIBLE
174+ progressPercent.visibility = View .VISIBLE
175+ progressBar.isIndeterminate = false
176+ }
177+
178+ fun failureListener (exception : Exception ) {
179+ val ex = exception as com.google.firebase.appdistribution.FirebaseAppDistributionException
180+ Log .d(" FirebaseAppDistribution" , " MAINACTIVITY:ERROR ERROR. CODE: " + exception.errorCode)
181+ AlertDialog .Builder (this )
182+ .setTitle(" Error updating to new release" )
183+ .setMessage(" ${ex.message} : ${ex.errorCode} " )
184+ .setNeutralButton(" Okay" ) { dialog, _ -> dialog.dismiss() }
185+ .show()
186+ }
187+
188+ fun progressListener (updateProgress : UpdateProgress ) {
189+ val percentage =
190+ ((updateProgress.apkBytesDownloaded * 100 ) / updateProgress.apkFileTotalBytes).toInt()
191+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
192+ progressBar.setProgress(percentage, true )
193+ }
194+ progressPercent.text = " $percentage %"
195+ }
196+
93197 private fun setupUI (
94198 isSignedIn : Boolean ,
95199 isUpdateAvailable : Boolean ,
96200 release : AppDistributionRelease ? = null
97201 ) {
98- val signInStatus = findViewById<TextView >(R .id.sign_in_status)
99- val signInButton = findViewById<AppCompatButton >(R .id.sign_in_button)
100- val checkForUpdateButton = findViewById<AppCompatButton >(R .id.check_for_update)
101- val updateAppButton = findViewById<AppCompatButton >(R .id.update_app)
102- val progressBar = findViewById<ProgressBar >(R .id.progress_bar)
103- val progressPercentage = findViewById<TextView >(R .id.progress_percentage)
104-
105- if (! isSignedIn) {
106- signInStatus.text = " Not Signed In"
107- signInButton.visibility = View .VISIBLE
108- checkForUpdateButton.visibility = View .GONE
109- updateAppButton.visibility = View .GONE
110- progressBar.visibility = View .GONE
111- progressPercentage.visibility = View .GONE
112- return
113- }
114-
115- if (isSignedIn && ! isUpdateAvailable) {
116- signInStatus.text = " Tester signed In!"
202+ progressBar.visibility = View .GONE
203+ progressPercentage.visibility = View .GONE
204+ if (isUpdateAvailable) {
205+ signInStatus.text =
206+ " Release available - ${release?.displayVersion} (${release?.versionCode} )"
117207 signInButton.visibility = View .GONE
118- checkForUpdateButton.visibility = View .VISIBLE
119- updateAppButton.visibility = View .GONE
208+ signInButtonBackground.visibility = View .GONE
209+ checkForUpdateButton.visibility = View .GONE
210+ checkForUpdateButtonBackground.visibility = View .GONE
211+ updateAppButton.visibility = View .VISIBLE
212+ updateAppButtonBackground.visibility = View .VISIBLE
213+ signOutButton.visibility = View .VISIBLE
120214 progressBar.visibility = View .GONE
121- progressPercentage .visibility = View .GONE
215+ signOutButtonBackground .visibility = View .VISIBLE
122216 return
123217 }
124218
125- signInStatus.text =
126- " Release available - ${release?.displayVersion} (${release?.versionCode} )"
127- signInButton.visibility = View .GONE
128- checkForUpdateButton.visibility = View .GONE
129- updateAppButton.visibility = View .VISIBLE
130- progressBar.visibility = View .GONE
131- progressPercentage.visibility = View .GONE
219+ signInStatus.text = if (isSignedIn) " Tester signed In!" else " Not Signed In"
220+ signInButton.visibility = if (isSignedIn) View .GONE else View .VISIBLE
221+ signInButtonBackground.visibility = if (isSignedIn) View .GONE else View .VISIBLE
222+ signOutButton.visibility = if (isSignedIn) View .VISIBLE else View .GONE
223+ signOutButtonBackground.visibility = if (isSignedIn) View .VISIBLE else View .GONE
224+ checkForUpdateButton.visibility = if (isSignedIn) View .VISIBLE else View .GONE
225+ checkForUpdateButtonBackground.visibility = if (isSignedIn) View .VISIBLE else View .GONE
226+ updateAppButton.visibility = if (isSignedIn) View .VISIBLE else View .GONE
227+ updateAppButtonBackground.visibility = if (isSignedIn) View .VISIBLE else View .GONE
228+ updateAppButton.visibility = View .GONE
229+ updateAppButtonBackground.visibility = View .GONE
132230 }
133231}
0 commit comments