From c02f32d02c6d7f55cfe025fd93dc0512c635f656 Mon Sep 17 00:00:00 2001 From: Koen Punt Date: Wed, 9 Aug 2017 15:10:10 +0200 Subject: [PATCH] recreate adview when adUnitID is already set the adUnitID can only be set once, and sometimes in unfortunate rerenders the prop is set twice, which caused a crash. --- .../rnadmob/RNAdMobBannerViewManager.java | 17 +++++++++++++++++ .../rnadmob/RNPublisherBannerViewManager.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/android/src/main/java/com/sbugert/rnadmob/RNAdMobBannerViewManager.java b/android/src/main/java/com/sbugert/rnadmob/RNAdMobBannerViewManager.java index 597f4c945..299001c5e 100644 --- a/android/src/main/java/com/sbugert/rnadmob/RNAdMobBannerViewManager.java +++ b/android/src/main/java/com/sbugert/rnadmob/RNAdMobBannerViewManager.java @@ -26,11 +26,22 @@ class ReactAdView extends ReactViewGroup { + private Context mContext; + protected AdView adView; + + String adUnitID; String[] testDevices; public ReactAdView(final Context context) { super(context); + this.createAdView(); + } + + private void createAdView() { + if (this.adView != null) this.adView.destroy(); + + final Context context = getContext(); this.adView = new AdView(context); this.adView.setAdListener(new AdListener() { @Override @@ -121,6 +132,12 @@ public void loadBanner() { } public void setAdUnitID(String adUnitID) { + if (this.adUnitID != null) { + // We can only set adUnitID once, so when it was previously set we have + // to recreate the view + this.createAdView(); + } + this.adUnitID = adUnitID; this.adView.setAdUnitId(adUnitID); } diff --git a/android/src/main/java/com/sbugert/rnadmob/RNPublisherBannerViewManager.java b/android/src/main/java/com/sbugert/rnadmob/RNPublisherBannerViewManager.java index 1f7ddb9b9..9d5ce43b8 100644 --- a/android/src/main/java/com/sbugert/rnadmob/RNPublisherBannerViewManager.java +++ b/android/src/main/java/com/sbugert/rnadmob/RNPublisherBannerViewManager.java @@ -30,13 +30,24 @@ class ReactPublisherAdView extends ReactViewGroup implements AppEventListener { + private Context mContext; + protected PublisherAdView adView; + String[] testDevices; AdSize[] validAdSizes; + String adUnitID; AdSize adSize; public ReactPublisherAdView(final Context context) { super(context); + this.createAdView(); + } + + private void createAdView() { + if (this.adView != null) this.adView.destroy(); + + final Context context = getContext(); this.adView = new PublisherAdView(context); this.adView.setAppEventListener(this); this.adView.setAdListener(new AdListener() { @@ -145,6 +156,12 @@ public void loadBanner() { } public void setAdUnitID(String adUnitID) { + if (this.adUnitID != null) { + // We can only set adUnitID once, so when it was previously set we have + // to recreate the view + this.createAdView(); + } + this.adUnitID = adUnitID; this.adView.setAdUnitId(adUnitID); }