russi-admob-plugin
Version:
202 lines (177 loc) • 6.9 kB
JavaScript
// Support for Ionic/Angular apps
if (typeof angular !== 'undefined') {
var admobModule = angular.module('admobModule', []);
window.admob = window.admob || {}; // Cordova admob script is injected after angular one does!!
function AdmobLauncher($timeout, $q, $rootScope, options, eventPrefix) {
var
deviceready = $q.defer(),
makePromise,
angularAdmob;
/**
* Creates an angular promise for any javascript method.
* @param {Function} fn The javascript function to be called.
* @param {Array} args The arguments to apply to fn.
* @param {Boolean} sync When set to true resolves the promise inmediately, otherwise in a timeout wrapper.
* @returns {Object} $q.defer().promise object.
*/
makePromise = function makePromise(fn, args, sync) {
var
deferred = $q.defer(),
success = function (response) {
if (sync) {
deferred.resolve(response);
} else {
$timeout(function () {
deferred.resolve(response);
});
}
},
fail = function (response) {
if (sync) {
deferred.reject(response);
} else {
$timeout(function () {
deferred.reject(response);
});
}
};
args.push(success);
args.push(fail);
fn.apply(window.admob, args);
return deferred.promise;
};
// The returning object
angularAdmob = {
events: {
onAdLoaded: "russi.cordova.admob.onAdLoaded",
onAdFailedToLoad: "russi.cordova.admob.onAdFailedToLoad",
onAdOpened: "russi.cordova.admob.onAdOpened",
onAdLeftApplication: "russi.cordova.admob.onAdLeftApplication",
onAdClosed: "russi.cordova.admob.onAdClosed"
},
AD_SIZE: {
BANNER: 'BANNER',
IAB_MRECT: 'IAB_MRECT',
IAB_BANNER: 'IAB_BANNER',
IAB_LEADERBOARD: 'IAB_LEADERBOARD',
SMART_BANNER: 'SMART_BANNER'
},
AD_TYPE: {
BANNER: 'banner',
INTERSTITIAL: 'interstitial'
},
options: options,
eventPrefix: eventPrefix,
setOptions: function (options) {
return deviceready.promise.then(function () {
return makePromise(window.admob.setOptions, [options]);
});
},
setEventPrefix: function (prefix) {
angularAdmob.eventPrefix = prefix;
},
createBannerView: function (options) {
return deviceready.promise.then(function () {
return makePromise(window.admob.createBannerView, [options]);
});
},
showBannerAd: function (show) {
return deviceready.promise.then(function () {
return makePromise(window.admob.showBannerAd, [show]);
});
},
destroyBannerView: function () {
return deviceready.promise.then(function () {
return makePromise(window.admob.destroyBannerView, []);
});
},
requestInterstitialAd: function (options) {
return deviceready.promise.then(function () {
return makePromise(window.admob.requestInterstitialAd, [options]);
});
},
showInterstitialAd: function () {
return deviceready.promise.then(function () {
return makePromise(window.admob.showInterstitialAd, []);
});
}
};
// Manage admob events
function _onAdLoaded(e) {
$rootScope.$broadcast(angularAdmob.eventPrefix + window.admob.events.onAdLoaded, e);
}
function _onAdFailedToLoad(e) {
$rootScope.$broadcast(angularAdmob.eventPrefix + window.admob.events.onAdFailedToLoad, e);
}
function _onAdOpened(e) {
$rootScope.$broadcast(angularAdmob.eventPrefix + window.admob.events.onAdOpened, e);
}
function _onAdLeftApplication(e) {
$rootScope.$broadcast(angularAdmob.eventPrefix + window.admob.events.onAdLeftApplication, e);
}
function _onAdClosed(e) {
$rootScope.$broadcast(angularAdmob.eventPrefix + window.admob.events.onAdClosed, e);
}
deviceready.promise.then(function () {
document.addEventListener(window.admob.events.onAdLoaded, _onAdLoaded, true);
document.addEventListener(window.admob.events.onAdFailedToLoad, _onAdFailedToLoad, true);
document.addEventListener(window.admob.events.onAdOpened, _onAdOpened, true);
document.addEventListener(window.admob.events.onAdLeftApplication, _onAdLeftApplication, true);
document.addEventListener(window.admob.events.onAdClosed, _onAdClosed, true);
angularAdmob.AD_SIZE = window.admob.AD_SIZE;
angularAdmob.AD_TYPE = window.admob.AD_TYPE;
angularAdmob.options = window.admob.options;
angularAdmob.setEventPrefix(eventPrefix);
});
/**
* Resolves the deviceready promise. In this way admob methods are always executed when deviceready.
*/
function onDeviceready() {
deviceready.resolve();
document.removeEventListener('deviceready', onDeviceready, false);
}
document.addEventListener('deviceready', onDeviceready, false);
// Clean up
$rootScope.$on('$destroy', function () {
document.removeEventListener(window.admob.events.onAdLoaded, angularAdmob._onAdLoaded, true);
document.removeEventListener(window.admob.events.onAdFailedToLoad, angularAdmob._onAdFailedToLoad, true);
document.removeEventListener(window.admob.events.onAdOpened, angularAdmob._onAdOpened, true);
document.removeEventListener(window.admob.events.onAdLeftApplication, angularAdmob._onAdLeftApplication, true);
document.removeEventListener(window.admob.events.onAdClosed, angularAdmob._onAdClosed, true);
});
return angularAdmob;
}
/**
* This is the Angular provider for Admob.
* @returns {Object} The provider.
*/
function AdmobProvider() {
'use strict';
var eventPrefix = 'admob:',
options = {};
/**
* Sets the event prefix. By default is set to 'admob:'.
* @param {String} prefix The prefix for admob events.
*/
this.setPrefix = function setPrefix(prefix) {
eventPrefix = prefix;
};
/**
* Sets admob options. They can be also set in run mode.
* @param {Object} admobOptions Admob plugin options.
*/
this.setOptions = function setOptions(admobOptions) {
options = admobOptions;
document.addEventListener('deviceready', function onDeviceready() {
document.removeEventListener('deviceready', onDeviceready, false);
window.admob.setOptions(admobOptions);
}, false);
};
// expose to provider
this.$get = ['$timeout', '$q', '$rootScope',
function admobFactory($timeout, $q, $rootScope) {
return new AdmobLauncher($timeout, $q, $rootScope, options, eventPrefix);
}];
}
admobModule.provider('admobSvc', AdmobProvider);
}