14
14
15
15
package com .google .firebase .firestore .remote ;
16
16
17
+ import static com .google .firebase .firestore .util .Util .exceptionFromStatus ;
18
+
17
19
import android .content .Context ;
18
20
import android .os .Build ;
19
21
import androidx .annotation .Nullable ;
20
22
import com .google .android .gms .tasks .Task ;
23
+ import com .google .android .gms .tasks .TaskCompletionSource ;
21
24
import com .google .firebase .firestore .FirebaseFirestoreException ;
22
25
import com .google .firebase .firestore .auth .CredentialsProvider ;
23
26
import com .google .firebase .firestore .auth .User ;
36
39
import io .grpc .Status ;
37
40
import java .util .ArrayList ;
38
41
import java .util .Arrays ;
42
+ import java .util .Collections ;
39
43
import java .util .HashMap ;
40
44
import java .util .HashSet ;
41
45
import java .util .List ;
@@ -170,21 +174,18 @@ public Task<List<MutableDocument>> lookup(List<DocumentKey> keys) {
170
174
for (DocumentKey key : keys ) {
171
175
builder .addDocuments (serializer .encodeKey (key ));
172
176
}
173
- return channel
174
- .runStreamingResponseRpc (FirestoreGrpc .getBatchGetDocumentsMethod (), builder .build ())
175
- .continueWith (
176
- workerQueue .getExecutor (),
177
- task -> {
178
- if (!task .isSuccessful ()) {
179
- if (task .getException () instanceof FirebaseFirestoreException
180
- && ((FirebaseFirestoreException ) task .getException ()).getCode ()
181
- == FirebaseFirestoreException .Code .UNAUTHENTICATED ) {
182
- channel .invalidateToken ();
183
- }
184
- }
177
+ List <BatchGetDocumentsResponse > responses = new ArrayList <>();
178
+ TaskCompletionSource <List <MutableDocument >> completionSource = new TaskCompletionSource <>();
185
179
180
+ channel .runStreamingResponseRpc (
181
+ FirestoreGrpc .getBatchGetDocumentsMethod (),
182
+ builder .build (),
183
+ new FirestoreChannel .StreamingListener <BatchGetDocumentsResponse >() {
184
+ @ Override
185
+ public void onMessage (BatchGetDocumentsResponse message ) {
186
+ responses .add (message );
187
+ if (responses .size () == keys .size ()) {
186
188
Map <DocumentKey , MutableDocument > resultMap = new HashMap <>();
187
- List <BatchGetDocumentsResponse > responses = task .getResult ();
188
189
for (BatchGetDocumentsResponse response : responses ) {
189
190
MutableDocument doc = serializer .decodeMaybeDocument (response );
190
191
resultMap .put (doc .getKey (), doc );
@@ -193,8 +194,25 @@ public Task<List<MutableDocument>> lookup(List<DocumentKey> keys) {
193
194
for (DocumentKey key : keys ) {
194
195
results .add (resultMap .get (key ));
195
196
}
196
- return results ;
197
- });
197
+ completionSource .trySetResult (results );
198
+ }
199
+ }
200
+
201
+ @ Override
202
+ public void onClose (Status status ) {
203
+ if (status .isOk ()) {
204
+ completionSource .trySetResult (Collections .emptyList ());
205
+ } else {
206
+ FirebaseFirestoreException exception = exceptionFromStatus (status );
207
+ if (exception .getCode () == FirebaseFirestoreException .Code .UNAUTHENTICATED ) {
208
+ channel .invalidateToken ();
209
+ }
210
+ completionSource .trySetException (exception );
211
+ }
212
+ }
213
+ });
214
+
215
+ return completionSource .getTask ();
198
216
}
199
217
200
218
/**
0 commit comments