11#include " firestore/src/android/listener_registration_android.h"
22
33#include " app/src/assert.h"
4- #include " app /src/util_android .h"
4+ #include " firestore /src/android/firestore_android .h"
55#include " firestore/src/include/firebase/firestore/listener_registration.h"
6+ #include " firestore/src/jni/env.h"
7+ #include " firestore/src/jni/loader.h"
68
79namespace firebase {
810namespace firestore {
11+ namespace {
912
10- #define LISTENER_REGISTRATION_METHODS (X ) X(Remove, " remove" , " ()V" )
11- METHOD_LOOKUP_DECLARATION (listener_registration, LISTENER_REGISTRATION_METHODS)
12- METHOD_LOOKUP_DEFINITION (listener_registration,
13- PROGUARD_KEEP_CLASS
14- " com/google/firebase/firestore/ListenerRegistration" ,
15- LISTENER_REGISTRATION_METHODS)
13+ using jni::Env;
14+ using jni::Object;
15+
16+ constexpr char kClassName [] =
17+ PROGUARD_KEEP_CLASS " com/google/firebase/firestore/ListenerRegistration" ;
18+
19+ jni::Method<void > kRemove (" remove" , " ()V" );
20+
21+ } // namespace
22+
23+ void ListenerRegistrationInternal::Initialize (jni::Loader& loader) {
24+ loader.LoadClass (kClassName , kRemove );
25+ }
1626
1727ListenerRegistrationInternal::ListenerRegistrationInternal (
1828 FirestoreInternal* firestore,
1929 EventListener<DocumentSnapshot>* event_listener, bool owning_event_listener,
20- jobject listener_registration)
30+ const Object& listener_registration)
2131 : firestore_(firestore),
22- listener_registration_ (
23- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
32+ listener_registration_ (listener_registration),
2433 document_event_listener_(event_listener),
2534 owning_event_listener_(owning_event_listener) {
2635 FIREBASE_ASSERT (firestore != nullptr );
2736 FIREBASE_ASSERT (event_listener != nullptr );
28- FIREBASE_ASSERT (listener_registration != nullptr );
37+ FIREBASE_ASSERT (listener_registration);
2938
3039 firestore->RegisterListenerRegistration (this );
3140}
3241
3342ListenerRegistrationInternal::ListenerRegistrationInternal (
3443 FirestoreInternal* firestore, EventListener<QuerySnapshot>* event_listener,
35- bool owning_event_listener, jobject listener_registration)
44+ bool owning_event_listener, const Object& listener_registration)
3645 : firestore_(firestore),
37- listener_registration_(
38- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
46+ listener_registration_(listener_registration),
3947 query_event_listener_(event_listener),
4048 owning_event_listener_(owning_event_listener) {
4149 FIREBASE_ASSERT (firestore != nullptr );
4250 FIREBASE_ASSERT (event_listener != nullptr );
43- FIREBASE_ASSERT (listener_registration != nullptr );
51+ FIREBASE_ASSERT (listener_registration);
4452
4553 firestore->RegisterListenerRegistration (this );
4654}
4755
4856ListenerRegistrationInternal::ListenerRegistrationInternal (
4957 FirestoreInternal* firestore, EventListener<void >* event_listener,
50- bool owning_event_listener, jobject listener_registration)
58+ bool owning_event_listener, const Object& listener_registration)
5159 : firestore_(firestore),
52- listener_registration_(
53- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
60+ listener_registration_(listener_registration),
5461 void_event_listener_(event_listener),
5562 owning_event_listener_(owning_event_listener) {
5663 FIREBASE_ASSERT (firestore != nullptr );
5764 FIREBASE_ASSERT (event_listener != nullptr );
58- FIREBASE_ASSERT (listener_registration != nullptr );
65+ FIREBASE_ASSERT (listener_registration);
5966
6067 firestore->RegisterListenerRegistration (this );
6168}
@@ -64,18 +71,14 @@ ListenerRegistrationInternal::ListenerRegistrationInternal(
6471// FirestoreInternal will hold the lock and unregister all of them. So we do not
6572// call UnregisterListenerRegistration explicitly here.
6673ListenerRegistrationInternal::~ListenerRegistrationInternal () {
67- if (listener_registration_ == nullptr ) {
74+ if (! listener_registration_) {
6875 return ;
6976 }
7077
7178 // Remove listener and release java ListenerRegistration object.
72- JNIEnv* env = firestore_->app ()->GetJNIEnv ();
73- env->CallVoidMethod (
74- listener_registration_,
75- listener_registration::GetMethodId (listener_registration::kRemove ));
76- env->DeleteGlobalRef (listener_registration_);
77- util::CheckAndClearJniExceptions (env);
78- listener_registration_ = nullptr ;
79+ Env env = GetEnv ();
80+ env.Call (listener_registration_, kRemove );
81+ listener_registration_.clear ();
7982
8083 // de-allocate owning EventListener object.
8184 if (owning_event_listener_) {
@@ -85,21 +88,7 @@ ListenerRegistrationInternal::~ListenerRegistrationInternal() {
8588 }
8689}
8790
88- /* static */
89- bool ListenerRegistrationInternal::Initialize (App* app) {
90- JNIEnv* env = app->GetJNIEnv ();
91- jobject activity = app->activity ();
92- bool result = listener_registration::CacheMethodIds (env, activity);
93- util::CheckAndClearJniExceptions (env);
94- return result;
95- }
96-
97- /* static */
98- void ListenerRegistrationInternal::Terminate (App* app) {
99- JNIEnv* env = app->GetJNIEnv ();
100- listener_registration::ReleaseClass (env);
101- util::CheckAndClearJniExceptions (env);
102- }
91+ jni::Env ListenerRegistrationInternal::GetEnv () { return firestore_->GetEnv (); }
10392
10493} // namespace firestore
10594} // namespace firebase
0 commit comments