1
1
#include " firestore/src/android/listener_registration_android.h"
2
2
3
3
#include " app/src/assert.h"
4
- #include " app /src/util_android .h"
4
+ #include " firestore /src/android/firestore_android .h"
5
5
#include " firestore/src/include/firebase/firestore/listener_registration.h"
6
+ #include " firestore/src/jni/env.h"
7
+ #include " firestore/src/jni/loader.h"
6
8
7
9
namespace firebase {
8
10
namespace firestore {
11
+ namespace {
9
12
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
+ }
16
26
17
27
ListenerRegistrationInternal::ListenerRegistrationInternal (
18
28
FirestoreInternal* firestore,
19
29
EventListener<DocumentSnapshot>* event_listener, bool owning_event_listener,
20
- jobject listener_registration)
30
+ const Object& listener_registration)
21
31
: firestore_(firestore),
22
- listener_registration_ (
23
- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
32
+ listener_registration_ (listener_registration),
24
33
document_event_listener_(event_listener),
25
34
owning_event_listener_(owning_event_listener) {
26
35
FIREBASE_ASSERT (firestore != nullptr );
27
36
FIREBASE_ASSERT (event_listener != nullptr );
28
- FIREBASE_ASSERT (listener_registration != nullptr );
37
+ FIREBASE_ASSERT (listener_registration);
29
38
30
39
firestore->RegisterListenerRegistration (this );
31
40
}
32
41
33
42
ListenerRegistrationInternal::ListenerRegistrationInternal (
34
43
FirestoreInternal* firestore, EventListener<QuerySnapshot>* event_listener,
35
- bool owning_event_listener, jobject listener_registration)
44
+ bool owning_event_listener, const Object& listener_registration)
36
45
: firestore_(firestore),
37
- listener_registration_(
38
- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
46
+ listener_registration_(listener_registration),
39
47
query_event_listener_(event_listener),
40
48
owning_event_listener_(owning_event_listener) {
41
49
FIREBASE_ASSERT (firestore != nullptr );
42
50
FIREBASE_ASSERT (event_listener != nullptr );
43
- FIREBASE_ASSERT (listener_registration != nullptr );
51
+ FIREBASE_ASSERT (listener_registration);
44
52
45
53
firestore->RegisterListenerRegistration (this );
46
54
}
47
55
48
56
ListenerRegistrationInternal::ListenerRegistrationInternal (
49
57
FirestoreInternal* firestore, EventListener<void >* event_listener,
50
- bool owning_event_listener, jobject listener_registration)
58
+ bool owning_event_listener, const Object& listener_registration)
51
59
: firestore_(firestore),
52
- listener_registration_(
53
- firestore->app ()->GetJNIEnv()->NewGlobalRef(listener_registration)),
60
+ listener_registration_(listener_registration),
54
61
void_event_listener_(event_listener),
55
62
owning_event_listener_(owning_event_listener) {
56
63
FIREBASE_ASSERT (firestore != nullptr );
57
64
FIREBASE_ASSERT (event_listener != nullptr );
58
- FIREBASE_ASSERT (listener_registration != nullptr );
65
+ FIREBASE_ASSERT (listener_registration);
59
66
60
67
firestore->RegisterListenerRegistration (this );
61
68
}
@@ -64,18 +71,14 @@ ListenerRegistrationInternal::ListenerRegistrationInternal(
64
71
// FirestoreInternal will hold the lock and unregister all of them. So we do not
65
72
// call UnregisterListenerRegistration explicitly here.
66
73
ListenerRegistrationInternal::~ListenerRegistrationInternal () {
67
- if (listener_registration_ == nullptr ) {
74
+ if (! listener_registration_) {
68
75
return ;
69
76
}
70
77
71
78
// 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 ();
79
82
80
83
// de-allocate owning EventListener object.
81
84
if (owning_event_listener_) {
@@ -85,21 +88,7 @@ ListenerRegistrationInternal::~ListenerRegistrationInternal() {
85
88
}
86
89
}
87
90
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 (); }
103
92
104
93
} // namespace firestore
105
94
} // namespace firebase
0 commit comments