diff --git a/android/src/main/java/io/invertase/firebase/firestore/DocumentSnapshotSerializeAsyncTask.java b/android/src/main/java/io/invertase/firebase/firestore/DocumentSnapshotSerializeAsyncTask.java new file mode 100644 index 00000000..ebf77162 --- /dev/null +++ b/android/src/main/java/io/invertase/firebase/firestore/DocumentSnapshotSerializeAsyncTask.java @@ -0,0 +1,47 @@ +package io.invertase.firebase.firestore; + +import android.os.AsyncTask; + +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.WritableMap; +import com.google.firebase.firestore.DocumentSnapshot; + +import java.lang.ref.WeakReference; + +class DocumentSnapshotSerializeAsyncTask extends AsyncTask { + private WeakReference reactContextWeakReference; + private WeakReference referenceWeakReference; + + DocumentSnapshotSerializeAsyncTask( + ReactContext context, + RNFirebaseFirestoreDocumentReference reference + ) { + referenceWeakReference = new WeakReference<>(reference); + reactContextWeakReference = new WeakReference<>(context); + } + + @Override + protected final WritableMap doInBackground(Object... params) { + DocumentSnapshot querySnapshot = (DocumentSnapshot) params[0]; + + try { + return FirestoreSerialize.snapshotToWritableMap(querySnapshot); + } catch (RuntimeException e) { + if (isAvailable()) { + reactContextWeakReference.get().handleException(e); + } else { + throw e; + } + return null; + } + } + + @Override + protected void onPostExecute(WritableMap writableMap) { + // do nothing as overridden on usage + } + + private Boolean isAvailable() { + return reactContextWeakReference.get() != null && referenceWeakReference.get() != null; + } +} diff --git a/android/src/main/java/io/invertase/firebase/firestore/QuerySnapshotSerializeAsyncTask.java b/android/src/main/java/io/invertase/firebase/firestore/QuerySnapshotSerializeAsyncTask.java new file mode 100644 index 00000000..4ddeab5f --- /dev/null +++ b/android/src/main/java/io/invertase/firebase/firestore/QuerySnapshotSerializeAsyncTask.java @@ -0,0 +1,47 @@ +package io.invertase.firebase.firestore; + +import android.os.AsyncTask; + +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.WritableMap; +import com.google.firebase.firestore.QuerySnapshot; + +import java.lang.ref.WeakReference; + +class QuerySnapshotSerializeAsyncTask extends AsyncTask { + private WeakReference reactContextWeakReference; + private WeakReference referenceWeakReference; + + QuerySnapshotSerializeAsyncTask( + ReactContext context, + RNFirebaseFirestoreCollectionReference reference + ) { + referenceWeakReference = new WeakReference<>(reference); + reactContextWeakReference = new WeakReference<>(context); + } + + @Override + protected final WritableMap doInBackground(Object... params) { + QuerySnapshot querySnapshot = (QuerySnapshot) params[0]; + + try { + return FirestoreSerialize.snapshotToWritableMap(querySnapshot); + } catch (RuntimeException e) { + if (isAvailable()) { + reactContextWeakReference.get().handleException(e); + } else { + throw e; + } + return null; + } + } + + @Override + protected void onPostExecute(WritableMap writableMap) { + // do nothing as overridden on usage + } + + private Boolean isAvailable() { + return reactContextWeakReference.get() != null && referenceWeakReference.get() != null; + } +}