diff --git a/firebase-installations/src/androidTest/java/com/google/firebase/installations/FirebaseInstallationsInstrumentedTest.java b/firebase-installations/src/androidTest/java/com/google/firebase/installations/FirebaseInstallationsInstrumentedTest.java index a886f3c24bb..bd6ef7eb292 100644 --- a/firebase-installations/src/androidTest/java/com/google/firebase/installations/FirebaseInstallationsInstrumentedTest.java +++ b/firebase-installations/src/androidTest/java/com/google/firebase/installations/FirebaseInstallationsInstrumentedTest.java @@ -386,7 +386,7 @@ public void testGetAuthToken_PersistedFidError_failure() throws Exception { .isInstanceOf(FirebaseInstallationsException.class); assertWithMessage("Exception status doesn't match") .that(((FirebaseInstallationsException) expected.getCause()).getStatus()) - .isEqualTo(FirebaseInstallationsException.Status.SDK_INTERNAL_ERROR); + .isEqualTo(FirebaseInstallationsException.Status.CLIENT_ERROR); } } diff --git a/firebase-installations/src/main/java/com/google/firebase/installations/FirebaseInstallations.java b/firebase-installations/src/main/java/com/google/firebase/installations/FirebaseInstallations.java index ce1f7de3ac3..7eebd24933e 100644 --- a/firebase-installations/src/main/java/com/google/firebase/installations/FirebaseInstallations.java +++ b/firebase-installations/src/main/java/com/google/firebase/installations/FirebaseInstallations.java @@ -197,6 +197,19 @@ private void triggerOnStateReached(PersistedFidEntry persistedFidEntry) { } } + private void triggerOnException(PersistedFidEntry persistedFidEntry, Exception exception) { + synchronized (lock) { + Iterator it = listeners.iterator(); + while (it.hasNext()) { + StateListener l = it.next(); + boolean doneListening = l.onException(persistedFidEntry, exception); + if (doneListening) { + it.remove(); + } + } + } + } + private final void doRegistration() { try { PersistedFidEntry persistedFidEntry = persistedFid.readPersistedFidEntryValue(); @@ -248,7 +261,7 @@ private final void doRegistration() { .setRegistrationStatus(RegistrationStatus.REGISTER_ERROR) .build(); persistedFid.insertOrUpdatePersistedFidEntry(errorFidEntry); - triggerOnStateReached(errorFidEntry); + triggerOnException(errorFidEntry, e); } } diff --git a/firebase-installations/src/main/java/com/google/firebase/installations/GetAuthTokenListener.java b/firebase-installations/src/main/java/com/google/firebase/installations/GetAuthTokenListener.java index 583710ccddb..008daadbe65 100644 --- a/firebase-installations/src/main/java/com/google/firebase/installations/GetAuthTokenListener.java +++ b/firebase-installations/src/main/java/com/google/firebase/installations/GetAuthTokenListener.java @@ -42,12 +42,13 @@ public boolean onStateReached( .build()); return true; } + return false; + } + @Override + public boolean onException(PersistedFidEntry persistedFidEntry, Exception exception) { if (persistedFidEntry.isErrored()) { - resultTaskCompletionSource.setException( - new FirebaseInstallationsException( - "Firebase Installation is not registered.", - FirebaseInstallationsException.Status.SDK_INTERNAL_ERROR)); + resultTaskCompletionSource.trySetException(exception); return true; } return false; diff --git a/firebase-installations/src/main/java/com/google/firebase/installations/GetIdListener.java b/firebase-installations/src/main/java/com/google/firebase/installations/GetIdListener.java index b1b9036f0e0..2e24b97cc07 100644 --- a/firebase-installations/src/main/java/com/google/firebase/installations/GetIdListener.java +++ b/firebase-installations/src/main/java/com/google/firebase/installations/GetIdListener.java @@ -27,15 +27,16 @@ public GetIdListener(TaskCompletionSource taskCompletionSource) { @Override public boolean onStateReached(PersistedFidEntry persistedFidEntry, boolean unused) { if (persistedFidEntry.isUnregistered() || persistedFidEntry.isRegistered()) { - taskCompletionSource.setResult(persistedFidEntry.getFirebaseInstallationId()); + taskCompletionSource.trySetResult(persistedFidEntry.getFirebaseInstallationId()); return true; } + return false; + } + @Override + public boolean onException(PersistedFidEntry persistedFidEntry, Exception exception) { if (persistedFidEntry.isErrored()) { - taskCompletionSource.setException( - new FirebaseInstallationsException( - "Failed to update client side cache.", - FirebaseInstallationsException.Status.CLIENT_ERROR)); + taskCompletionSource.trySetException(exception); return true; } return false; diff --git a/firebase-installations/src/main/java/com/google/firebase/installations/StateListener.java b/firebase-installations/src/main/java/com/google/firebase/installations/StateListener.java index c839a107e87..a9691f63d18 100644 --- a/firebase-installations/src/main/java/com/google/firebase/installations/StateListener.java +++ b/firebase-installations/src/main/java/com/google/firebase/installations/StateListener.java @@ -17,5 +17,15 @@ import com.google.firebase.installations.local.PersistedFidEntry; interface StateListener { + /** + * Returns {@code true} if the defined {@link PersistedFidEntry} state is reached, {@code false} + * otherwise. + */ boolean onStateReached(PersistedFidEntry persistedFidEntry, boolean shouldRefreshAuthToken); + + /** + * Returns {@code true} if an exception is thrown while registering a Firebase Installation, + * {@code false} otherwise. + */ + boolean onException(PersistedFidEntry persistedFidEntry, Exception exception); }