Skip to content

Commit 9071ba7

Browse files
committed
update use of futures in initialization
1 parent 5f3a9ab commit 9071ba7

File tree

5 files changed

+62
-12
lines changed

5 files changed

+62
-12
lines changed

admob/integration_test/src/integration_test.cc

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ firebase::admob::AdRequest FirebaseAdMobTest::GetAdRequest() {
177177
}
178178

179179
// Test cases below.
180-
181180
TEST_F(FirebaseAdMobTest, TestGetAdRequest) { GetAdRequest(); }
182181

183182
// A simple listener to help test changes to a BannerView.
@@ -354,6 +353,29 @@ TEST_F(FirebaseAdMobTest, TestBannerView) {
354353
#endif
355354
}
356355

356+
TEST_F(FirebaseAdMobTest, TestBannerViewAlreadyInitialized) {
357+
static const int kBannerWidth = 320;
358+
static const int kBannerHeight = 50;
359+
360+
firebase::admob::AdSize banner_ad_size;
361+
banner_ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
362+
banner_ad_size.width = kBannerWidth;
363+
banner_ad_size.height = kBannerHeight;
364+
365+
firebase::admob::BannerView* banner = new firebase::admob::BannerView();
366+
367+
firebase::Future<void> first_initialize = banner->Initialize(
368+
app_framework::GetWindowContext(), kBannerAdUnit, banner_ad_size);
369+
firebase::Future<void> second_initialize = banner->Initialize(
370+
app_framework::GetWindowContext(), kBannerAdUnit, banner_ad_size);
371+
372+
WaitForCompletion(second_initialize, "Second Initialize",
373+
firebase::admob::kAdMobErrorAlreadyInitialized);
374+
WaitForCompletion(first_initialize, "First Initialize");
375+
376+
delete banner;
377+
}
378+
357379
// A simple listener to help test changes to a InterstitialAd.
358380
class TestInterstitialAdListener
359381
: public firebase::admob::InterstitialAd::Listener {

admob/src/android/banner_view_internal_android.cc

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,17 @@ void InitializeBannerViewOnMainThread(void* data) {
144144
JNIEnv* env = GetJNI();
145145
FIREBASE_ASSERT(env != nullptr);
146146

147-
jstring ad_unit_id_str = env->NewStringUTF(call_data->ad_unit_id.c_str());
147+
jstring ad_unit_id_str =
148+
static_cast<jstring>(::firebase::admob::GetJNI()->CallObjectMethod(
149+
call_data->ad_view, ad_view::GetMethodId(ad_view::kGetAdUnitId)));
150+
if (ad_unit_id_str != nullptr) {
151+
CompleteFuture(kAdMobErrorAlreadyInitialized, "",
152+
call_data->callback_data->future_handle,
153+
call_data->callback_data->future_data);
154+
return;
155+
}
156+
157+
ad_unit_id_str = env->NewStringUTF(call_data->ad_unit_id.c_str());
148158
env->CallVoidMethod(call_data->ad_view,
149159
ad_view::GetMethodId(ad_view::kSetAdUnitId),
150160
ad_unit_id_str);
@@ -206,11 +216,15 @@ Future<void> BannerViewInternalAndroid::Initialize(AdParent parent,
206216
CreateFutureCallbackData(&future_data_, kBannerViewFnInitialize);
207217

208218
if (initialized_) {
209-
CompleteFuture(kAdMobErrorAlreadyInitialized, "Ad is already initialized.",
210-
callback_data->future_handle, callback_data->future_data);
211-
return GetLastResult(kBannerViewFnInitialize);
219+
future_data_.future_impl.Complete(callback_data->future_handle,
220+
kAdMobErrorAlreadyInitialized,
221+
"Ad is already initialized.");
222+
return Future<void>(&future_data_.future_impl,
223+
callback_data->future_handle);
212224
}
213225

226+
initialized_ = true;
227+
214228
JNIEnv* env = ::firebase::admob::GetJNI();
215229
jobject activity = ::firebase::admob::GetActivity();
216230

admob/src/android/banner_view_internal_android.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ METHOD_LOOKUP_DECLARATION(banner_view_helper_ad_view_listener,
5353
// clang-format off
5454
#define AD_VIEW_METHODS(X) \
5555
X(Constructor, "<init>", "(Landroid/content/Context;)V"), \
56+
X(GetAdUnitId, "getAdUnitId", "()Ljava/lang/String;"), \
5657
X(SetAdSize, "setAdSize", "(Lcom/google/android/gms/ads/AdSize;)V"), \
57-
X(SetAdUnitId, "setAdUnitId", "(Ljava/lang/String;)V"), \
58+
X(SetAdUnitId, "setAdUnitId", "(Ljava/lang/String;)V"), \
5859
X(SetAdListener, "setAdListener", \
5960
"(Lcom/google/android/gms/ads/AdListener;)V")
6061
// clang-format on

admob/src/ios/banner_view_internal_ios.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class BannerViewInternalIOS : public BannerViewInternal {
5656
/// closures).
5757
FutureHandle future_handle_for_load_;
5858

59+
/// Prevents duplicate invocations of initailize on the BannerView.
60+
bool initialized_;
61+
5962
/// The FADBannerView object. Declared as an "id" type to avoid referencing an
6063
/// Objective-C++ class in this header.
6164
id banner_view_;

admob/src/ios/banner_view_internal_ios.mm

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
BannerViewInternalIOS::BannerViewInternalIOS(BannerView* base)
2929
: BannerViewInternal(base),
3030
future_handle_for_load_(ReferenceCountedFutureImpl::kInvalidHandle),
31+
initialized_(false),
3132
banner_view_(nil),
3233
destroy_mutex_(Mutex::kModeNonRecursive) {}
3334

@@ -39,15 +40,24 @@
3940

4041
Future<void> BannerViewInternalIOS::Initialize(AdParent parent, const char* ad_unit_id,
4142
AdSize size) {
42-
const firebase::FutureHandle handle = CreateFuture(kBannerViewFnInitialize, &future_data_);
43-
dispatch_async(dispatch_get_main_queue(), ^{
44-
banner_view_ = [[FADBannerView alloc] initWithView:parent
43+
FutureCallbackData* callback_data =
44+
CreateFutureCallbackData(&future_data_, kBannerViewFnInitialize);
45+
if(initialized_) {
46+
future_data_.future_impl.Complete(callback_data->future_handle,
47+
kAdMobErrorAlreadyInitialized,
48+
"Ad is already initialized.");
49+
} else {
50+
initialized_ = true;
51+
dispatch_async(dispatch_get_main_queue(), ^{
52+
banner_view_ = [[FADBannerView alloc] initWithView:parent
4553
adUnitID:@(ad_unit_id)
4654
adSize:size
4755
internalBannerView:this];
48-
CompleteFuture(kAdMobErrorNone, nullptr, handle, &future_data_);
49-
});
50-
return GetLastResult(kBannerViewFnInitialize);
56+
future_data_.future_impl.Complete(callback_data->future_handle,
57+
kAdMobErrorNone);
58+
});
59+
}
60+
return Future<void>(&future_data_.future_impl, callback_data->future_handle);
5161
}
5262

5363
Future<void> BannerViewInternalIOS::LoadAd(const AdRequest& request) {

0 commit comments

Comments
 (0)