Skip to content

Commit 053c019

Browse files
committed
Some cleanup and better error handling
1 parent abeab3a commit 053c019

File tree

2 files changed

+30
-21
lines changed

2 files changed

+30
-21
lines changed

firebase-appdistribution/src/main/java/com/google/firebase/appdistribution/FirebaseAppDistributionLifecycleNotifier.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ interface OnActivityDestroyedListener {
8383
void onDestroyed(Activity activity);
8484
}
8585

86+
/**
87+
* Get a {@link Task} that will succeed with a result of the app's foregrounded {@link Activity},
88+
* when one is available.
89+
*
90+
* <p>The returned task will never fail. It will instead remain pending indefinitely until some
91+
* activity comes to the foreground.
92+
*/
8693
Task<Activity> getForegroundActivity() {
8794
synchronized (lock) {
8895
if (currentActivity != null) {

firebase-appdistribution/src/main/java/com/google/firebase/appdistribution/TesterSignInManager.java

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package com.google.firebase.appdistribution;
1616

1717
import static com.google.firebase.appdistribution.FirebaseAppDistributionException.Status.AUTHENTICATION_CANCELED;
18-
import static com.google.firebase.appdistribution.FirebaseAppDistributionException.Status.AUTHENTICATION_FAILURE;
1918
import static com.google.firebase.appdistribution.TaskUtils.combineWithResultOf;
2019
import static com.google.firebase.appdistribution.TaskUtils.safeSetTaskException;
2120
import static com.google.firebase.appdistribution.TaskUtils.safeSetTaskResult;
@@ -29,11 +28,13 @@
2928
import androidx.annotation.NonNull;
3029
import androidx.annotation.VisibleForTesting;
3130
import androidx.browser.customtabs.CustomTabsIntent;
31+
import com.google.android.gms.tasks.OnFailureListener;
3232
import com.google.android.gms.tasks.Task;
3333
import com.google.android.gms.tasks.TaskCompletionSource;
3434
import com.google.android.gms.tasks.Tasks;
3535
import com.google.firebase.FirebaseApp;
3636
import com.google.firebase.appdistribution.Constants.ErrorMessages;
37+
import com.google.firebase.appdistribution.FirebaseAppDistributionException.Status;
3738
import com.google.firebase.appdistribution.internal.InstallActivity;
3839
import com.google.firebase.appdistribution.internal.LogWrapper;
3940
import com.google.firebase.appdistribution.internal.SignInResultActivity;
@@ -107,20 +108,17 @@ void onActivityStarted(Activity activity) {
107108
return;
108109
} else {
109110
// Throw error if app reentered during sign in
110-
synchronized (signInTaskLock) {
111-
if (awaitingResultFromBrowser()) {
112-
LogWrapper.getInstance().e("App Resumed without sign in flow completing.");
113-
setSignInTaskCompletionError(
114-
new FirebaseAppDistributionException(
115-
Constants.ErrorMessages.AUTHENTICATION_CANCELED, AUTHENTICATION_CANCELED));
116-
}
111+
if (awaitingResultFromBrowser()) {
112+
LogWrapper.getInstance().e("App Resumed without sign in flow completing.");
113+
setSignInTaskCompletionError(
114+
new FirebaseAppDistributionException(
115+
Constants.ErrorMessages.AUTHENTICATION_CANCELED, AUTHENTICATION_CANCELED));
117116
}
118117
}
119118
}
120119

121120
@NonNull
122121
public Task<Void> signInTester() {
123-
124122
if (signInStorage.getSignInStatus()) {
125123
LogWrapper.getInstance().v(TAG + "Tester is already signed in.");
126124
return Tasks.forResult(null);
@@ -140,6 +138,7 @@ public Task<Void> signInTester() {
140138
firebaseInstallationsApiProvider
141139
.get()
142140
.getId()
141+
.addOnFailureListener(handleTaskFailure(ErrorMessages.AUTHENTICATION_ERROR, Status.AUTHENTICATION_FAILURE))
143142
.onSuccessTask(combineWithResultOf(lifecycleNotifier.getForegroundActivity()))
144143
.addOnSuccessListener(
145144
fidAndActivity -> {
@@ -148,18 +147,22 @@ public Task<Void> signInTester() {
148147
hasBeenSentToBrowserForCurrentTask = true;
149148
}
150149
})
151-
.addOnFailureListener(
152-
e -> {
153-
LogWrapper.getInstance().e(TAG + "Fid retrieval failed.", e);
154-
setSignInTaskCompletionError(
155-
new FirebaseAppDistributionException(
156-
ErrorMessages.AUTHENTICATION_ERROR, AUTHENTICATION_FAILURE, e));
157-
});
150+
// No failures expected here, since getForegroundActivity() will wait indefinitely for a
151+
// foreground activity, but catch any unexpected failures to be safe.
152+
.addOnFailureListener(handleTaskFailure(ErrorMessages.UNKNOWN_ERROR, Status.UNKNOWN));
158153

159154
return signInTaskCompletionSource.getTask();
160155
}
161156
}
162157

158+
private OnFailureListener handleTaskFailure(String message, Status status) {
159+
return e -> {
160+
LogWrapper.getInstance().e(TAG + message, e);
161+
setSignInTaskCompletionError(
162+
new FirebaseAppDistributionException(message, status, e));
163+
};
164+
}
165+
163166
private boolean awaitingResultFromBrowser() {
164167
synchronized (signInTaskLock) {
165168
return signInTaskCompletionSource != null
@@ -168,15 +171,15 @@ private boolean awaitingResultFromBrowser() {
168171
}
169172
}
170173

171-
private void setSuccessfulSignInResult() {
174+
private void setSignInTaskCompletionError(FirebaseAppDistributionException e) {
172175
synchronized (signInTaskLock) {
173-
safeSetTaskResult(signInTaskCompletionSource, null);
176+
safeSetTaskException(signInTaskCompletionSource, e);
174177
}
175178
}
176179

177-
private void setSignInTaskCompletionError(FirebaseAppDistributionException e) {
180+
private void setSuccessfulSignInResult() {
178181
synchronized (signInTaskLock) {
179-
safeSetTaskException(signInTaskCompletionSource, e);
182+
safeSetTaskResult(signInTaskCompletionSource, null);
180183
}
181184
}
182185

@@ -207,7 +210,6 @@ private void openSignInFlowInBrowser(String fid, Activity activity) {
207210
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
208211
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
209212
customTabsIntent.launchUrl(activity, uri);
210-
211213
} else {
212214
// If we can't launch a chrome view try to launch anything that can handle a URL.
213215
Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);

0 commit comments

Comments
 (0)