Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions firebase-installations/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Unreleased

- [fixed] FIDchangelistener not getting invoked when a FID is created.

# 19.1.0

- [fixed] Mitigated FIS ID duplication issue from backup data. (#7025)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,8 @@ private void doNetworkCallIfNecessary(boolean forceRefresh) {
// Store the prefs to persist the result of the previous step.
insertOrUpdatePrefs(updatedPrefs);

// Update FidListener if a fid has changed.
updateFidListener(prefs, updatedPrefs);
// Update FidListener if a fid is new or changed its registration to registered.
checkAndUpdateFidListeners(prefs, updatedPrefs);

prefs = updatedPrefs;

Expand All @@ -431,11 +431,24 @@ private void doNetworkCallIfNecessary(boolean forceRefresh) {
}
}

private synchronized void updateFidListener(
private boolean shouldNotifyFidListener(
PersistedInstallationEntry prefs, PersistedInstallationEntry updatedPrefs) {
if (fidListeners.size() != 0
&& !TextUtils.equals(
prefs.getFirebaseInstallationId(), updatedPrefs.getFirebaseInstallationId())) {
if (updatedPrefs.isRegistered()
&& !TextUtils.isEmpty(updatedPrefs.getFirebaseInstallationId())) {
if (!TextUtils.equals(
prefs.getFirebaseInstallationId(), updatedPrefs.getFirebaseInstallationId())) {
// Fid has changed
return true;
}
// A new FID is just registered/An errored FID got registered/re-registered.
return !prefs.isRegistered();
}
return false;
}

private synchronized void checkAndUpdateFidListeners(
PersistedInstallationEntry prefs, PersistedInstallationEntry updatedPrefs) {
if (!fidListeners.isEmpty() && shouldNotifyFidListener(prefs, updatedPrefs)) {
// Update all the registered FidListener about fid changes.
for (FidListener listener : fidListeners) {
listener.onFidChanged(updatedPrefs.getFirebaseInstallationId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,65 @@ public void testFidListener_fidChanged_successful() throws Exception {
assertNull(fidListener2.getLatestFid());
}

@Test
public void testFidListener_fidRegistered_sameFid_successful() throws Exception {
when(mockIidStore.readIid()).thenReturn(null);
when(mockIidStore.readToken()).thenReturn(null);
when(mockBackend.createFirebaseInstallation(
anyString(), anyString(), anyString(), anyString(), any()))
.thenReturn(TEST_INSTALLATION_RESPONSE);

FakeFidListener fidListener = new FakeFidListener();

// Register the FidListener
firebaseInstallations.registerFidListener(fidListener);

// Do the actual getId() call under test.
TestOnCompleteListener<String> onCompleteListener = new TestOnCompleteListener<>();
Task<String> task = firebaseInstallations.getId();

task.addOnCompleteListener(backgroundExecutor, onCompleteListener);
String fid = onCompleteListener.await();
assertWithMessage("getId Task failed.").that(fid).isEqualTo(TEST_FID_1);

// Waiting for Task that registers FID on the FIS Servers
backgroundExecutor.awaitTermination(500, TimeUnit.MILLISECONDS);
PersistedInstallationEntry entry = persistedInstallation.readPersistedInstallationEntryValue();
assertThat(entry.getFirebaseInstallationId()).isEqualTo(TEST_FID_1);

// Verify FidListener receives fid registration notification.
assertThat(fidListener.getLatestFid()).isEqualTo(TEST_FID_1);
}

@Test
public void testFidListener_alreadyRegistered_noFidChange_notNotified() throws Exception {
persistedInstallation.insertOrUpdatePersistedInstallationEntry(
PersistedInstallationEntry.INSTANCE.withRegisteredFid(
TEST_FID_1,
TEST_REFRESH_TOKEN,
utils.currentTimeInSecs(),
TEST_AUTH_TOKEN,
TEST_TOKEN_EXPIRATION_TIMESTAMP));

FakeFidListener fidListener = new FakeFidListener();

// Register the FidListener
firebaseInstallations.registerFidListener(fidListener);

// Do the actual getId() call under test.
TestOnCompleteListener<String> onCompleteListener = new TestOnCompleteListener<>();
Task<String> task = firebaseInstallations.getId();
task.addOnCompleteListener(backgroundExecutor, onCompleteListener);
String fid = onCompleteListener.await();
assertWithMessage("getId Task failed.").that(fid).isEqualTo(TEST_FID_1);

backgroundExecutor.awaitTermination(500, TimeUnit.MILLISECONDS);

// Verify FidListener does not receive any notification since the FID was already registered
// and didn't change.
assertNull(fidListener.getLatestFid());
}

@Test
public void testGetId_migrateIid_successful() throws Exception {
when(mockIidStore.readIid()).thenReturn(TEST_INSTANCE_ID_1);
Expand Down
Loading