11#include " firestore/src/android/write_batch_android.h"
22
3- #include < jni.h>
4-
5- #include < utility>
6-
7- #include " app/src/util_android.h"
83#include " firestore/src/android/document_reference_android.h"
94#include " firestore/src/android/field_path_android.h"
105#include " firestore/src/android/field_value_android.h"
116#include " firestore/src/android/set_options_android.h"
12- #include " firestore/src/android/util_android.h"
137#include " firestore/src/jni/env.h"
148#include " firestore/src/jni/hash_map.h"
9+ #include " firestore/src/jni/loader.h"
1510
1611namespace firebase {
1712namespace firestore {
@@ -20,33 +15,35 @@ namespace {
2015using jni::Env;
2116using jni::HashMap;
2217using jni::Local;
18+ using jni::Method;
2319using jni::Object;
2420
21+ constexpr char kClassName [] =
22+ PROGUARD_KEEP_CLASS " com/google/firebase/firestore/WriteBatch" ;
23+ Method<Object> kSet (
24+ " set" ,
25+ " (Lcom/google/firebase/firestore/DocumentReference;Ljava/lang/Object;"
26+ " Lcom/google/firebase/firestore/SetOptions;)"
27+ " Lcom/google/firebase/firestore/WriteBatch;" );
28+ Method<Object> kUpdate (
29+ " update" ,
30+ " (Lcom/google/firebase/firestore/DocumentReference;Ljava/util/Map;)"
31+ " Lcom/google/firebase/firestore/WriteBatch;" );
32+ Method<Object> kUpdateVarargs (
33+ " update" ,
34+ " (Lcom/google/firebase/firestore/DocumentReference;"
35+ " Lcom/google/firebase/firestore/FieldPath;Ljava/lang/Object;"
36+ " [Ljava/lang/Object;)Lcom/google/firebase/firestore/WriteBatch;" );
37+ Method<Object> kDelete (" delete" ,
38+ " (Lcom/google/firebase/firestore/DocumentReference;)"
39+ " Lcom/google/firebase/firestore/WriteBatch;" );
40+ Method<Object> kCommit (" commit" , " ()Lcom/google/android/gms/tasks/Task;" );
41+
2542} // namespace
2643
27- // clang-format off
28- #define WRITE_BATCH_METHODS (X ) \
29- X (Set, " set" , \
30- " (Lcom/google/firebase/firestore/DocumentReference;Ljava/lang/Object;" \
31- " Lcom/google/firebase/firestore/SetOptions;)" \
32- " Lcom/google/firebase/firestore/WriteBatch;" ), \
33- X (Update, " update" , \
34- " (Lcom/google/firebase/firestore/DocumentReference;Ljava/util/Map;)" \
35- " Lcom/google/firebase/firestore/WriteBatch;" ), \
36- X (UpdateVarargs, " update" , \
37- " (Lcom/google/firebase/firestore/DocumentReference;" \
38- " Lcom/google/firebase/firestore/FieldPath;Ljava/lang/Object;" \
39- " [Ljava/lang/Object;)Lcom/google/firebase/firestore/WriteBatch;" ), \
40- X (Delete, " delete" , " (Lcom/google/firebase/firestore/DocumentReference;)" \
41- " Lcom/google/firebase/firestore/WriteBatch;" ), \
42- X (Commit, " commit" , " ()Lcom/google/android/gms/tasks/Task;" )
43- // clang-format on
44-
45- METHOD_LOOKUP_DECLARATION (write_batch, WRITE_BATCH_METHODS)
46- METHOD_LOOKUP_DEFINITION (write_batch,
47- PROGUARD_KEEP_CLASS
48- " com/google/firebase/firestore/WriteBatch" ,
49- WRITE_BATCH_METHODS)
44+ void WriteBatchInternal::Initialize (jni::Loader& loader) {
45+ loader.LoadClass (kClassName , kSet , kUpdate , kUpdateVarargs , kDelete , kCommit );
46+ }
5047
5148void WriteBatchInternal::Set (const DocumentReference& document,
5249 const MapFieldValue& data,
@@ -55,19 +52,15 @@ void WriteBatchInternal::Set(const DocumentReference& document,
5552 Local<HashMap> java_data = MakeJavaMap (env, data);
5653 Local<Object> java_options = SetOptionsInternal::Create (env, options);
5754
58- // Returned value is just Java `this` and can be ignored.
59- env.Call <Object>(obj_, write_batch::GetMethodId (write_batch::kSet ),
60- document.internal_ ->ToJava (), java_data, java_options);
55+ env.Call (obj_, kSet , ToJni (document), java_data, java_options);
6156}
6257
6358void WriteBatchInternal::Update (const DocumentReference& document,
6459 const MapFieldValue& data) {
6560 Env env = GetEnv ();
6661 Local<HashMap> java_data = MakeJavaMap (env, data);
6762
68- // Returned value is just Java `this` and can be ignored.
69- env.Call <Object>(obj_, write_batch::GetMethodId (write_batch::kUpdate ),
70- document.internal_ ->ToJava (), java_data);
63+ env.Call (obj_, kUpdate , ToJni (document), java_data);
7164}
7265
7366void WriteBatchInternal::Update (const DocumentReference& document,
@@ -80,47 +73,23 @@ void WriteBatchInternal::Update(const DocumentReference& document,
8073 Env env = GetEnv ();
8174 UpdateFieldPathArgs args = MakeUpdateFieldPathArgs (env, data);
8275
83- // Returned value is just Java `this` and can be ignored.
84- env.Call <Object>(obj_, write_batch::GetMethodId (write_batch::kUpdateVarargs ),
85- document.internal_ ->ToJava (), args.first_field ,
86- args.first_value , args.varargs );
76+ env.Call (obj_, kUpdateVarargs , ToJni (document), args.first_field ,
77+ args.first_value , args.varargs );
8778}
8879
8980void WriteBatchInternal::Delete (const DocumentReference& document) {
90- JNIEnv* env = firestore_->app ()->GetJNIEnv ();
91-
92- env->CallObjectMethod (obj_, write_batch::GetMethodId (write_batch::kDelete ),
93- document.internal_ ->java_object ());
94- CheckAndClearJniExceptions (env);
81+ Env env = GetEnv ();
82+ env.Call (obj_, kDelete , ToJni (document));
9583}
9684
9785Future<void > WriteBatchInternal::Commit () {
98- JNIEnv* env = firestore_->app ()->GetJNIEnv ();
99- jobject task = env->CallObjectMethod (
100- obj_, write_batch::GetMethodId (write_batch::kCommit ));
101- CheckAndClearJniExceptions (env);
102-
103- auto promise = promises_.MakePromise <void >();
104- promise.RegisterForTask (WriteBatchFn::kCommit , task);
105- env->DeleteLocalRef (task);
106- CheckAndClearJniExceptions (env);
107- return promise.GetFuture ();
108- }
109-
110- /* static */
111- bool WriteBatchInternal::Initialize (App* app) {
112- JNIEnv* env = app->GetJNIEnv ();
113- jobject activity = app->activity ();
114- bool result = write_batch::CacheMethodIds (env, activity);
115- util::CheckAndClearJniExceptions (env);
116- return result;
86+ Env env = GetEnv ();
87+ Local<Object> task = env.Call (obj_, kCommit );
88+ return promises_.NewFuture <void >(env, AsyncFn::kCommit , task);
11789}
11890
119- /* static */
120- void WriteBatchInternal::Terminate (App* app) {
121- JNIEnv* env = app->GetJNIEnv ();
122- write_batch::ReleaseClass (env);
123- util::CheckAndClearJniExceptions (env);
91+ jni::Object WriteBatchInternal::ToJni (const DocumentReference& reference) {
92+ return reference.internal_ ? reference.internal_ ->ToJava () : jni::Object ();
12493}
12594
12695} // namespace firestore
0 commit comments