UNPKG

@bigin/ns-firebase

Version:
313 lines (312 loc) 11.9 kB
import { firebase } from '../firebase-common'; import { AD_SIZE, BANNER_DEFAULTS, rewardedVideoCallbacks } from './admob-common'; import { Application, Frame, Utils } from '@nativescript/core'; export { AD_SIZE }; export function showBanner(arg) { return new Promise((resolve, reject) => { try { const settings = firebase.merge(arg, BANNER_DEFAULTS); if (firebase.admob.adView !== null && firebase.admob.adView !== undefined) { const parent = firebase.admob.adView.getParent(); if (parent !== null) { parent.removeView(firebase.admob.adView); } } firebase.admob.adView = new com.google.android.gms.ads.AdView(Application.android.foregroundActivity); firebase.admob.adView.setAdUnitId(settings.androidBannerId); const bannerType = _getBannerType(settings.size); firebase.admob.adView.setAdSize(bannerType); this.resolve = resolve; this.reject = reject; const BannerAdListener = com.google.android.gms.ads.AdListener.extend({ resolve: null, reject: null, onAdLoaded: () => this.resolve(), onAdFailedToLoad: (errorCode) => this.reject(errorCode), onAdClicked: () => arg.onClicked && arg.onClicked(), onAdOpened: () => arg.onOpened && arg.onOpened(), onAdLeftApplication: () => arg.onLeftApplication && arg.onLeftApplication(), onAdClosed: () => { if (firebase.admob.adView) { firebase.admob.adView.setAdListener(null); firebase.admob.adView = null; } arg.onClosed && arg.onClosed(); }, }); firebase.admob.adView.setAdListener(new BannerAdListener()); const ad = _buildAdRequest(settings); firebase.admob.adView.loadAd(ad); const density = Utils.layout.getDisplayDensity(), top = settings.margins.top * density, bottom = settings.margins.bottom * density; const relativeLayoutParams = new android.widget.RelativeLayout.LayoutParams(android.widget.RelativeLayout.LayoutParams.MATCH_PARENT, android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT); if (bottom > -1) { relativeLayoutParams.bottomMargin = bottom; relativeLayoutParams.addRule(android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM); } else { if (top > -1) { relativeLayoutParams.topMargin = top; } relativeLayoutParams.addRule(android.widget.RelativeLayout.ALIGN_PARENT_TOP); } const adViewLayout = new android.widget.RelativeLayout(Application.android.foregroundActivity); adViewLayout.addView(firebase.admob.adView, relativeLayoutParams); const relativeLayoutParamsOuter = new android.widget.RelativeLayout.LayoutParams(android.widget.RelativeLayout.LayoutParams.MATCH_PARENT, android.widget.RelativeLayout.LayoutParams.MATCH_PARENT); setTimeout(() => { const top = Frame.topmost(); if (top !== undefined && top.currentPage && top.currentPage.android && top.currentPage.android.getParent()) { top.currentPage.android.getParent().addView(adViewLayout, relativeLayoutParamsOuter); } else if (Application.android && Application.android.foregroundActivity) { Application.android.foregroundActivity.getWindow().getDecorView().addView(adViewLayout, relativeLayoutParamsOuter); } else { console.log('Could not find a view to add the banner to'); } }, 100); } catch (ex) { console.log('Error in firebase.admob.showBanner: ' + ex); reject(ex); } }); } export function preloadInterstitial(arg) { return new Promise((resolve, reject) => { try { const settings = firebase.merge(arg, BANNER_DEFAULTS); const activity = Application.android.foregroundActivity || Application.android.startActivity; firebase.admob.interstitialView = new com.google.android.gms.ads.InterstitialAd(activity); firebase.admob.interstitialView.setAdUnitId(settings.androidInterstitialId); this.resolve = resolve; this.reject = reject; const InterstitialAdListener = com.google.android.gms.ads.AdListener.extend({ onAdLoaded: () => this.resolve(), onAdFailedToLoad: (errorCode) => this.reject(errorCode), onAdClicked: () => arg.onClicked && arg.onClicked(), onAdOpened: () => arg.onOpened && arg.onOpened(), onAdLeftApplication: () => arg.onLeftApplication && arg.onLeftApplication(), onAdClosed: () => { if (firebase.admob.interstitialView) { firebase.admob.interstitialView.setAdListener(null); firebase.admob.interstitialView = null; } arg.onAdClosed && arg.onAdClosed(); arg.onClosed && arg.onClosed(); }, }); firebase.admob.interstitialView.setAdListener(new InterstitialAdListener()); const ad = _buildAdRequest(settings); firebase.admob.interstitialView.loadAd(ad); } catch (ex) { console.log('Error in firebase.admob.showInterstitial: ' + ex); reject(ex); } }); } export function showInterstitial(arg) { return new Promise((resolve, reject) => { try { if (!arg) { if (firebase.admob.interstitialView) { firebase.admob.interstitialView.show(); resolve(); } else { reject("Please call 'preloadInterstitial' first"); } return; } const settings = firebase.merge(arg, BANNER_DEFAULTS); const activity = Application.android.foregroundActivity || Application.android.startActivity; firebase.admob.interstitialView = new com.google.android.gms.ads.InterstitialAd(activity); firebase.admob.interstitialView.setAdUnitId(settings.androidInterstitialId); const InterstitialAdListener = com.google.android.gms.ads.AdListener.extend({ onAdLoaded: () => { if (firebase.admob.interstitialView) { firebase.admob.interstitialView.show(); } resolve(); }, onAdFailedToLoad: (errorCode) => reject(errorCode), onAdClicked: () => arg.onClicked && arg.onClicked(), onAdOpened: () => arg.onOpened && arg.onOpened(), onAdLeftApplication: () => arg.onLeftApplication && arg.onLeftApplication(), onAdClosed: () => { if (firebase.admob.interstitialView) { firebase.admob.interstitialView.setAdListener(null); firebase.admob.interstitialView = null; } arg.onAdClosed && arg.onAdClosed(); arg.onClosed && arg.onClosed(); }, }); firebase.admob.interstitialView.setAdListener(new InterstitialAdListener()); const ad = _buildAdRequest(settings); firebase.admob.interstitialView.loadAd(ad); } catch (ex) { console.log('Error in firebase.admob.showInterstitial: ' + ex); reject(ex); } }); } export function preloadRewardedVideoAd(arg) { return new Promise((resolve, reject) => { try { const settings = firebase.merge(arg, BANNER_DEFAULTS); const activity = Application.android.foregroundActivity || Application.android.startActivity; firebase.admob.rewardedAdVideoView = com.google.android.gms.ads.MobileAds.getRewardedVideoAdInstance(activity); rewardedVideoCallbacks.onLoaded = resolve; rewardedVideoCallbacks.onFailedToLoad = reject; const RewardedVideoAdListener = com.google.android.gms.ads.reward.RewardedVideoAdListener.extend({ onRewarded(reward) { rewardedVideoCallbacks.onRewarded({ amount: reward.getAmount(), type: reward.getType(), }); }, onRewardedVideoAdLeftApplication() { rewardedVideoCallbacks.onLeftApplication(); }, onRewardedVideoAdClosed() { if (firebase.admob.rewardedAdVideoView) { firebase.admob.rewardedAdVideoView.setRewardedVideoAdListener(null); firebase.admob.rewardedAdVideoView = null; } rewardedVideoCallbacks.onClosed(); }, onRewardedVideoAdFailedToLoad(errorCode) { rewardedVideoCallbacks.onFailedToLoad(errorCode); }, onRewardedVideoAdLoaded() { rewardedVideoCallbacks.onLoaded(); }, onRewardedVideoAdOpened() { rewardedVideoCallbacks.onOpened(); }, onRewardedVideoStarted() { rewardedVideoCallbacks.onStarted(); }, onRewardedVideoCompleted() { rewardedVideoCallbacks.onCompleted(); }, }); firebase.admob.rewardedAdVideoView.setRewardedVideoAdListener(new RewardedVideoAdListener()); const ad = _buildAdRequest(settings); firebase.admob.rewardedAdVideoView.loadAd(settings.androidAdPlacementId, ad); } catch (ex) { console.log('Error in firebase.admob.preloadRewardedVideoAd: ' + ex); reject(ex); } }); } export function showRewardedVideoAd(arg) { return new Promise((resolve, reject) => { try { 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.show(); 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) { const parent = firebase.admob.adView.getParent(); if (parent !== null) { parent.removeView(firebase.admob.adView); } 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 com.google.android.gms.ads.AdSize.BANNER; } else if (size === AD_SIZE.LARGE_BANNER) { return com.google.android.gms.ads.AdSize.LARGE_BANNER; } else if (size === AD_SIZE.MEDIUM_RECTANGLE) { return com.google.android.gms.ads.AdSize.MEDIUM_RECTANGLE; } else if (size === AD_SIZE.FULL_BANNER) { return com.google.android.gms.ads.AdSize.FULL_BANNER; } else if (size === AD_SIZE.LEADERBOARD) { return com.google.android.gms.ads.AdSize.LEADERBOARD; } else if (size === AD_SIZE.SMART_BANNER) { return com.google.android.gms.ads.AdSize.SMART_BANNER; } else { return null; } } function _buildAdRequest(settings) { const builder = new com.google.android.gms.ads.AdRequest.Builder(); if (settings.testing) { builder.addTestDevice(com.google.android.gms.ads.AdRequest.DEVICE_ID_EMULATOR); const activity = Application.android.foregroundActivity || Application.android.startActivity; const ANDROID_ID = android.provider.Settings.Secure.getString(activity.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); let deviceId = _md5(ANDROID_ID); if (deviceId !== null) { deviceId = deviceId.toUpperCase(); console.log('Treating this deviceId as testdevice: ' + deviceId); builder.addTestDevice(deviceId); } } if (settings.keywords !== undefined && settings.keywords.length > 0) { for (let i = 0; i < settings.keywords.length; i++) { builder.addKeyword(settings.keywords[i]); } } const bundle = new android.os.Bundle(); bundle.putInt('nativescript', 1); const adextras = new com.google.android.gms.ads.mediation.admob.AdMobExtras(bundle); return builder.build(); } function _md5(input) { try { const digest = java.security.MessageDigest.getInstance('MD5'); const bytes = []; for (let j = 0; j < input.length; ++j) { bytes.push(input.charCodeAt(j)); } const s = new java.lang.String(input); digest.update(s.getBytes()); const messageDigest = digest.digest(); let hexString = ''; for (let i = 0; i < messageDigest.length; i++) { let h = java.lang.Integer.toHexString(0xff & messageDigest[i]); while (h.length < 2) h = '0' + h; hexString += h; } return hexString; } catch (noSuchAlgorithmException) { console.log('error generating md5: ' + noSuchAlgorithmException); return null; } } //# sourceMappingURL=admob.android.js.map