UNPKG

nativescript-plugin-firebase-updated

Version:
390 lines (389 loc) 15.7 kB
import { Device } from "@nativescript/core/platform"; import { DeviceType } from "@nativescript/core/ui/enums"; import { firebase } from "../firebase-common"; import { AD_SIZE, BANNER_DEFAULTS, rewardedVideoCallbacks } from "./admob-common"; export { AD_SIZE }; let _bannerOptions = undefined; let _rewardBasedVideoAdDelegate = undefined; export function showBanner(arg) { return new Promise((resolve, reject) => { try { if (typeof (GADRequest) === "undefined") { reject("Uncomment AdMob in the plugin's Podfile first"); return; } if (firebase.admob.adView !== null && firebase.admob.adView !== undefined) { firebase.admob.adView.removeFromSuperview(); firebase.admob.adView = null; } BANNER_DEFAULTS.view = UIApplication.sharedApplication.keyWindow.rootViewController.view; const settings = firebase.merge(arg, BANNER_DEFAULTS); _bannerOptions = settings; const view = settings.view; const bannerType = _getBannerType(settings.size); const adWidth = bannerType.size.width === 0 ? view.frame.size.width : bannerType.size.width; const adHeight = bannerType.size.smartHeight ? bannerType.size.smartHeight : bannerType.size.height; const originX = (view.frame.size.width - adWidth) / 2; const originY = settings.margins.top > -1 ? settings.margins.top : (settings.margins.bottom > -1 ? view.frame.size.height - adHeight - settings.margins.bottom : 0.0); const origin = CGPointMake(originX, originY); firebase.admob.adView = GADBannerView.alloc().initWithAdSizeOrigin(bannerType, origin); firebase.admob.adView.adUnitID = settings.iosBannerId; const adRequest = GADRequest.request(); if (settings.testing) { let testDevices = []; try { testDevices.push("Simulator"); } catch (ignore) { } if (settings.iosTestDeviceIds) { testDevices = testDevices.concat(settings.iosTestDeviceIds); } adRequest.testDevices = testDevices; } if (settings.keywords !== undefined) { adRequest.keywords = settings.keywords; } firebase.admob.adView.rootViewController = UIApplication.sharedApplication.keyWindow.rootViewController; firebase.admob.adView.loadRequest(adRequest); let delegate = GADBannerViewDelegateImpl.new().initWithOptionsAndCallback(arg, (ad, error) => { if (error) { reject(error.localizedDescription); } else { resolve(); } }, () => { arg.onClosed && arg.onClosed(); CFRelease(delegate); delegate = undefined; }); CFRetain(delegate); firebase.admob.adView.delegate = delegate; view.addSubview(firebase.admob.adView); } catch (ex) { console.log("Error in firebase.admob.showBanner: " + ex); reject(ex); } }); } export function preloadInterstitial(arg) { return new Promise((resolve, reject) => { try { if (typeof (GADRequest) === "undefined") { reject("Uncomment AdMob in the plugin's Podfile first"); return; } const settings = firebase.merge(arg, BANNER_DEFAULTS); firebase.admob.interstitialView = GADInterstitial.alloc().initWithAdUnitID(settings.iosInterstitialId); let delegate = GADInterstitialDelegateImpl.new().initWithOptionsAndCallback(arg, (ad, error) => { if (error) { reject(error.localizedDescription); } else { resolve(); } }, () => { arg.onAdClosed && arg.onAdClosed(); arg.onClosed && arg.onClosed(); CFRelease(delegate); delegate = undefined; }); CFRetain(delegate); firebase.admob.interstitialView.delegate = delegate; const adRequest = GADRequest.request(); if (settings.testing) { let testDevices = []; try { testDevices.push("Simulator"); } catch (ignore) { } if (settings.iosTestDeviceIds) { testDevices = testDevices.concat(settings.iosTestDeviceIds); } adRequest.testDevices = testDevices; } firebase.admob.interstitialView.loadRequest(adRequest); } catch (ex) { console.log("Error in firebase.admob.preloadInterstitial: " + ex); reject(ex); } }); } export function showInterstitial(arg) { return new Promise((resolve, reject) => { try { if (typeof (GADRequest) === "undefined") { reject("Uncomment AdMob in the plugin's Podfile first"); return; } if (!arg) { if (firebase.admob.interstitialView) { firebase.admob.interstitialView.presentFromRootViewController(UIApplication.sharedApplication.keyWindow.rootViewController); resolve(); } else { reject("Please call 'preloadInterstitial' first"); } return; } const settings = firebase.merge(arg, BANNER_DEFAULTS); firebase.admob.interstitialView = GADInterstitial.alloc().initWithAdUnitID(settings.iosInterstitialId); let delegate = GADInterstitialDelegateImpl.new().initWithOptionsAndCallback(arg, (ad, error) => { if (error) { reject(error.localizedDescription); } else { firebase.admob.interstitialView.presentFromRootViewController(UIApplication.sharedApplication.keyWindow.rootViewController); resolve(); } CFRelease(delegate); delegate = undefined; }); CFRetain(delegate); firebase.admob.interstitialView.delegate = delegate; const adRequest = GADRequest.request(); if (settings.testing) { let testDevices = []; try { testDevices.push("Simulator"); } catch (ignore) { } if (settings.iosTestDeviceIds) { testDevices = testDevices.concat(settings.iosTestDeviceIds); } adRequest.testDevices = testDevices; } firebase.admob.interstitialView.loadRequest(adRequest); } catch (ex) { console.log("Error in firebase.admob.showInterstitial: " + ex); reject(ex); } }); } export function preloadRewardedVideoAd(arg) { return new Promise((resolve, reject) => { try { if (typeof (GADRequest) === "undefined") { reject("Enable AdMob first - see the plugin documentation"); return; } const onLoaded = () => resolve(); const onError = err => reject(err); _rewardBasedVideoAdDelegate = GADRewardBasedVideoAdDelegateImpl.new().initWithCallback(onLoaded, onError); CFRetain(_rewardBasedVideoAdDelegate); firebase.admob.rewardedAdVideoView = GADRewardBasedVideoAd.sharedInstance(); firebase.admob.rewardedAdVideoView.delegate = _rewardBasedVideoAdDelegate; const settings = firebase.merge(arg, BANNER_DEFAULTS); const adRequest = GADRequest.request(); if (settings.testing) { let testDevices = []; try { testDevices.push("Simulator"); } catch (ignore) { } if (settings.iosTestDeviceIds) { testDevices = testDevices.concat(settings.iosTestDeviceIds); } adRequest.testDevices = testDevices; } firebase.admob.rewardedAdVideoView.loadRequestWithAdUnitID(adRequest, settings.iosAdPlacementId); } catch (ex) { console.log("Error in firebase.admob.preloadRewardedVideoAd: " + ex); reject(ex); } }); } export function showRewardedVideoAd(arg) { return new Promise((resolve, reject) => { try { if (typeof (GADRequest) === "undefined") { reject("Enable AdMob first - see the plugin documentation"); return; } if (!firebase.admob.rewardedAdVideoView) { reject("Please call 'preloadRewardedVideoAd' first"); return; } if (arg.onRewarded) { rewardedVideoCallbacks.onRewarded = arg.onRewarded; } if (arg.onLeftApplication) { rewardedVideoCallbacks.onLeftApplication = arg.onLeftApplication; } if (arg.onClosed) { rewardedVideoCallbacks.onClosed = arg.onClosed; } if (arg.onOpened) { rewardedVideoCallbacks.onOpened = arg.onOpened; } if (arg.onStarted) { rewardedVideoCallbacks.onStarted = arg.onStarted; } if (arg.onCompleted) { rewardedVideoCallbacks.onCompleted = arg.onCompleted; } firebase.admob.rewardedAdVideoView.presentFromRootViewController(UIApplication.sharedApplication.keyWindow.rootViewController); resolve(); } catch (ex) { console.log("Error in firebase.admob.showRewardedVideoAd: " + ex); reject(ex); } }); } export function hideBanner() { return new Promise((resolve, reject) => { try { if (firebase.admob.adView !== null) { firebase.admob.adView.removeFromSuperview(); firebase.admob.adView = null; } resolve(); } catch (ex) { console.log("Error in firebase.admob.hideBanner: " + ex); reject(ex); } }); } function _getBannerType(size) { if (size === AD_SIZE.BANNER) { return { "size": { "width": 320, "height": 50 }, "flags": 0 }; } else if (size === AD_SIZE.LARGE_BANNER) { return { "size": { "width": 320, "height": 100 }, "flags": 0 }; } else if (size === AD_SIZE.MEDIUM_RECTANGLE) { return { "size": { "width": 300, "height": 250 }, "flags": 0 }; } else if (size === AD_SIZE.FULL_BANNER) { return { "size": { "width": 468, "height": 60 }, "flags": 0 }; } else if (size === AD_SIZE.LEADERBOARD) { return { "size": { "width": 728, "height": 90 }, "flags": 0 }; } else if (size === AD_SIZE.SKYSCRAPER) { return { "size": { "width": 120, "height": 600 }, "flags": 0 }; } else if (size === AD_SIZE.SMART_BANNER || size === AD_SIZE.FLUID) { const orientation = UIDevice.currentDevice.orientation; const isIPad = Device.deviceType === DeviceType.Tablet; if (orientation === 1 || orientation === 2) { return { "size": { "width": 0, "height": 0, "smartHeight": isIPad ? 90 : 50 }, "flags": 18 }; } else { return { "size": { "width": 0, "height": 0, "smartHeight": isIPad ? 90 : 32 }, "flags": 26 }; } } else { return { "size": { "width": -1, "height": -1 }, "flags": 0 }; } } class GADInterstitialDelegateImpl extends NSObject { static new() { if (GADInterstitialDelegateImpl.ObjCProtocols.length === 0 && typeof (GADInterstitialDelegate) !== "undefined") { GADInterstitialDelegateImpl.ObjCProtocols.push(GADInterstitialDelegate); } return super.new(); } initWithOptionsAndCallback(options, callback, onAdCloseCallback = null) { this.options = options; this.callback = callback; this.onAdCloseCallback = onAdCloseCallback; return this; } interstitialDidReceiveAd(ad) { this.callback(ad); } interstitialDidDismissScreen(ad) { this.onAdCloseCallback(); } interstitialDidFailToReceiveAdWithError(ad, error) { this.callback(ad, error); } interstitialWillLeaveApplication(ad) { this.options.onLeftApplication && this.options.onLeftApplication(); } } GADInterstitialDelegateImpl.ObjCProtocols = []; class GADBannerViewDelegateImpl extends NSObject { static new() { if (GADBannerViewDelegateImpl.ObjCProtocols.length === 0 && typeof (GADBannerViewDelegate) !== "undefined") { GADBannerViewDelegateImpl.ObjCProtocols.push(GADBannerViewDelegate); } return super.new(); } initWithOptionsAndCallback(options, callback, onAdCloseCallback = null) { this.options = options; this.callback = callback; this.onAdCloseCallback = onAdCloseCallback; return this; } adViewDidReceiveAd(bannerView) { this.callback(bannerView, null); } adViewDidFailToReceiveAdWithError(bannerView, error) { this.callback(bannerView, error); } adViewDidDismissScreen(bannerView) { this.onAdCloseCallback(); } adViewWillLeaveApplication(bannerView) { this.options.onLeftApplication && this.options.onLeftApplication(); } } GADBannerViewDelegateImpl.ObjCProtocols = []; class GADRewardBasedVideoAdDelegateImpl extends NSObject { static new() { if (GADRewardBasedVideoAdDelegateImpl.ObjCProtocols.length === 0 && typeof (GADRewardBasedVideoAdDelegate) !== "undefined") { GADRewardBasedVideoAdDelegateImpl.ObjCProtocols.push(GADRewardBasedVideoAdDelegate); } return super.new(); } initWithCallback(loaded, error) { this._loaded = loaded; this._error = error; return this; } rewardBasedVideoAdDidClose(rewardBasedVideoAd) { firebase.admob.rewardedAdVideoView = undefined; rewardedVideoCallbacks.onClosed(); setTimeout(function () { CFRelease(_rewardBasedVideoAdDelegate); _rewardBasedVideoAdDelegate = undefined; }); } rewardBasedVideoAdDidCompletePlaying(rewardBasedVideoAd) { rewardedVideoCallbacks.onCompleted(); } rewardBasedVideoAdDidFailToLoadWithError(rewardBasedVideoAd, error) { this._error(error.localizedDescription); } rewardBasedVideoAdDidOpen(rewardBasedVideoAd) { rewardedVideoCallbacks.onOpened(); } rewardBasedVideoAdDidReceiveAd(rewardBasedVideoAd) { this._loaded(); } rewardBasedVideoAdDidRewardUserWithReward(rewardBasedVideoAd, reward) { rewardedVideoCallbacks.onRewarded({ amount: reward.amount ? reward.amount.doubleValue : undefined, type: reward.type }); } rewardBasedVideoAdDidStartPlaying(rewardBasedVideoAd) { rewardedVideoCallbacks.onStarted(); } rewardBasedVideoAdWillLeaveApplication(rewardBasedVideoAd) { rewardedVideoCallbacks.onLeftApplication(); } } GADRewardBasedVideoAdDelegateImpl.ObjCProtocols = [];