31
31
#include " admob/src/include/firebase/admob/banner_view.h"
32
32
#include " admob/src/include/firebase/admob/types.h"
33
33
#include " app/src/assert.h"
34
- #include " app/src/semaphore.h"
35
34
#include " app/src/util_android.h"
36
35
37
36
namespace firebase {
@@ -142,23 +141,17 @@ BannerViewInternalAndroid::BannerViewInternalAndroid(BannerView* base)
142
141
env->DeleteLocalRef (helper_ref);
143
142
}
144
143
145
- void DestroyOnDeleteCallback (const Future<void >& result, void * sem_data) {
146
- if (sem_data != nullptr ) {
147
- Semaphore* semaphore = static_cast <Semaphore*>(sem_data);
148
- semaphore->Post ();
149
- }
150
- }
151
-
152
144
BannerViewInternalAndroid::~BannerViewInternalAndroid () {
153
145
firebase::MutexLock lock (mutex_);
154
-
155
- Semaphore semaphore (0 );
156
- InvokeNullary (kBannerViewFnDestroyOnDelete , banner_view_helper::kDestroy )
157
- .OnCompletion (DestroyOnDeleteCallback, &semaphore);
158
- semaphore.Wait ();
159
-
160
146
JNIEnv* env = ::firebase::admob::GetJNI ();
161
147
148
+ // The application should have invoked Destroy already, but
149
+ // invoke it now just in case they haven't in the hope that
150
+ // we can prevent leaking memory.
151
+ env->CallVoidMethod (
152
+ helper_, banner_view_helper::GetMethodId (banner_view_helper::kDestroy ),
153
+ /* callbackDataPtr=*/ nullptr , /* destructor_invocation=*/ true );
154
+
162
155
env->DeleteGlobalRef (ad_view_);
163
156
ad_view_ = nullptr ;
164
157
@@ -257,16 +250,19 @@ Future<void> BannerViewInternalAndroid::Initialize(AdParent parent,
257
250
if (initialized_) {
258
251
const SafeFutureHandle<void > future_handle =
259
252
future_data_.future_impl .SafeAlloc <void >(kBannerViewFnInitialize );
253
+ Future<void > future = MakeFuture (&future_data_.future_impl , future_handle);
260
254
CompleteFuture (kAdMobErrorAlreadyInitialized ,
261
255
kAdAlreadyInitializedErrorMessage , future_handle,
262
256
&future_data_);
263
- return MakeFuture (&future_data_. future_impl , future_handle) ;
257
+ return future ;
264
258
}
265
259
266
260
initialized_ = true ;
267
261
268
262
FutureCallbackData<void >* callback_data =
269
263
CreateVoidFutureCallbackData (kBannerViewFnSetPosition , &future_data_);
264
+ Future<void > future =
265
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
270
266
271
267
JNIEnv* env = ::firebase::admob::GetJNI ();
272
268
FIREBASE_ASSERT (env);
@@ -281,8 +277,7 @@ Future<void> BannerViewInternalAndroid::Initialize(AdParent parent,
281
277
call_data->callback_data = callback_data;
282
278
util::RunOnMainThread (env, activity, InitializeBannerViewOnMainThread,
283
279
call_data);
284
-
285
- return MakeFuture (&future_data_.future_impl , callback_data->future_handle );
280
+ return future;
286
281
}
287
282
288
283
// This function is run on the main thread and is called in the
@@ -324,7 +319,8 @@ Future<AdResult> BannerViewInternalAndroid::LoadAd(const AdRequest& request) {
324
319
325
320
FutureCallbackData<AdResult>* callback_data =
326
321
CreateAdResultFutureCallbackData (kBannerViewFnLoadAd , &future_data_);
327
- SafeFutureHandle<AdResult> future_handle = callback_data->future_handle ;
322
+ Future<AdResult> future =
323
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
328
324
329
325
LoadAdOnMainThreadData* call_data = new LoadAdOnMainThreadData ();
330
326
call_data->ad_request = request;
@@ -334,7 +330,7 @@ Future<AdResult> BannerViewInternalAndroid::LoadAd(const AdRequest& request) {
334
330
jobject activity = ::firebase::admob::GetActivity ();
335
331
util::RunOnMainThread (env, activity, LoadAdOnMainThread, call_data);
336
332
337
- return MakeFuture (&future_data_. future_impl , future_handle) ;
333
+ return future ;
338
334
}
339
335
340
336
BoundingBox BannerViewInternalAndroid::bounding_box () const {
@@ -390,21 +386,29 @@ Future<void> BannerViewInternalAndroid::Resume() {
390
386
391
387
Future<void > BannerViewInternalAndroid::Destroy () {
392
388
firebase::MutexLock lock (mutex_);
393
- return InvokeNullary (kBannerViewFnDestroy , banner_view_helper::kDestroy );
389
+ FutureCallbackData<void >* callback_data =
390
+ CreateVoidFutureCallbackData (kBannerViewFnDestroy , &future_data_);
391
+ Future<void > future =
392
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
393
+ ::firebase::admob::GetJNI ()->CallVoidMethod(
394
+ helper_, banner_view_helper::GetMethodId(banner_view_helper::kDestroy ),
395
+ reinterpret_cast<jlong>(callback_data), /* destructor_invocation=*/ false);
396
+ return future;
394
397
}
395
398
396
399
Future<void > BannerViewInternalAndroid::SetPosition (int x, int y) {
397
400
firebase::MutexLock lock (mutex_);
398
401
399
402
FutureCallbackData<void >* callback_data =
400
403
CreateVoidFutureCallbackData (kBannerViewFnSetPosition , &future_data_);
401
- SafeFutureHandle<void > future_handle = callback_data->future_handle ;
404
+ Future<void > future =
405
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
402
406
403
407
::firebase::admob::GetJNI ()->CallVoidMethod(
404
408
helper_, banner_view_helper::GetMethodId(banner_view_helper::kMoveToXY ),
405
409
reinterpret_cast<jlong>(callback_data), x, y);
406
410
407
- return MakeFuture (&future_data_. future_impl , future_handle) ;
411
+ return future ;
408
412
}
409
413
410
414
Future<void > BannerViewInternalAndroid::SetPosition (
@@ -413,14 +417,15 @@ Future<void> BannerViewInternalAndroid::SetPosition(
413
417
414
418
FutureCallbackData<void >* callback_data =
415
419
CreateVoidFutureCallbackData (kBannerViewFnSetPosition , &future_data_);
416
- SafeFutureHandle<void > future_handle = callback_data->future_handle ;
420
+ Future<void > future =
421
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
417
422
418
423
::firebase::admob::GetJNI ()->CallVoidMethod(
419
424
helper_,
420
425
banner_view_helper::GetMethodId (banner_view_helper::kMoveToPosition ),
421
426
reinterpret_cast<jlong>(callback_data), static_cast<int>(position));
422
427
423
- return MakeFuture(&future_data_.future_impl, future_handle) ;
428
+ return future ;
424
429
}
425
430
426
431
// This function is run on the main thread and is called in the
@@ -449,7 +454,8 @@ Future<void> BannerViewInternalAndroid::InvokeNullary(
449
454
450
455
FutureCallbackData<void >* callback_data =
451
456
CreateVoidFutureCallbackData (fn, &future_data_);
452
- SafeFutureHandle<void > future_handle = callback_data->future_handle ;
457
+ Future<void > future =
458
+ MakeFuture (&future_data_.future_impl , callback_data->future_handle );
453
459
454
460
NulleryInvocationOnMainThreadData* call_data =
455
461
new NulleryInvocationOnMainThreadData ();
@@ -459,7 +465,7 @@ Future<void> BannerViewInternalAndroid::InvokeNullary(
459
465
460
466
util::RunOnMainThread (env, activity, InvokeNulleryOnMainThread, call_data);
461
467
462
- return MakeFuture (&future_data_. future_impl , future_handle) ;
468
+ return future ;
463
469
}
464
470
465
471
} // namespace internal
0 commit comments