Skip to content

Commit 3057375

Browse files
authored
Allow user to stop listening after shutdown + other minor fixes. (#701)
* Allow user to stop listening after shutdown + other minor fixes. * fix comment as well * add @hide to InstanceRegistry.
1 parent 1651017 commit 3057375

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

firebase-firestore/src/androidTest/java/com/google/firebase/firestore/FirestoreTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,22 @@ public void testShutdownCalledMultipleTimes() {
10991099
expectError(() -> waitFor(reference.get()), expectedMessage);
11001100
}
11011101

1102+
@Test
1103+
public void testCanStopListeningAfterShutdown() {
1104+
FirebaseFirestore instance = testFirestore();
1105+
DocumentReference reference = instance.document("abc/123");
1106+
EventAccumulator<DocumentSnapshot> eventAccumulator = new EventAccumulator<>();
1107+
ListenerRegistration registration = reference.addSnapshotListener(eventAccumulator.listener());
1108+
eventAccumulator.await();
1109+
1110+
waitFor(instance.shutdown());
1111+
1112+
// This should proceed without error.
1113+
registration.remove();
1114+
// Multiple calls should proceed as an effectively no-op.
1115+
registration.remove();
1116+
}
1117+
11021118
@Test
11031119
public void testWaitForPendingWritesResolves() {
11041120
DocumentReference documentReference = testCollection("abc").document("123");

firebase-firestore/src/main/java/com/google/firebase/firestore/FirebaseFirestore.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@
4949
*/
5050
public class FirebaseFirestore {
5151

52-
/** Provides a registry management interface for {@code FirebaseFirestore} instances. */
52+
/**
53+
* Provides a registry management interface for {@code FirebaseFirestore} instances.
54+
*
55+
* @hide
56+
*/
5357
public interface InstanceRegistry {
5458
/** Removes the Cloud Firestore instance with given name from registry. */
5559
void remove(@NonNull String databaseId);

firebase-firestore/src/main/java/com/google/firebase/firestore/core/EventManager.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,20 @@ public int addQueryListener(QueryListener queryListener) {
9393
return queryInfo.targetId;
9494
}
9595

96-
/** Removes a previously added listener and returns true if the listener was found. */
97-
public boolean removeQueryListener(QueryListener listener) {
96+
/** Removes a previously added listener. It's a no-op if the listener is not found. */
97+
public void removeQueryListener(QueryListener listener) {
9898
Query query = listener.getQuery();
9999
QueryListenersInfo queryInfo = queries.get(query);
100100
boolean lastListen = false;
101-
boolean found = false;
102101
if (queryInfo != null) {
103-
found = queryInfo.listeners.remove(listener);
102+
queryInfo.listeners.remove(listener);
104103
lastListen = queryInfo.listeners.isEmpty();
105104
}
106105

107106
if (lastListen) {
108107
queries.remove(query);
109108
syncEngine.stopListening(query);
110109
}
111-
112-
return found;
113110
}
114111

115112
@Override

firebase-firestore/src/main/java/com/google/firebase/firestore/core/FirestoreClient.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ public QueryListener listen(
165165

166166
/** Stops listening to a query previously listened to. */
167167
public void stopListening(QueryListener listener) {
168-
this.verifyNotShutdown();
169168
asyncQueue.enqueueAndForget(() -> eventManager.removeQueryListener(listener));
170169
}
171170

firebase-firestore/src/main/java/com/google/firebase/firestore/core/SyncEngine.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ public void handleRemoteEvent(RemoteEvent event) {
336336
/** Applies an OnlineState change to the sync engine and notifies any views of the change. */
337337
@Override
338338
public void handleOnlineStateChange(OnlineState onlineState) {
339+
assertCallback("handleOnlineStateChange");
339340
ArrayList<ViewSnapshot> newViewSnapshots = new ArrayList<>();
340341
for (Map.Entry<Query, QueryView> entry : queryViewsByQuery.entrySet()) {
341342
View view = entry.getValue().getView();

0 commit comments

Comments
 (0)