Guest User

Untitled

a guest
Nov 17th, 2015
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 278.67 KB | None | 0 0
  1. /*!
  2. * ngCordova
  3. * v0.1.18-alpha
  4. * Copyright 2014 Drifty Co. http://drifty.com/
  5. * See LICENSE in this repository for license information
  6. */
  7. (function(){
  8.  
  9. angular.module('ngCordova', [
  10. 'ngCordova.plugins'
  11. ]);
  12.  
  13. // install : cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-actionsheet.git
  14. // link : https://github.com/EddyVerbruggen/cordova-plugin-actionsheet
  15.  
  16. angular.module('ngCordova.plugins.actionSheet', [])
  17.  
  18. .factory('$cordovaActionSheet', ['$q', '$window', function ($q, $window) {
  19.  
  20. return {
  21. show: function (options) {
  22. var q = $q.defer();
  23.  
  24. $window.plugins.actionsheet.show(options, function (result) {
  25. q.resolve(result);
  26. });
  27.  
  28. return q.promise;
  29. },
  30.  
  31. hide: function () {
  32. return $window.plugins.actionsheet.hide();
  33. }
  34. };
  35. }]);
  36.  
  37. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-admob.git
  38. // link : https://github.com/floatinghotpot/cordova-plugin-admob
  39.  
  40. angular.module('ngCordova.plugins.adMob', [])
  41.  
  42. .factory('$cordovaAdMob', ['$q', '$window', function ($q, $window) {
  43.  
  44. return {
  45. createBannerView: function (options) {
  46. var d = $q.defer();
  47.  
  48. $window.plugins.AdMob.createBannerView(options, function () {
  49. d.resolve();
  50. }, function () {
  51. d.reject();
  52. });
  53.  
  54. return d.promise;
  55. },
  56.  
  57. createInterstitialView: function (options) {
  58. var d = $q.defer();
  59.  
  60. $window.plugins.AdMob.createInterstitialView(options, function () {
  61. d.resolve();
  62. }, function () {
  63. d.reject();
  64. });
  65.  
  66. return d.promise;
  67. },
  68.  
  69. requestAd: function (options) {
  70. var d = $q.defer();
  71.  
  72. $window.plugins.AdMob.requestAd(options, function () {
  73. d.resolve();
  74. }, function () {
  75. d.reject();
  76. });
  77.  
  78. return d.promise;
  79. },
  80.  
  81. showAd: function (options) {
  82. var d = $q.defer();
  83.  
  84. $window.plugins.AdMob.showAd(options, function () {
  85. d.resolve();
  86. }, function () {
  87. d.reject();
  88. });
  89.  
  90. return d.promise;
  91. },
  92.  
  93. requestInterstitialAd: function (options) {
  94. var d = $q.defer();
  95.  
  96. $window.plugins.AdMob.requestInterstitialAd(options, function () {
  97. d.resolve();
  98. }, function () {
  99. d.reject();
  100. });
  101.  
  102. return d.promise;
  103. }
  104. };
  105. }]);
  106.  
  107. // install : cordova plugin add https://github.com/ohh2ahh/AppAvailability.git
  108. // link : https://github.com/ohh2ahh/AppAvailability
  109.  
  110. angular.module('ngCordova.plugins.appAvailability', [])
  111.  
  112. .factory('$cordovaAppAvailability', ['$q', function ($q) {
  113.  
  114. return {
  115. check: function (urlScheme) {
  116. var q = $q.defer();
  117.  
  118. appAvailability.check(urlScheme, function (result) {
  119. q.resolve(result);
  120. }, function (err) {
  121. q.reject(err);
  122. });
  123.  
  124. return q.promise;
  125. }
  126. };
  127. }]);
  128.  
  129. // install : cordova plugin add https://github.com/pushandplay/cordova-plugin-apprate.git
  130. // link : https://github.com/pushandplay/cordova-plugin-apprate
  131.  
  132. angular.module('ngCordova.plugins.appRate', [])
  133.  
  134. .provider("$cordovaAppRate", [function () {
  135.  
  136. /**
  137. * Set defaults settings to AppRate
  138. *
  139. * @param {Object} defaults - AppRate default settings
  140. * @param {string} defaults.language
  141. * @param {string} defaults.appName
  142. * @param {boolean} defaults.promptForNewVersion
  143. * @param {boolean} defaults.openStoreInApp
  144. * @param {number} defaults.usesUntilPrompt
  145. * @param {boolean} defaults.useCustomRateDialog
  146. * @param {string} defaults.iosURL
  147. * @param {string} defaults.androidURL
  148. * @param {string} defaults.blackberryURL
  149. * @param {string} defaults.windowsURL
  150. */
  151. this.setPreferences = function (defaults) {
  152. if (!defaults || !angular.isObject(defaults)) {
  153. return;
  154. }
  155.  
  156. AppRate.preferences.useLanguage = defaults.language || null;
  157. AppRate.preferences.displayAppName = defaults.appName || "";
  158. AppRate.preferences.promptAgainForEachNewVersion = defaults.promptForNewVersion || true;
  159. AppRate.preferences.openStoreInApp = defaults.openStoreInApp || false;
  160. AppRate.preferences.usesUntilPrompt = defaults.usesUntilPrompt || 3;
  161. AppRate.preferences.useCustomRateDialog = defaults.useCustomRateDialog || false;
  162. AppRate.preferences.storeAppURL.ios = defaults.iosURL || null;
  163. AppRate.preferences.storeAppURL.android = defaults.androidURL || null;
  164. AppRate.preferences.storeAppURL.blackberry = defaults.blackberryURL || null;
  165. AppRate.preferences.storeAppURL.windows8 = defaults.windowsURL || null;
  166. };
  167.  
  168. /**
  169. * Set custom locale
  170. *
  171. * @param {Object} customObj
  172. * @param {string} customObj.title
  173. * @param {string} customObj.cancelButtonLabel
  174. * @param {string} customObj.laterButtonLabel
  175. * @param {string} customObj.rateButtonLabel
  176. */
  177. this.setCustomLocale = function (customObj) {
  178. var strings = {
  179. title: 'Rate %@',
  180. message: 'If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!',
  181. cancelButtonLabel: 'No, Thanks',
  182. laterButtonLabel: 'Remind Me Later',
  183. rateButtonLabel: 'Rate It Now'
  184. };
  185.  
  186. strings = angular.extend(strings, customObj);
  187.  
  188. AppRate.preferences.customLocale = strings;
  189. };
  190.  
  191. this.$get = ['$q', function ($q) {
  192. return {
  193. promptForRating: function (immediate) {
  194. var q = $q.defer();
  195. var prompt = AppRate.promptForRating(immediate);
  196. q.resolve(prompt);
  197.  
  198. return q.promise;
  199. },
  200.  
  201. navigateToAppStore: function () {
  202. var q = $q.defer();
  203. var navigate = AppRate.navigateToAppStore();
  204. q.resolve(navigate);
  205.  
  206. return q.promise;
  207. },
  208.  
  209. onButtonClicked: function (cb) {
  210. AppRate.onButtonClicked = function (buttonIndex) {
  211. cb.call(this, buttonIndex);
  212. };
  213. },
  214.  
  215. onRateDialogShow: function (cb) {
  216. AppRate.onRateDialogShow = cb();
  217. }
  218. };
  219. }];
  220. }]);
  221.  
  222. // install : cordova plugin add https://github.com/whiteoctober/cordova-plugin-app-version.git
  223. // link : https://github.com/whiteoctober/cordova-plugin-app-version
  224.  
  225. angular.module('ngCordova.plugins.appVersion', [])
  226.  
  227. .factory('$cordovaAppVersion', ['$q', function ($q) {
  228.  
  229. return {
  230. getVersionNumber: function () {
  231. var q = $q.defer();
  232. cordova.getAppVersion.getVersionNumber(function (version) {
  233. q.resolve(version);
  234. });
  235.  
  236. return q.promise;
  237. },
  238.  
  239. getVersionCode: function () {
  240. var q = $q.defer();
  241. cordova.getAppVersion.getVersionCode(function (code) {
  242. q.resolve(code);
  243. });
  244.  
  245. return q.promise;
  246. }
  247. };
  248. }]);
  249.  
  250. // install : cordova plugin add https://github.com/christocracy/cordova-plugin-background-geolocation.git
  251. // link : https://github.com/christocracy/cordova-plugin-background-geolocation
  252.  
  253. angular.module('ngCordova.plugins.backgroundGeolocation', [])
  254.  
  255. .factory('$cordovaBackgroundGeolocation', ['$q', '$window', function ($q, $window) {
  256.  
  257. return {
  258.  
  259. init: function () {
  260. $window.navigator.geolocation.getCurrentPosition(function (location) {
  261. return location;
  262. });
  263. },
  264.  
  265. configure: function (options) {
  266.  
  267. this.init();
  268. var q = $q.defer();
  269.  
  270. $window.plugins.backgroundGeoLocation.configure(
  271. function (result) {
  272. q.notify(result);
  273. $window.plugins.backgroundGeoLocation.finish();
  274. },
  275. function (err) {
  276. q.reject(err);
  277. }, options);
  278.  
  279. this.start();
  280.  
  281. return q.promise;
  282. },
  283.  
  284. start: function () {
  285. var q = $q.defer();
  286.  
  287. $window.plugins.backgroundGeoLocation.start(
  288. function (result) {
  289. q.resolve(result);
  290. },
  291. function (err) {
  292. q.reject(err);
  293. });
  294.  
  295. return q.promise;
  296. },
  297.  
  298. stop: function () {
  299. var q = $q.defer();
  300.  
  301. $window.plugins.backgroundGeoLocation.stop(
  302. function (result) {
  303. q.resolve(result);
  304. },
  305. function (err) {
  306. q.reject(err);
  307. });
  308.  
  309. return q.promise;
  310. }
  311. };
  312. }
  313.  
  314. ]);
  315.  
  316. // install : cordova plugin add https://github.com/katzer/cordova-plugin-badge.git
  317. // link : https://github.com/katzer/cordova-plugin-badge
  318.  
  319. angular.module('ngCordova.plugins.badge', [])
  320.  
  321. .factory('$cordovaBadge', ['$q', function ($q) {
  322.  
  323. return {
  324. hasPermission: function () {
  325. var q = $q.defer();
  326. cordova.plugins.notification.badge.hasPermission(function (permission) {
  327. if (permission) {
  328. q.resolve(true);
  329. } else {
  330. q.reject('You do not have permission');
  331. }
  332. });
  333.  
  334. return q.promise;
  335. },
  336.  
  337. promptForPermission: function () {
  338. return cordova.plugins.notification.badge.promptForPermission();
  339. },
  340.  
  341. set: function (badge, callback, scope) {
  342. var q = $q.defer();
  343.  
  344. cordova.plugins.notification.badge.hasPermission(function (permission) {
  345. if (permission) {
  346. q.resolve(
  347. cordova.plugins.notification.badge.set(badge, callback, scope)
  348. );
  349. } else {
  350. q.reject('You do not have permission to set Badge');
  351. }
  352. });
  353. return q.promise;
  354. },
  355.  
  356. get: function () {
  357. var q = $q.defer();
  358. cordova.plugins.notification.badge.hasPermission(function (permission) {
  359. if (permission) {
  360. cordova.plugins.notification.badge.get(function (badge) {
  361. q.resolve(badge);
  362. });
  363. } else {
  364. q.reject('You do not have permission to get Badge');
  365. }
  366. });
  367.  
  368. return q.promise;
  369. },
  370.  
  371. clear: function (callback, scope) {
  372. var q = $q.defer();
  373.  
  374. cordova.plugins.notification.badge.hasPermission(function (permission) {
  375. if (permission) {
  376. q.resolve(cordova.plugins.notification.badge.clear(callback, scope));
  377. } else {
  378. q.reject('You do not have permission to clear Badge');
  379. }
  380. });
  381. return q.promise;
  382. },
  383.  
  384. increase: function (count, callback, scope) {
  385. var q = $q.defer();
  386.  
  387. this.hasPermission().then(function (){
  388. q.resolve(
  389. cordova.plugins.notification.badge.increase(count, callback, scope)
  390. );
  391. }, function (){
  392. q.reject('You do not have permission to increase Badge');
  393. }) ;
  394.  
  395. return q.promise;
  396. },
  397.  
  398. decrease: function (count, callback, scope) {
  399. var q = $q.defer();
  400.  
  401. this.hasPermission().then(function (){
  402. q.resolve(
  403. cordova.plugins.notification.badge.decrease(count, callback, scope)
  404. );
  405. }, function (){
  406. q.reject('You do not have permission to decrease Badge');
  407. }) ;
  408.  
  409. return q.promise;
  410. },
  411.  
  412. configure: function (config) {
  413. return cordova.plugins.notification.badge.configure(config);
  414. }
  415. };
  416. }]);
  417.  
  418. // install : cordova plugin add https://github.com/wildabeast/BarcodeScanner.git
  419. // link : https://github.com/wildabeast/BarcodeScanner
  420.  
  421. angular.module('ngCordova.plugins.barcodeScanner', [])
  422.  
  423. .factory('$cordovaBarcodeScanner', ['$q', function ($q) {
  424.  
  425. return {
  426. scan: function (config) {
  427. var q = $q.defer();
  428.  
  429. cordova.plugins.barcodeScanner.scan(function (result) {
  430. q.resolve(result);
  431. }, function (err) {
  432. q.reject(err);
  433. }, config);
  434.  
  435. return q.promise;
  436. },
  437.  
  438. encode: function (type, data) {
  439. var q = $q.defer();
  440. type = type || "TEXT_TYPE";
  441.  
  442. cordova.plugins.barcodeScanner.encode(type, data, function (result) {
  443. q.resolve(result);
  444. }, function (err) {
  445. q.reject(err);
  446. });
  447.  
  448. return q.promise;
  449. }
  450. };
  451. }]);
  452.  
  453. // install : cordova plugin add cordova-plugin-battery-status
  454. // link : https://github.com/apache/cordova-plugin-battery-status
  455.  
  456. angular.module('ngCordova.plugins.batteryStatus', [])
  457.  
  458. .factory('$cordovaBatteryStatus', ['$rootScope', '$window', '$timeout', function ($rootScope, $window, $timeout) {
  459.  
  460. /**
  461. * @param {string} status
  462. */
  463. var batteryStatus = function (status) {
  464. $timeout(function () {
  465. $rootScope.$broadcast('$cordovaBatteryStatus:status', status);
  466. });
  467. };
  468.  
  469. /**
  470. * @param {string} status
  471. */
  472. var batteryCritical = function (status) {
  473. $timeout(function () {
  474. $rootScope.$broadcast('$cordovaBatteryStatus:critical', status);
  475. });
  476. };
  477.  
  478. /**
  479. * @param {string} status
  480. */
  481. var batteryLow = function (status) {
  482. $timeout(function () {
  483. $rootScope.$broadcast('$cordovaBatteryStatus:low', status);
  484. });
  485. };
  486.  
  487. document.addEventListener("deviceready", function () {
  488. if (navigator.battery) {
  489. $window.addEventListener('batterystatus', batteryStatus, false);
  490. $window.addEventListener('batterycritical', batteryCritical, false);
  491. $window.addEventListener('batterylow', batteryLow, false);
  492.  
  493. }
  494. }, false);
  495. return true;
  496. }])
  497. .run(['$cordovaBatteryStatus', function ($cordovaBatteryStatus) {
  498. }]);
  499.  
  500. // install : cordova plugin add https://github.com/don/cordova-plugin-ble-central.git
  501. // link : https://github.com/don/cordova-plugin-ble-central
  502.  
  503. angular.module('ngCordova.plugins.ble', [])
  504.  
  505. .factory('$cordovaBLE', ['$q', '$timeout', function ($q, $timeout) {
  506.  
  507. return {
  508. scan: function (services, seconds) {
  509. var q = $q.defer();
  510.  
  511. ble.startScan(services, function (result) {
  512. q.notify(result);
  513. }, function (error) {
  514. q.reject(error);
  515. });
  516.  
  517. $timeout(function () {
  518. ble.stopScan(function () {
  519. q.resolve();
  520. }, function (error) {
  521. q.reject(error);
  522. });
  523. }, seconds*1000);
  524.  
  525. return q.promise;
  526. },
  527.  
  528. connect: function (deviceID) {
  529. var q = $q.defer();
  530. ble.connect(deviceID, function (result) {
  531. q.resolve(result);
  532. }, function (error) {
  533. q.reject(error);
  534. });
  535. return q.promise;
  536. },
  537.  
  538. disconnect: function (deviceID) {
  539. var q = $q.defer();
  540. ble.disconnect(deviceID, function (result) {
  541. q.resolve(result);
  542. }, function (error) {
  543. q.reject(error);
  544. });
  545. return q.promise;
  546. },
  547.  
  548. read: function (deviceID, serviceUUID, characteristicUUID) {
  549. var q = $q.defer();
  550. ble.read(deviceID, serviceUUID, characteristicUUID, function (result) {
  551. q.resolve(result);
  552. }, function (error) {
  553. q.reject(error);
  554. });
  555. return q.promise;
  556. },
  557.  
  558. write: function (deviceID, serviceUUID, characteristicUUID, data) {
  559. var q = $q.defer();
  560. ble.write(deviceID, serviceUUID, characteristicUUID, data, function (result) {
  561. q.resolve(result);
  562. }, function (error) {
  563. q.reject(error);
  564. });
  565. return q.promise;
  566. },
  567.  
  568. writeCommand: function (deviceID, serviceUUID, characteristicUUID, data) {
  569. var q = $q.defer();
  570. ble.writeCommand(deviceID, serviceUUID, characteristicUUID, data, function (result) {
  571. q.resolve(result);
  572. }, function (error) {
  573. q.reject(error);
  574. });
  575. return q.promise;
  576. },
  577.  
  578. startNotification: function (deviceID, serviceUUID, characteristicUUID) {
  579. var q = $q.defer();
  580. ble.startNotification(deviceID, serviceUUID, characteristicUUID, function (result) {
  581. q.resolve(result);
  582. }, function (error) {
  583. q.reject(error);
  584. });
  585. return q.promise;
  586. },
  587.  
  588. stopNotification: function (deviceID, serviceUUID, characteristicUUID) {
  589. var q = $q.defer();
  590. ble.stopNotification(deviceID, serviceUUID, characteristicUUID, function (result) {
  591. q.resolve(result);
  592. }, function (error) {
  593. q.reject(error);
  594. });
  595. return q.promise;
  596. },
  597.  
  598. isConnected: function (deviceID) {
  599. var q = $q.defer();
  600. ble.isConnected(deviceID, function (result) {
  601. q.resolve(result);
  602. }, function (error) {
  603. q.reject(error);
  604. });
  605. return q.promise;
  606. },
  607.  
  608. isEnabled: function () {
  609. var q = $q.defer();
  610. ble.isEnabled(function (result) {
  611. q.resolve(result);
  612. }, function (error) {
  613. q.reject(error);
  614. });
  615. return q.promise;
  616. }
  617. };
  618. }]);
  619.  
  620. // install : cordova plugin add https://github.com/don/BluetoothSerial.git
  621. // link : https://github.com/don/BluetoothSerial
  622.  
  623. angular.module('ngCordova.plugins.bluetoothSerial', [])
  624.  
  625. .factory('$cordovaBluetoothSerial', ['$q', '$window', function ($q, $window) {
  626.  
  627. return {
  628. connect: function (address) {
  629. var q = $q.defer();
  630. var disconnectionPromise = $q.defer();
  631. var isConnected = false;
  632. $window.bluetoothSerial.connect(address, function () {
  633. isConnected = true;
  634. q.resolve(disconnectionPromise);
  635. }, function (error) {
  636. if(isConnected === false) {
  637. disconnectionPromise.reject(error);
  638. }
  639. q.reject(error);
  640. });
  641. return q.promise;
  642. },
  643.  
  644. // not supported on iOS
  645. connectInsecure: function (address) {
  646. var q = $q.defer();
  647. $window.bluetoothSerial.connectInsecure(address, function () {
  648. q.resolve();
  649. }, function (error) {
  650. q.reject(error);
  651. });
  652. return q.promise;
  653. },
  654.  
  655. disconnect: function () {
  656. var q = $q.defer();
  657. $window.bluetoothSerial.disconnect(function () {
  658. q.resolve();
  659. }, function (error) {
  660. q.reject(error);
  661. });
  662. return q.promise;
  663. },
  664.  
  665. list: function () {
  666. var q = $q.defer();
  667. $window.bluetoothSerial.list(function (data) {
  668. q.resolve(data);
  669. }, function (error) {
  670. q.reject(error);
  671. });
  672. return q.promise;
  673. },
  674.  
  675. discoverUnpaired: function () {
  676. var q = $q.defer();
  677. $window.bluetoothSerial.discoverUnpaired(function (data) {
  678. q.resolve(data);
  679. }, function (error) {
  680. q.reject(error);
  681. });
  682. return q.promise;
  683. },
  684.  
  685. setDeviceDiscoveredListener: function () {
  686. var q = $q.defer();
  687. $window.bluetoothSerial.setDeviceDiscoveredListener(function (data) {
  688. q.notify(data);
  689. });
  690. return q.promise;
  691. },
  692.  
  693. clearDeviceDiscoveredListener: function () {
  694. $window.bluetoothSerial.clearDeviceDiscoveredListener();
  695. },
  696.  
  697. showBluetoothSettings: function () {
  698. var q = $q.defer();
  699. $window.bluetoothSerial.showBluetoothSettings(function () {
  700. q.resolve();
  701. }, function (error) {
  702. q.reject(error);
  703. });
  704. return q.promise;
  705. },
  706.  
  707. isEnabled: function () {
  708. var q = $q.defer();
  709. $window.bluetoothSerial.isEnabled(function () {
  710. q.resolve();
  711. }, function () {
  712. q.reject();
  713. });
  714. return q.promise;
  715. },
  716.  
  717. enable: function () {
  718. var q = $q.defer();
  719. $window.bluetoothSerial.enable(function () {
  720. q.resolve();
  721. }, function () {
  722. q.reject();
  723. });
  724. return q.promise;
  725. },
  726.  
  727. isConnected: function () {
  728. var q = $q.defer();
  729. $window.bluetoothSerial.isConnected(function () {
  730. q.resolve();
  731. }, function () {
  732. q.reject();
  733. });
  734. return q.promise;
  735. },
  736.  
  737. available: function () {
  738. var q = $q.defer();
  739. $window.bluetoothSerial.available(function (data) {
  740. q.resolve(data);
  741. }, function (error) {
  742. q.reject(error);
  743. });
  744. return q.promise;
  745. },
  746.  
  747. read: function () {
  748. var q = $q.defer();
  749. $window.bluetoothSerial.read(function (data) {
  750. q.resolve(data);
  751. }, function (error) {
  752. q.reject(error);
  753. });
  754. return q.promise;
  755. },
  756.  
  757. readUntil: function (delimiter) {
  758. var q = $q.defer();
  759. $window.bluetoothSerial.readUntil(delimiter, function (data) {
  760. q.resolve(data);
  761. }, function (error) {
  762. q.reject(error);
  763. });
  764. return q.promise;
  765. },
  766.  
  767. write: function (data) {
  768. var q = $q.defer();
  769. $window.bluetoothSerial.write(data, function () {
  770. q.resolve();
  771. }, function (error) {
  772. q.reject(error);
  773. });
  774. return q.promise;
  775. },
  776.  
  777. subscribe: function (delimiter) {
  778. var q = $q.defer();
  779. $window.bluetoothSerial.subscribe(delimiter, function (data) {
  780. q.notify(data);
  781. }, function (error) {
  782. q.reject(error);
  783. });
  784. return q.promise;
  785. },
  786.  
  787. subscribeRawData: function () {
  788. var q = $q.defer();
  789. $window.bluetoothSerial.subscribeRawData(function (data) {
  790. q.notify(data);
  791. }, function (error) {
  792. q.reject(error);
  793. });
  794. return q.promise;
  795. },
  796.  
  797. unsubscribe: function () {
  798. var q = $q.defer();
  799. $window.bluetoothSerial.unsubscribe(function () {
  800. q.resolve();
  801. }, function (error) {
  802. q.reject(error);
  803. });
  804. return q.promise;
  805. },
  806.  
  807. unsubscribeRawData: function () {
  808. var q = $q.defer();
  809. $window.bluetoothSerial.unsubscribeRawData(function () {
  810. q.resolve();
  811. }, function (error) {
  812. q.reject(error);
  813. });
  814. return q.promise;
  815. },
  816.  
  817. clear: function () {
  818. var q = $q.defer();
  819. $window.bluetoothSerial.clear(function () {
  820. q.resolve();
  821. }, function (error) {
  822. q.reject(error);
  823. });
  824. return q.promise;
  825. },
  826.  
  827. readRSSI: function () {
  828. var q = $q.defer();
  829. $window.bluetoothSerial.readRSSI(function (data) {
  830. q.resolve(data);
  831. }, function (error) {
  832. q.reject(error);
  833. });
  834. return q.promise;
  835. }
  836. };
  837. }]);
  838.  
  839. // install : cordova plugin add https://github.com/fiscal-cliff/phonegap-plugin-brightness.git
  840. // link : https://github.com/fiscal-cliff/phonegap-plugin-brightness
  841.  
  842. angular.module('ngCordova.plugins.brightness', [])
  843.  
  844. .factory('$cordovaBrightness', ['$q', '$window', function ($q, $window) {
  845.  
  846. return {
  847. get: function () {
  848. var q = $q.defer();
  849.  
  850. if (!$window.cordova) {
  851. q.reject("Not supported without cordova.js");
  852. } else {
  853. $window.cordova.plugins.brightness.getBrightness(function (result) {
  854. q.resolve(result);
  855. }, function (err) {
  856. q.reject(err);
  857. });
  858. }
  859.  
  860. return q.promise;
  861. },
  862.  
  863. set: function (data) {
  864. var q = $q.defer();
  865.  
  866. if (!$window.cordova) {
  867. q.reject("Not supported without cordova.js");
  868. } else {
  869. $window.cordova.plugins.brightness.setBrightness(data, function (result) {
  870. q.resolve(result);
  871. }, function (err) {
  872. q.reject(err);
  873. });
  874. }
  875.  
  876. return q.promise;
  877. },
  878.  
  879. setKeepScreenOn: function (bool) {
  880. var q = $q.defer();
  881.  
  882. if (!$window.cordova) {
  883. q.reject("Not supported without cordova.js");
  884. } else {
  885. $window.cordova.plugins.brightness.setKeepScreenOn(bool, function (result) {
  886. q.resolve(result);
  887. }, function (err) {
  888. q.reject(err);
  889. });
  890. }
  891.  
  892. return q.promise;
  893. }
  894. };
  895. }]);
  896.  
  897.  
  898. // install : cordova plugin add https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin.git
  899. // link : https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin
  900.  
  901. angular.module('ngCordova.plugins.calendar', [])
  902.  
  903. .factory('$cordovaCalendar', ['$q', '$window', function ($q, $window) {
  904.  
  905. return {
  906. createCalendar: function (options) {
  907. var d = $q.defer(),
  908. createCalOptions = $window.plugins.calendar.getCreateCalendarOptions();
  909.  
  910. if (typeof options === 'string') {
  911. createCalOptions.calendarName = options;
  912. } else {
  913. createCalOptions = angular.extend(createCalOptions, options);
  914. }
  915.  
  916. $window.plugins.calendar.createCalendar(createCalOptions, function (message) {
  917. d.resolve(message);
  918. }, function (error) {
  919. d.reject(error);
  920. });
  921.  
  922. return d.promise;
  923. },
  924.  
  925. deleteCalendar: function (calendarName) {
  926. var d = $q.defer();
  927.  
  928. $window.plugins.calendar.deleteCalendar(calendarName, function (message) {
  929. d.resolve(message);
  930. }, function (error) {
  931. d.reject(error);
  932. });
  933.  
  934. return d.promise;
  935. },
  936.  
  937. createEvent: function (options) {
  938. var d = $q.defer(),
  939. defaultOptions = {
  940. title: null,
  941. location: null,
  942. notes: null,
  943. startDate: null,
  944. endDate: null
  945. };
  946.  
  947. defaultOptions = angular.extend(defaultOptions, options);
  948.  
  949. $window.plugins.calendar.createEvent(
  950. defaultOptions.title,
  951. defaultOptions.location,
  952. defaultOptions.notes,
  953. new Date(defaultOptions.startDate),
  954. new Date(defaultOptions.endDate),
  955. function (message) {
  956. d.resolve(message);
  957. }, function (error) {
  958. d.reject(error);
  959. }
  960. );
  961.  
  962. return d.promise;
  963. },
  964.  
  965. createEventWithOptions: function (options) {
  966. var d = $q.defer(),
  967. defaultOptionKeys = [],
  968. calOptions = window.plugins.calendar.getCalendarOptions(),
  969. defaultOptions = {
  970. title: null,
  971. location: null,
  972. notes: null,
  973. startDate: null,
  974. endDate: null
  975. };
  976.  
  977. defaultOptionKeys = Object.keys(defaultOptions);
  978.  
  979. for (var key in options) {
  980. if (defaultOptionKeys.indexOf(key) === -1) {
  981. calOptions[key] = options[key];
  982. } else {
  983. defaultOptions[key] = options[key];
  984. }
  985. }
  986.  
  987. $window.plugins.calendar.createEventWithOptions(
  988. defaultOptions.title,
  989. defaultOptions.location,
  990. defaultOptions.notes,
  991. new Date(defaultOptions.startDate),
  992. new Date(defaultOptions.endDate),
  993. calOptions,
  994. function (message) {
  995. d.resolve(message);
  996. }, function (error) {
  997. d.reject(error);
  998. }
  999. );
  1000.  
  1001. return d.promise;
  1002. },
  1003.  
  1004. createEventInteractively: function (options) {
  1005. var d = $q.defer(),
  1006. defaultOptions = {
  1007. title: null,
  1008. location: null,
  1009. notes: null,
  1010. startDate: null,
  1011. endDate: null
  1012. };
  1013.  
  1014. defaultOptions = angular.extend(defaultOptions, options);
  1015.  
  1016. $window.plugins.calendar.createEventInteractively(
  1017. defaultOptions.title,
  1018. defaultOptions.location,
  1019. defaultOptions.notes,
  1020. new Date(defaultOptions.startDate),
  1021. new Date(defaultOptions.endDate),
  1022. function (message) {
  1023. d.resolve(message);
  1024. }, function (error) {
  1025. d.reject(error);
  1026. }
  1027. );
  1028.  
  1029. return d.promise;
  1030. },
  1031.  
  1032. createEventInNamedCalendar: function (options) {
  1033. var d = $q.defer(),
  1034. defaultOptions = {
  1035. title: null,
  1036. location: null,
  1037. notes: null,
  1038. startDate: null,
  1039. endDate: null,
  1040. calendarName: null
  1041. };
  1042.  
  1043. defaultOptions = angular.extend(defaultOptions, options);
  1044.  
  1045. $window.plugins.calendar.createEventInNamedCalendar(
  1046. defaultOptions.title,
  1047. defaultOptions.location,
  1048. defaultOptions.notes,
  1049. new Date(defaultOptions.startDate),
  1050. new Date(defaultOptions.endDate),
  1051. defaultOptions.calendarName,
  1052. function (message) {
  1053. d.resolve(message);
  1054. }, function (error) {
  1055. d.reject(error);
  1056. }
  1057. );
  1058.  
  1059. return d.promise;
  1060. },
  1061.  
  1062. findEvent: function (options) {
  1063. var d = $q.defer(),
  1064. defaultOptions = {
  1065. title: null,
  1066. location: null,
  1067. notes: null,
  1068. startDate: null,
  1069. endDate: null
  1070. };
  1071.  
  1072. defaultOptions = angular.extend(defaultOptions, options);
  1073.  
  1074. $window.plugins.calendar.findEvent(
  1075. defaultOptions.title,
  1076. defaultOptions.location,
  1077. defaultOptions.notes,
  1078. new Date(defaultOptions.startDate),
  1079. new Date(defaultOptions.endDate),
  1080. function (foundEvent) {
  1081. d.resolve(foundEvent);
  1082. }, function (error) {
  1083. d.reject(error);
  1084. }
  1085. );
  1086.  
  1087. return d.promise;
  1088. },
  1089.  
  1090. listEventsInRange: function (startDate, endDate) {
  1091. var d = $q.defer();
  1092.  
  1093. $window.plugins.calendar.listEventsInRange(startDate, endDate, function (events) {
  1094. d.resolve(events);
  1095. }, function (error) {
  1096. d.reject(error);
  1097. });
  1098.  
  1099. return d.promise;
  1100. },
  1101.  
  1102. listCalendars: function () {
  1103. var d = $q.defer();
  1104.  
  1105. $window.plugins.calendar.listCalendars(function (calendars) {
  1106. d.resolve(calendars);
  1107. }, function (error) {
  1108. d.reject(error);
  1109. });
  1110.  
  1111. return d.promise;
  1112. },
  1113.  
  1114. findAllEventsInNamedCalendar: function (calendarName) {
  1115. var d = $q.defer();
  1116.  
  1117. $window.plugins.calendar.findAllEventsInNamedCalendar(calendarName, function (events) {
  1118. d.resolve(events);
  1119. }, function (error) {
  1120. d.reject(error);
  1121. });
  1122.  
  1123. return d.promise;
  1124. },
  1125.  
  1126. modifyEvent: function (options) {
  1127. var d = $q.defer(),
  1128. defaultOptions = {
  1129. title: null,
  1130. location: null,
  1131. notes: null,
  1132. startDate: null,
  1133. endDate: null,
  1134. newTitle: null,
  1135. newLocation: null,
  1136. newNotes: null,
  1137. newStartDate: null,
  1138. newEndDate: null
  1139. };
  1140.  
  1141. defaultOptions = angular.extend(defaultOptions, options);
  1142.  
  1143. $window.plugins.calendar.modifyEvent(
  1144. defaultOptions.title,
  1145. defaultOptions.location,
  1146. defaultOptions.notes,
  1147. new Date(defaultOptions.startDate),
  1148. new Date(defaultOptions.endDate),
  1149. defaultOptions.newTitle,
  1150. defaultOptions.newLocation,
  1151. defaultOptions.newNotes,
  1152. new Date(defaultOptions.newStartDate),
  1153. new Date(defaultOptions.newEndDate),
  1154. function (message) {
  1155. d.resolve(message);
  1156. }, function (error) {
  1157. d.reject(error);
  1158. }
  1159. );
  1160.  
  1161. return d.promise;
  1162. },
  1163.  
  1164. deleteEvent: function (options) {
  1165. var d = $q.defer(),
  1166. defaultOptions = {
  1167. newTitle: null,
  1168. location: null,
  1169. notes: null,
  1170. startDate: null,
  1171. endDate: null
  1172. };
  1173.  
  1174. defaultOptions = angular.extend(defaultOptions, options);
  1175.  
  1176. $window.plugins.calendar.deleteEvent(
  1177. defaultOptions.newTitle,
  1178. defaultOptions.location,
  1179. defaultOptions.notes,
  1180. new Date(defaultOptions.startDate),
  1181. new Date(defaultOptions.endDate),
  1182. function (message) {
  1183. d.resolve(message);
  1184. }, function (error) {
  1185. d.reject(error);
  1186. }
  1187. );
  1188.  
  1189. return d.promise;
  1190. }
  1191. };
  1192. }]);
  1193.  
  1194. // install : cordova plugin add cordova-plugin-camera
  1195. // link : https://github.com/apache/cordova-plugin-camera
  1196.  
  1197. angular.module('ngCordova.plugins.camera', [])
  1198.  
  1199. .factory('$cordovaCamera', ['$q', function ($q) {
  1200.  
  1201. return {
  1202. getPicture: function (options) {
  1203. var q = $q.defer();
  1204.  
  1205. if (!navigator.camera) {
  1206. q.resolve(null);
  1207. return q.promise;
  1208. }
  1209.  
  1210. navigator.camera.getPicture(function (imageData) {
  1211. q.resolve(imageData);
  1212. }, function (err) {
  1213. q.reject(err);
  1214. }, options);
  1215.  
  1216. return q.promise;
  1217. },
  1218.  
  1219. cleanup: function () {
  1220. var q = $q.defer();
  1221.  
  1222. navigator.camera.cleanup(function () {
  1223. q.resolve();
  1224. }, function (err) {
  1225. q.reject(err);
  1226. });
  1227.  
  1228. return q.promise;
  1229. }
  1230. };
  1231. }]);
  1232.  
  1233. // install : cordova plugin add cordova-plugin-media-capture
  1234. // link : https://github.com/apache/cordova-plugin-media-capture
  1235.  
  1236. angular.module('ngCordova.plugins.capture', [])
  1237.  
  1238. .factory('$cordovaCapture', ['$q', function ($q) {
  1239.  
  1240. return {
  1241. captureAudio: function (options) {
  1242. var q = $q.defer();
  1243.  
  1244. if (!navigator.device.capture) {
  1245. q.resolve(null);
  1246. return q.promise;
  1247. }
  1248.  
  1249. navigator.device.capture.captureAudio(function (audioData) {
  1250. q.resolve(audioData);
  1251. }, function (err) {
  1252. q.reject(err);
  1253. }, options);
  1254.  
  1255. return q.promise;
  1256. },
  1257. captureImage: function (options) {
  1258. var q = $q.defer();
  1259.  
  1260. if (!navigator.device.capture) {
  1261. q.resolve(null);
  1262. return q.promise;
  1263. }
  1264.  
  1265. navigator.device.capture.captureImage(function (imageData) {
  1266. q.resolve(imageData);
  1267. }, function (err) {
  1268. q.reject(err);
  1269. }, options);
  1270.  
  1271. return q.promise;
  1272. },
  1273. captureVideo: function (options) {
  1274. var q = $q.defer();
  1275.  
  1276. if (!navigator.device.capture) {
  1277. q.resolve(null);
  1278. return q.promise;
  1279. }
  1280.  
  1281. navigator.device.capture.captureVideo(function (videoData) {
  1282. q.resolve(videoData);
  1283. }, function (err) {
  1284. q.reject(err);
  1285. }, options);
  1286.  
  1287. return q.promise;
  1288. }
  1289. };
  1290. }]);
  1291.  
  1292. // install : cordova plugin add https://github.com/vkeepe/card.io.git
  1293. // link : https://github.com/vkeepe/card.io.git
  1294.  
  1295. angular.module('ngCordova.plugins.cardIO', [])
  1296.  
  1297. .provider(
  1298. '$cordovaNgCardIO', [function () {
  1299.  
  1300. /**
  1301. * Default array of response data from cardIO scan card
  1302. */
  1303. var defaultRespFields = [
  1304. "card_type",
  1305. "redacted_card_number",
  1306. "card_number",
  1307. "expiry_month",
  1308. "expiry_year",
  1309. "short_expiry_year",
  1310. "cvv",
  1311. "zip"
  1312. ];
  1313.  
  1314. /**
  1315. * Default config for cardIO scan function
  1316. */
  1317. var defaultScanConfig = {
  1318. "expiry": true,
  1319. "cvv": true,
  1320. "zip": false,
  1321. "suppressManual": false,
  1322. "suppressConfirm": false,
  1323. "hideLogo": true
  1324. };
  1325.  
  1326. /**
  1327. * Configuring defaultRespFields using $cordovaNgCardIOProvider
  1328. *
  1329. */
  1330. this.setCardIOResponseFields = function (filelds) {
  1331. if (!filelds || !angular.isArray(filelds)) {
  1332. return;
  1333. }
  1334. defaultRespFields = filelds;
  1335. };
  1336.  
  1337. /**
  1338. *
  1339. * Configuring defaultScanConfig using $cordovaNgCardIOProvider
  1340. */
  1341. this.setScanerConfig = function (config) {
  1342. if (!config || !angular.isObject(config)) {
  1343. return;
  1344. }
  1345.  
  1346. defaultScanConfig.expiry = config.expiry || true;
  1347. defaultScanConfig.cvv = config.cvv || true;
  1348. defaultScanConfig.zip = config.zip || false;
  1349. defaultScanConfig.suppressManual = config.suppressManual
  1350. || false;
  1351. defaultScanConfig.suppressConfirm = config.suppressConfirm
  1352. || false;
  1353. defaultScanConfig.hideLogo = config.hideLogo || true;
  1354. };
  1355.  
  1356. /**
  1357. * Function scanCard for $cordovaNgCardIO service to make scan of card
  1358. *
  1359. */
  1360. this.$get = ['$q', function ($q) {
  1361. return {
  1362. scanCard: function () {
  1363.  
  1364. var deferred = $q.defer();
  1365. CardIO.scan(
  1366. defaultScanConfig,
  1367. function (response) {
  1368.  
  1369. if (response == null) {
  1370. deferred.reject(null);
  1371. } else {
  1372.  
  1373. var respData = {};
  1374. for (
  1375. var i = 0, len = defaultRespFields.length; i < len; i++) {
  1376. var field = defaultRespFields[i];
  1377.  
  1378. if (field == "short_expiry_year") {
  1379. respData[field] = String(response['expiry_year']).substr(
  1380. 2, 2
  1381. )
  1382. || "";
  1383. } else {
  1384. respData[field] = response[field] || "";
  1385. }
  1386. }
  1387. deferred.resolve(respData);
  1388. }
  1389. },
  1390. function () {
  1391. deferred.reject(null);
  1392. }
  1393. );
  1394. return deferred.promise;
  1395. }
  1396. }
  1397. }]
  1398. }]
  1399. );
  1400.  
  1401. // install : cordova plugin add https://github.com/VersoSolutions/CordovaClipboard.git
  1402. // link : https://github.com/VersoSolutions/CordovaClipboard
  1403.  
  1404. angular.module('ngCordova.plugins.clipboard', [])
  1405.  
  1406. .factory('$cordovaClipboard', ['$q', '$window', function ($q, $window) {
  1407.  
  1408. return {
  1409. copy: function (text) {
  1410. var q = $q.defer();
  1411.  
  1412. $window.cordova.plugins.clipboard.copy(text,
  1413. function () {
  1414. q.resolve();
  1415. }, function () {
  1416. q.reject();
  1417. });
  1418.  
  1419. return q.promise;
  1420. },
  1421.  
  1422. paste: function () {
  1423. var q = $q.defer();
  1424.  
  1425. $window.cordova.plugins.clipboard.paste(function (text) {
  1426. q.resolve(text);
  1427. }, function () {
  1428. q.reject();
  1429. });
  1430.  
  1431. return q.promise;
  1432. }
  1433. };
  1434. }]);
  1435.  
  1436. // install : cordova plugin add cordova-plugin-contacts
  1437. // link : https://github.com/apache/cordova-plugin-contacts
  1438.  
  1439. angular.module('ngCordova.plugins.contacts', [])
  1440.  
  1441. .factory('$cordovaContacts', ['$q', function ($q) {
  1442.  
  1443. return {
  1444. save: function (contact) {
  1445. var q = $q.defer();
  1446. var deviceContact = navigator.contacts.create(contact);
  1447.  
  1448. deviceContact.save(function (result) {
  1449. q.resolve(result);
  1450. }, function (err) {
  1451. q.reject(err);
  1452. });
  1453. return q.promise;
  1454. },
  1455.  
  1456. remove: function (contact) {
  1457. var q = $q.defer();
  1458. var deviceContact = navigator.contacts.create(contact);
  1459.  
  1460. deviceContact.remove(function (result) {
  1461. q.resolve(result);
  1462. }, function (err) {
  1463. q.reject(err);
  1464. });
  1465. return q.promise;
  1466. },
  1467.  
  1468. clone: function (contact) {
  1469. var deviceContact = navigator.contacts.create(contact);
  1470. return deviceContact.clone(contact);
  1471. },
  1472.  
  1473. find: function (options) {
  1474. var q = $q.defer();
  1475. var fields = options.fields || ['id', 'displayName'];
  1476. delete options.fields;
  1477. if (Object.keys(options).length === 0) {
  1478. navigator.contacts.find(fields, function (results) {
  1479. q.resolve(results);
  1480. },function (err) {
  1481. q.reject(err)
  1482. });
  1483. }
  1484. else {
  1485. navigator.contacts.find(fields, function (results) {
  1486. q.resolve(results);
  1487. }, function (err) {
  1488. q.reject(err);
  1489. }, options);
  1490. }
  1491. return q.promise;
  1492. },
  1493.  
  1494. pickContact: function () {
  1495. var q = $q.defer();
  1496.  
  1497. navigator.contacts.pickContact(function (contact) {
  1498. q.resolve(contact);
  1499. }, function (err) {
  1500. q.reject(err);
  1501. });
  1502.  
  1503. return q.promise;
  1504. }
  1505.  
  1506. // TODO: method to set / get ContactAddress
  1507. // TODO: method to set / get ContactError
  1508. // TODO: method to set / get ContactField
  1509. // TODO: method to set / get ContactName
  1510. // TODO: method to set / get ContactOrganization
  1511. };
  1512. }]);
  1513.  
  1514. // install : cordova plugin add https://github.com/VitaliiBlagodir/cordova-plugin-datepicker.git
  1515. // link : https://github.com/VitaliiBlagodir/cordova-plugin-datepicker
  1516.  
  1517. angular.module('ngCordova.plugins.datePicker', [])
  1518.  
  1519. .factory('$cordovaDatePicker', ['$window', '$q', function ($window, $q) {
  1520.  
  1521. return {
  1522. show: function (options) {
  1523. var q = $q.defer();
  1524. options = options || {date: new Date(), mode: 'date'};
  1525. $window.datePicker.show(options, function (date) {
  1526. q.resolve(date);
  1527. });
  1528. return q.promise;
  1529. }
  1530. };
  1531. }]);
  1532.  
  1533. // install : cordova plugin add cordova-plugin-device
  1534. // link : https://github.com/apache/cordova-plugin-device
  1535.  
  1536. angular.module('ngCordova.plugins.device', [])
  1537.  
  1538. .factory('$cordovaDevice', [function () {
  1539.  
  1540. return {
  1541. /**
  1542. * Returns the whole device object.
  1543. * @see https://github.com/apache/cordova-plugin-device
  1544. * @returns {Object} The device object.
  1545. */
  1546. getDevice: function () {
  1547. return device;
  1548. },
  1549.  
  1550. /**
  1551. * Returns the Cordova version.
  1552. * @see https://github.com/apache/cordova-plugin-device#devicecordova
  1553. * @returns {String} The Cordova version.
  1554. */
  1555. getCordova: function () {
  1556. return device.cordova;
  1557. },
  1558.  
  1559. /**
  1560. * Returns the name of the device's model or product.
  1561. * @see https://github.com/apache/cordova-plugin-device#devicemodel
  1562. * @returns {String} The name of the device's model or product.
  1563. */
  1564. getModel: function () {
  1565. return device.model;
  1566. },
  1567.  
  1568. /**
  1569. * @deprecated device.name is deprecated as of version 2.3.0. Use device.model instead.
  1570. * @returns {String}
  1571. */
  1572. getName: function () {
  1573. return device.name;
  1574. },
  1575.  
  1576. /**
  1577. * Returns the device's operating system name.
  1578. * @see https://github.com/apache/cordova-plugin-device#deviceplatform
  1579. * @returns {String} The device's operating system name.
  1580. */
  1581. getPlatform: function () {
  1582. return device.platform;
  1583. },
  1584.  
  1585. /**
  1586. * Returns the device's Universally Unique Identifier.
  1587. * @see https://github.com/apache/cordova-plugin-device#deviceuuid
  1588. * @returns {String} The device's Universally Unique Identifier
  1589. */
  1590. getUUID: function () {
  1591. return device.uuid;
  1592. },
  1593.  
  1594. /**
  1595. * Returns the operating system version.
  1596. * @see https://github.com/apache/cordova-plugin-device#deviceversion
  1597. * @returns {String}
  1598. */
  1599. getVersion: function () {
  1600. return device.version;
  1601. },
  1602.  
  1603. /**
  1604. * Returns the device manufacturer.
  1605. * @returns {String}
  1606. */
  1607. getManufacturer: function () {
  1608. return device.manufacturer;
  1609. }
  1610. };
  1611. }]);
  1612.  
  1613. // install : cordova plugin add cordova-plugin-device-motion
  1614. // link : https://github.com/apache/cordova-plugin-device-motion
  1615.  
  1616. angular.module('ngCordova.plugins.deviceMotion', [])
  1617.  
  1618. .factory('$cordovaDeviceMotion', ['$q', function ($q) {
  1619.  
  1620. return {
  1621. getCurrentAcceleration: function () {
  1622. var q = $q.defer();
  1623.  
  1624. if (angular.isUndefined(navigato.accelerometer) ||
  1625. !angular.isFunction(navigator.accelerometer.getCurrentAcceleration)) {
  1626. q.reject('Device do not support watchAcceleration');
  1627. }
  1628.  
  1629. navigator.accelerometer.getCurrentAcceleration(function (result) {
  1630. q.resolve(result);
  1631. }, function (err) {
  1632. q.reject(err);
  1633. });
  1634.  
  1635. return q.promise;
  1636. },
  1637.  
  1638. watchAcceleration: function (options) {
  1639. var q = $q.defer();
  1640.  
  1641. if (angular.isUndefined(navigato.accelerometer) ||
  1642. !angular.isFunction(navigator.accelerometer.watchAcceleration)) {
  1643. q.reject('Device do not support watchAcceleration');
  1644. }
  1645.  
  1646. var watchID = navigator.accelerometer.watchAcceleration(function (result) {
  1647. q.notify(result);
  1648. }, function (err) {
  1649. q.reject(err);
  1650. }, options);
  1651.  
  1652. q.promise.cancel = function () {
  1653. navigator.accelerometer.clearWatch(watchID);
  1654. };
  1655.  
  1656. q.promise.clearWatch = function (id) {
  1657. navigator.accelerometer.clearWatch(id || watchID);
  1658. };
  1659.  
  1660. q.promise.watchID = watchID;
  1661.  
  1662. return q.promise;
  1663. },
  1664.  
  1665. clearWatch: function (watchID) {
  1666. return navigator.accelerometer.clearWatch(watchID);
  1667. }
  1668. };
  1669. }]);
  1670.  
  1671. // install : cordova plugin add cordova-plugin-device-orientation
  1672. // link : https://github.com/apache/cordova-plugin-device-orientation
  1673.  
  1674. angular.module('ngCordova.plugins.deviceOrientation', [])
  1675.  
  1676. .factory('$cordovaDeviceOrientation', ['$q', function ($q) {
  1677.  
  1678. var defaultOptions = {
  1679. frequency: 3000 // every 3s
  1680. };
  1681.  
  1682. return {
  1683. getCurrentHeading: function () {
  1684. var q = $q.defer();
  1685.  
  1686. if(!navigator.compass) {
  1687. q.reject('No compass on Device');
  1688. return q.promise;
  1689. }
  1690.  
  1691. navigator.compass.getCurrentHeading(function (result) {
  1692. q.resolve(result);
  1693. }, function (err) {
  1694. q.reject(err);
  1695. });
  1696.  
  1697. return q.promise;
  1698. },
  1699.  
  1700. watchHeading: function (options) {
  1701. var q = $q.defer();
  1702.  
  1703. if(!navigator.compass) {
  1704. q.reject('No compass on Device');
  1705. return q.promise;
  1706. }
  1707.  
  1708. var _options = angular.extend(defaultOptions, options);
  1709. var watchID = navigator.compass.watchHeading(function (result) {
  1710. q.notify(result);
  1711. }, function (err) {
  1712. q.reject(err);
  1713. }, _options);
  1714.  
  1715. q.promise.cancel = function () {
  1716. navigator.compass.clearWatch(watchID);
  1717. };
  1718.  
  1719. q.promise.clearWatch = function (id) {
  1720. navigator.compass.clearWatch(id || watchID);
  1721. };
  1722.  
  1723. q.promise.watchID = watchID;
  1724.  
  1725. return q.promise;
  1726. },
  1727.  
  1728. clearWatch: function (watchID) {
  1729. return navigator.compass.clearWatch(watchID);
  1730. }
  1731. };
  1732. }]);
  1733.  
  1734. // install : cordova plugin add cordova-plugin-dialogs
  1735. // link : https://github.com/apache/cordova-plugin-dialogs
  1736.  
  1737. angular.module('ngCordova.plugins.dialogs', [])
  1738.  
  1739. .factory('$cordovaDialogs', ['$q', '$window', function ($q, $window) {
  1740.  
  1741. return {
  1742. alert: function (message, title, buttonName) {
  1743. var q = $q.defer();
  1744.  
  1745. if (!$window.navigator.notification) {
  1746. $window.alert(message);
  1747. q.resolve();
  1748. } else {
  1749. navigator.notification.alert(message, function () {
  1750. q.resolve();
  1751. }, title, buttonName);
  1752. }
  1753.  
  1754. return q.promise;
  1755. },
  1756.  
  1757. confirm: function (message, title, buttonLabels) {
  1758. var q = $q.defer();
  1759.  
  1760. if (!$window.navigator.notification) {
  1761. if ($window.confirm(message)) {
  1762. q.resolve(1);
  1763. } else {
  1764. q.resolve(2);
  1765. }
  1766. } else {
  1767. navigator.notification.confirm(message, function (buttonIndex) {
  1768. q.resolve(buttonIndex);
  1769. }, title, buttonLabels);
  1770. }
  1771.  
  1772. return q.promise;
  1773. },
  1774.  
  1775. prompt: function (message, title, buttonLabels, defaultText) {
  1776. var q = $q.defer();
  1777.  
  1778. if (!$window.navigator.notification) {
  1779. var res = $window.prompt(message, defaultText);
  1780. if (res !== null) {
  1781. q.resolve({input1: res, buttonIndex: 1});
  1782. } else {
  1783. q.resolve({input1: res, buttonIndex: 2});
  1784. }
  1785. } else {
  1786. navigator.notification.prompt(message, function (result) {
  1787. q.resolve(result);
  1788. }, title, buttonLabels, defaultText);
  1789. }
  1790. return q.promise;
  1791. },
  1792.  
  1793. beep: function (times) {
  1794. return navigator.notification.beep(times);
  1795. }
  1796. };
  1797. }]);
  1798.  
  1799. // install : cordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git
  1800. // link : https://github.com/katzer/cordova-plugin-email-composer
  1801.  
  1802. angular.module('ngCordova.plugins.emailComposer', [])
  1803.  
  1804. .factory('$cordovaEmailComposer', ['$q', function ($q) {
  1805.  
  1806. return {
  1807. isAvailable: function () {
  1808. var q = $q.defer();
  1809.  
  1810. cordova.plugins.email.isAvailable(function (isAvailable) {
  1811. if (isAvailable) {
  1812. q.resolve();
  1813. } else {
  1814. q.reject();
  1815. }
  1816. });
  1817.  
  1818. return q.promise;
  1819. },
  1820.  
  1821. open: function (properties) {
  1822. var q = $q.defer();
  1823.  
  1824. cordova.plugins.email.open(properties, function () {
  1825. q.reject(); // user closed email composer
  1826. });
  1827.  
  1828. return q.promise;
  1829. },
  1830.  
  1831. addAlias: function (app, schema) {
  1832. cordova.plugins.email.addAlias(app, schema);
  1833. }
  1834. };
  1835. }]);
  1836.  
  1837. // install : cordova -d plugin add https://github.com/Wizcorp/phonegap-facebook-plugin.git --variable APP_ID="123456789" --variable APP_NAME="myApplication"
  1838. // link : https://github.com/Wizcorp/phonegap-facebook-plugin
  1839.  
  1840. angular.module('ngCordova.plugins.facebook', [])
  1841.  
  1842. .provider('$cordovaFacebook', [function () {
  1843.  
  1844. /**
  1845. * Init browser settings for Facebook plugin
  1846. *
  1847. * @param {number} id
  1848. * @param {string} version
  1849. */
  1850. this.browserInit = function (id, version) {
  1851. this.appID = id;
  1852. this.appVersion = version || "v2.0";
  1853. facebookConnectPlugin.browserInit(this.appID, this.appVersion);
  1854. };
  1855.  
  1856. this.$get = ['$q', function ($q) {
  1857. return {
  1858. login: function (permissions) {
  1859. var q = $q.defer();
  1860. facebookConnectPlugin.login(permissions, function (res) {
  1861. q.resolve(res);
  1862. }, function (res) {
  1863. q.reject(res);
  1864. });
  1865.  
  1866. return q.promise;
  1867. },
  1868.  
  1869. showDialog: function (options) {
  1870. var q = $q.defer();
  1871. facebookConnectPlugin.showDialog(options, function (res) {
  1872. q.resolve(res);
  1873. }, function (err) {
  1874. q.reject(err);
  1875. });
  1876. return q.promise;
  1877. },
  1878.  
  1879. api: function (path, permissions) {
  1880. var q = $q.defer();
  1881. facebookConnectPlugin.api(path, permissions, function (res) {
  1882. q.resolve(res);
  1883. }, function (err) {
  1884. q.reject(err);
  1885. });
  1886. return q.promise;
  1887. },
  1888.  
  1889. getAccessToken: function () {
  1890. var q = $q.defer();
  1891. facebookConnectPlugin.getAccessToken(function (res) {
  1892. q.resolve(res);
  1893. }, function (err) {
  1894. q.reject(err);
  1895. });
  1896. return q.promise;
  1897. },
  1898.  
  1899. getLoginStatus: function () {
  1900. var q = $q.defer();
  1901. facebookConnectPlugin.getLoginStatus(function (res) {
  1902. q.resolve(res);
  1903. }, function (err) {
  1904. q.reject(err);
  1905. });
  1906. return q.promise;
  1907. },
  1908.  
  1909. logout: function () {
  1910. var q = $q.defer();
  1911. facebookConnectPlugin.logout(function (res) {
  1912. q.resolve(res);
  1913. }, function (err) {
  1914. q.reject(err);
  1915. });
  1916. return q.promise;
  1917. }
  1918. };
  1919. }];
  1920. }]);
  1921.  
  1922. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-facebookads.git
  1923. // link : https://github.com/floatinghotpot/cordova-plugin-facebookads
  1924.  
  1925. angular.module('ngCordova.plugins.facebookAds', [])
  1926.  
  1927. .factory('$cordovaFacebookAds', ['$q', '$window', function ($q, $window) {
  1928.  
  1929. return {
  1930. setOptions: function (options) {
  1931. var d = $q.defer();
  1932.  
  1933. $window.FacebookAds.setOptions(options, function () {
  1934. d.resolve();
  1935. }, function () {
  1936. d.reject();
  1937. });
  1938.  
  1939. return d.promise;
  1940. },
  1941.  
  1942. createBanner: function (options) {
  1943. var d = $q.defer();
  1944.  
  1945. $window.FacebookAds.createBanner(options, function () {
  1946. d.resolve();
  1947. }, function () {
  1948. d.reject();
  1949. });
  1950.  
  1951. return d.promise;
  1952. },
  1953.  
  1954. removeBanner: function () {
  1955. var d = $q.defer();
  1956.  
  1957. $window.FacebookAds.removeBanner(function () {
  1958. d.resolve();
  1959. }, function () {
  1960. d.reject();
  1961. });
  1962.  
  1963. return d.promise;
  1964. },
  1965.  
  1966. showBanner: function (position) {
  1967. var d = $q.defer();
  1968.  
  1969. $window.FacebookAds.showBanner(position, function () {
  1970. d.resolve();
  1971. }, function () {
  1972. d.reject();
  1973. });
  1974.  
  1975. return d.promise;
  1976. },
  1977.  
  1978. showBannerAtXY: function (x, y) {
  1979. var d = $q.defer();
  1980.  
  1981. $window.FacebookAds.showBannerAtXY(x, y, function () {
  1982. d.resolve();
  1983. }, function () {
  1984. d.reject();
  1985. });
  1986.  
  1987. return d.promise;
  1988. },
  1989.  
  1990. hideBanner: function () {
  1991. var d = $q.defer();
  1992.  
  1993. $window.FacebookAds.hideBanner(function () {
  1994. d.resolve();
  1995. }, function () {
  1996. d.reject();
  1997. });
  1998.  
  1999. return d.promise;
  2000. },
  2001.  
  2002. prepareInterstitial: function (options) {
  2003. var d = $q.defer();
  2004.  
  2005. $window.FacebookAds.prepareInterstitial(options, function () {
  2006. d.resolve();
  2007. }, function () {
  2008. d.reject();
  2009. });
  2010.  
  2011. return d.promise;
  2012. },
  2013.  
  2014. showInterstitial: function () {
  2015. var d = $q.defer();
  2016.  
  2017. $window.FacebookAds.showInterstitial(function () {
  2018. d.resolve();
  2019. }, function () {
  2020. d.reject();
  2021. });
  2022.  
  2023. return d.promise;
  2024. }
  2025. };
  2026. }]);
  2027.  
  2028. // install : cordova plugin add cordova-plugin-file
  2029. // link : https://github.com/apache/cordova-plugin-file
  2030.  
  2031. angular.module('ngCordova.plugins.file', [])
  2032.  
  2033. .constant("$cordovaFileError", {
  2034. 1: 'NOT_FOUND_ERR',
  2035. 2: 'SECURITY_ERR',
  2036. 3: 'ABORT_ERR',
  2037. 4: 'NOT_READABLE_ERR',
  2038. 5: 'ENCODING_ERR',
  2039. 6: 'NO_MODIFICATION_ALLOWED_ERR',
  2040. 7: 'INVALID_STATE_ERR',
  2041. 8: 'SYNTAX_ERR',
  2042. 9: 'INVALID_MODIFICATION_ERR',
  2043. 10: 'QUOTA_EXCEEDED_ERR',
  2044. 11: 'TYPE_MISMATCH_ERR',
  2045. 12: 'PATH_EXISTS_ERR'
  2046. })
  2047.  
  2048. .provider('$cordovaFile', [function () {
  2049.  
  2050. this.$get = ['$q', '$window', '$cordovaFileError', function ($q, $window, $cordovaFileError) {
  2051.  
  2052. return {
  2053.  
  2054. getFreeDiskSpace: function () {
  2055. var q = $q.defer();
  2056. cordova.exec(function (result) {
  2057. q.resolve(result);
  2058. }, function (error) {
  2059. q.reject(error);
  2060. }, "File", "getFreeDiskSpace", []);
  2061. return q.promise;
  2062. },
  2063.  
  2064. checkDir: function (path, dir) {
  2065. var q = $q.defer();
  2066.  
  2067. if ((/^\//.test(dir))) {
  2068. q.reject("directory cannot start with \/");
  2069. }
  2070.  
  2071. try {
  2072. var directory = path + dir;
  2073. $window.resolveLocalFileSystemURL(directory, function (fileSystem) {
  2074. if (fileSystem.isDirectory === true) {
  2075. q.resolve(fileSystem);
  2076. } else {
  2077. q.reject({code: 13, message: "input is not a directory"});
  2078. }
  2079. }, function (error) {
  2080. error.message = $cordovaFileError[error.code];
  2081. q.reject(error);
  2082. });
  2083. } catch (err) {
  2084. err.message = $cordovaFileError[err.code];
  2085. q.reject(err);
  2086. }
  2087.  
  2088. return q.promise;
  2089. },
  2090.  
  2091. checkFile: function (path, file) {
  2092. var q = $q.defer();
  2093.  
  2094. if ((/^\//.test(file))) {
  2095. q.reject("directory cannot start with \/");
  2096. }
  2097.  
  2098. try {
  2099. var directory = path + file;
  2100. $window.resolveLocalFileSystemURL(directory, function (fileSystem) {
  2101. if (fileSystem.isFile === true) {
  2102. q.resolve(fileSystem);
  2103. } else {
  2104. q.reject({code: 13, message: "input is not a file"});
  2105. }
  2106. }, function (error) {
  2107. error.message = $cordovaFileError[error.code];
  2108. q.reject(error);
  2109. });
  2110. } catch (err) {
  2111. err.message = $cordovaFileError[err.code];
  2112. q.reject(err);
  2113. }
  2114.  
  2115. return q.promise;
  2116. },
  2117.  
  2118. createDir: function (path, dirName, replaceBool) {
  2119. var q = $q.defer();
  2120.  
  2121. if ((/^\//.test(dirName))) {
  2122. q.reject("directory cannot start with \/");
  2123. }
  2124.  
  2125. replaceBool = replaceBool ? false : true;
  2126.  
  2127. var options = {
  2128. create: true,
  2129. exclusive: replaceBool
  2130. };
  2131.  
  2132. try {
  2133. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2134. fileSystem.getDirectory(dirName, options, function (result) {
  2135. q.resolve(result);
  2136. }, function (error) {
  2137. error.message = $cordovaFileError[error.code];
  2138. q.reject(error);
  2139. });
  2140. }, function (err) {
  2141. err.message = $cordovaFileError[err.code];
  2142. q.reject(err);
  2143. });
  2144. } catch (e) {
  2145. e.message = $cordovaFileError[e.code];
  2146. q.reject(e);
  2147. }
  2148.  
  2149. return q.promise;
  2150. },
  2151.  
  2152. createFile: function (path, fileName, replaceBool) {
  2153. var q = $q.defer();
  2154.  
  2155. if ((/^\//.test(fileName))) {
  2156. q.reject("file-name cannot start with \/");
  2157. }
  2158.  
  2159. replaceBool = replaceBool ? false : true;
  2160.  
  2161. var options = {
  2162. create: true,
  2163. exclusive: replaceBool
  2164. };
  2165.  
  2166. try {
  2167. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2168. fileSystem.getFile(fileName, options, function (result) {
  2169. q.resolve(result);
  2170. }, function (error) {
  2171. error.message = $cordovaFileError[error.code];
  2172. q.reject(error);
  2173. });
  2174. }, function (err) {
  2175. err.message = $cordovaFileError[err.code];
  2176. q.reject(err);
  2177. });
  2178. } catch (e) {
  2179. e.message = $cordovaFileError[e.code];
  2180. q.reject(e);
  2181. }
  2182. return q.promise;
  2183. },
  2184.  
  2185. removeDir: function (path, dirName) {
  2186. var q = $q.defer();
  2187.  
  2188. if ((/^\//.test(dirName))) {
  2189. q.reject("file-name cannot start with \/");
  2190. }
  2191.  
  2192. try {
  2193. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2194. fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) {
  2195. dirEntry.remove(function () {
  2196. q.resolve({success: true, fileRemoved: dirEntry});
  2197. }, function (error) {
  2198. error.message = $cordovaFileError[error.code];
  2199. q.reject(error);
  2200. });
  2201. }, function (err) {
  2202. err.message = $cordovaFileError[err.code];
  2203. q.reject(err);
  2204. });
  2205. }, function (er) {
  2206. er.message = $cordovaFileError[er.code];
  2207. q.reject(er);
  2208. });
  2209. } catch (e) {
  2210. e.message = $cordovaFileError[e.code];
  2211. q.reject(e);
  2212. }
  2213. return q.promise;
  2214. },
  2215.  
  2216. removeFile: function (path, fileName) {
  2217. var q = $q.defer();
  2218.  
  2219. if ((/^\//.test(fileName))) {
  2220. q.reject("file-name cannot start with \/");
  2221. }
  2222.  
  2223. try {
  2224. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2225. fileSystem.getFile(fileName, {create: false}, function (fileEntry) {
  2226. fileEntry.remove(function () {
  2227. q.resolve({success: true, fileRemoved: fileEntry});
  2228. }, function (error) {
  2229. error.message = $cordovaFileError[error.code];
  2230. q.reject(error);
  2231. });
  2232. }, function (err) {
  2233. err.message = $cordovaFileError[err.code];
  2234. q.reject(err);
  2235. });
  2236. }, function (er) {
  2237. er.message = $cordovaFileError[er.code];
  2238. q.reject(er);
  2239. });
  2240. } catch (e) {
  2241. e.message = $cordovaFileError[e.code];
  2242. q.reject(e);
  2243. }
  2244. return q.promise;
  2245. },
  2246.  
  2247. removeRecursively: function (path, dirName) {
  2248. var q = $q.defer();
  2249.  
  2250. if ((/^\//.test(dirName))) {
  2251. q.reject("file-name cannot start with \/");
  2252. }
  2253.  
  2254. try {
  2255. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2256. fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) {
  2257. dirEntry.removeRecursively(function () {
  2258. q.resolve({success: true, fileRemoved: dirEntry});
  2259. }, function (error) {
  2260. error.message = $cordovaFileError[error.code];
  2261. q.reject(error);
  2262. });
  2263. }, function (err) {
  2264. err.message = $cordovaFileError[err.code];
  2265. q.reject(err);
  2266. });
  2267. }, function (er) {
  2268. er.message = $cordovaFileError[er.code];
  2269. q.reject(er);
  2270. });
  2271. } catch (e) {
  2272. e.message = $cordovaFileError[e.code];
  2273. q.reject(e);
  2274. }
  2275. return q.promise;
  2276. },
  2277.  
  2278. writeFile: function (path, fileName, text, replaceBool) {
  2279. var q = $q.defer();
  2280.  
  2281. if ((/^\//.test(fileName))) {
  2282. q.reject("file-name cannot start with \/");
  2283. }
  2284.  
  2285. replaceBool = replaceBool ? false : true;
  2286.  
  2287. var options = {
  2288. create: true,
  2289. exclusive: replaceBool
  2290. };
  2291.  
  2292. try {
  2293. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2294. fileSystem.getFile(fileName, options, function (fileEntry) {
  2295. fileEntry.createWriter(function (writer) {
  2296. if (options.append === true) {
  2297. writer.seek(writer.length);
  2298. }
  2299.  
  2300. if (options.truncate) {
  2301. writer.truncate(options.truncate);
  2302. }
  2303.  
  2304. writer.onwriteend = function (evt) {
  2305. if (this.error) {
  2306. q.reject(this.error);
  2307. } else {
  2308. q.resolve(evt);
  2309. }
  2310. };
  2311.  
  2312. writer.write(text);
  2313.  
  2314. q.promise.abort = function () {
  2315. writer.abort();
  2316. };
  2317. });
  2318. }, function (error) {
  2319. error.message = $cordovaFileError[error.code];
  2320. q.reject(error);
  2321. });
  2322. }, function (err) {
  2323. err.message = $cordovaFileError[err.code];
  2324. q.reject(err);
  2325. });
  2326. } catch (e) {
  2327. e.message = $cordovaFileError[e.code];
  2328. q.reject(e);
  2329. }
  2330.  
  2331. return q.promise;
  2332. },
  2333.  
  2334. writeExistingFile: function (path, fileName, text) {
  2335. var q = $q.defer();
  2336.  
  2337. if ((/^\//.test(fileName))) {
  2338. q.reject("file-name cannot start with \/");
  2339. }
  2340.  
  2341. try {
  2342. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2343. fileSystem.getFile(fileName, {create: false}, function (fileEntry) {
  2344. fileEntry.createWriter(function (writer) {
  2345. writer.seek(writer.length);
  2346.  
  2347. writer.onwriteend = function (evt) {
  2348. if (this.error) {
  2349. q.reject(this.error);
  2350. } else {
  2351. q.resolve(evt);
  2352. }
  2353. };
  2354.  
  2355. writer.write(text);
  2356.  
  2357. q.promise.abort = function () {
  2358. writer.abort();
  2359. };
  2360. });
  2361. }, function (error) {
  2362. error.message = $cordovaFileError[error.code];
  2363. q.reject(error);
  2364. });
  2365. }, function (err) {
  2366. err.message = $cordovaFileError[err.code];
  2367. q.reject(err);
  2368. });
  2369. } catch (e) {
  2370. e.message = $cordovaFileError[e.code];
  2371. q.reject(e);
  2372. }
  2373.  
  2374. return q.promise;
  2375. },
  2376.  
  2377. readAsText: function (path, file) {
  2378. var q = $q.defer();
  2379.  
  2380. if ((/^\//.test(file))) {
  2381. q.reject("file-name cannot start with \/");
  2382. }
  2383.  
  2384. try {
  2385. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2386. fileSystem.getFile(file, {create: false}, function (fileEntry) {
  2387. fileEntry.file(function (fileData) {
  2388. var reader = new FileReader();
  2389.  
  2390. reader.onloadend = function (evt) {
  2391. if (evt.target.result !== undefined || evt.target.result !== null) {
  2392. q.resolve(evt.target.result);
  2393. } else if (evt.target.error !== undefined || evt.target.error !== null) {
  2394. q.reject(evt.target.error);
  2395. } else {
  2396. q.reject({code: null, message: 'READER_ONLOADEND_ERR'});
  2397. }
  2398. };
  2399.  
  2400. reader.readAsText(fileData);
  2401. });
  2402. }, function (error) {
  2403. error.message = $cordovaFileError[error.code];
  2404. q.reject(error);
  2405. });
  2406. }, function (err) {
  2407. err.message = $cordovaFileError[err.code];
  2408. q.reject(err);
  2409. });
  2410. } catch (e) {
  2411. e.message = $cordovaFileError[e.code];
  2412. q.reject(e);
  2413. }
  2414.  
  2415. return q.promise;
  2416. },
  2417.  
  2418. readAsDataURL: function (path, file) {
  2419. var q = $q.defer();
  2420.  
  2421. if ((/^\//.test(file))) {
  2422. q.reject("file-name cannot start with \/");
  2423. }
  2424.  
  2425. try {
  2426. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2427. fileSystem.getFile(file, {create: false}, function (fileEntry) {
  2428. fileEntry.file(function (fileData) {
  2429. var reader = new FileReader();
  2430. reader.onloadend = function (evt) {
  2431. if (evt.target.result !== undefined || evt.target.result !== null) {
  2432. q.resolve(evt.target.result);
  2433. } else if (evt.target.error !== undefined || evt.target.error !== null) {
  2434. q.reject(evt.target.error);
  2435. } else {
  2436. q.reject({code: null, message: 'READER_ONLOADEND_ERR'});
  2437. }
  2438. };
  2439. reader.readAsDataURL(fileData);
  2440. });
  2441. }, function (error) {
  2442. error.message = $cordovaFileError[error.code];
  2443. q.reject(error);
  2444. });
  2445. }, function (err) {
  2446. err.message = $cordovaFileError[err.code];
  2447. q.reject(err);
  2448. });
  2449. } catch (e) {
  2450. e.message = $cordovaFileError[e.code];
  2451. q.reject(e);
  2452. }
  2453.  
  2454. return q.promise;
  2455. },
  2456.  
  2457. readAsBinaryString: function (path, file) {
  2458. var q = $q.defer();
  2459.  
  2460. if ((/^\//.test(file))) {
  2461. q.reject("file-name cannot start with \/");
  2462. }
  2463.  
  2464. try {
  2465. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2466. fileSystem.getFile(file, {create: false}, function (fileEntry) {
  2467. fileEntry.file(function (fileData) {
  2468. var reader = new FileReader();
  2469. reader.onloadend = function (evt) {
  2470. if (evt.target.result !== undefined || evt.target.result !== null) {
  2471. q.resolve(evt.target.result);
  2472. } else if (evt.target.error !== undefined || evt.target.error !== null) {
  2473. q.reject(evt.target.error);
  2474. } else {
  2475. q.reject({code: null, message: 'READER_ONLOADEND_ERR'});
  2476. }
  2477. };
  2478. reader.readAsBinaryString(fileData);
  2479. });
  2480. }, function (error) {
  2481. error.message = $cordovaFileError[error.code];
  2482. q.reject(error);
  2483. });
  2484. }, function (err) {
  2485. err.message = $cordovaFileError[err.code];
  2486. q.reject(err);
  2487. });
  2488. } catch (e) {
  2489. e.message = $cordovaFileError[e.code];
  2490. q.reject(e);
  2491. }
  2492.  
  2493. return q.promise;
  2494. },
  2495.  
  2496. readAsArrayBuffer: function (path, file) {
  2497. var q = $q.defer();
  2498.  
  2499. if ((/^\//.test(file))) {
  2500. q.reject("file-name cannot start with \/");
  2501. }
  2502.  
  2503. try {
  2504. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2505. fileSystem.getFile(file, {create: false}, function (fileEntry) {
  2506. fileEntry.file(function (fileData) {
  2507. var reader = new FileReader();
  2508. reader.onloadend = function (evt) {
  2509. if (evt.target.result !== undefined || evt.target.result !== null) {
  2510. q.resolve(evt.target.result);
  2511. } else if (evt.target.error !== undefined || evt.target.error !== null) {
  2512. q.reject(evt.target.error);
  2513. } else {
  2514. q.reject({code: null, message: 'READER_ONLOADEND_ERR'});
  2515. }
  2516. };
  2517. reader.readAsArrayBuffer(fileData);
  2518. });
  2519. }, function (error) {
  2520. error.message = $cordovaFileError[error.code];
  2521. q.reject(error);
  2522. });
  2523. }, function (err) {
  2524. err.message = $cordovaFileError[err.code];
  2525. q.reject(err);
  2526. });
  2527. } catch (e) {
  2528. e.message = $cordovaFileError[e.code];
  2529. q.reject(e);
  2530. }
  2531.  
  2532. return q.promise;
  2533. },
  2534.  
  2535. moveFile: function (path, fileName, newPath, newFileName) {
  2536. var q = $q.defer();
  2537.  
  2538. newFileName = newFileName || fileName;
  2539.  
  2540. if ((/^\//.test(fileName)) || (/^\//.test(newFileName))) {
  2541. q.reject("file-name cannot start with \/");
  2542. }
  2543.  
  2544. try {
  2545. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2546. fileSystem.getFile(fileName, {create: false}, function (fileEntry) {
  2547. $window.resolveLocalFileSystemURL(newPath, function (newFileEntry) {
  2548. fileEntry.moveTo(newFileEntry, newFileName, function (result) {
  2549. q.resolve(result);
  2550. }, function (error) {
  2551. q.reject(error);
  2552. });
  2553. }, function (err) {
  2554. q.reject(err);
  2555. });
  2556. }, function (err) {
  2557. q.reject(err);
  2558. });
  2559. }, function (er) {
  2560. q.reject(er);
  2561. });
  2562. } catch (e) {
  2563. q.reject(e);
  2564. }
  2565. return q.promise;
  2566. },
  2567.  
  2568. moveDir: function (path, dirName, newPath, newDirName) {
  2569. var q = $q.defer();
  2570.  
  2571. newDirName = newDirName || dirName;
  2572.  
  2573. if (/^\//.test(dirName) || (/^\//.test(newDirName))) {
  2574. q.reject("file-name cannot start with \/");
  2575. }
  2576.  
  2577. try {
  2578. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2579. fileSystem.getDirectory(dirName, {create: false}, function (dirEntry) {
  2580. $window.resolveLocalFileSystemURL(newPath, function (newDirEntry) {
  2581. dirEntry.moveTo(newDirEntry, newDirName, function (result) {
  2582. q.resolve(result);
  2583. }, function (error) {
  2584. q.reject(error);
  2585. });
  2586. }, function (erro) {
  2587. q.reject(erro);
  2588. });
  2589. }, function (err) {
  2590. q.reject(err);
  2591. });
  2592. }, function (er) {
  2593. q.reject(er);
  2594. });
  2595. } catch (e) {
  2596. q.reject(e);
  2597. }
  2598. return q.promise;
  2599. },
  2600.  
  2601. copyDir: function (path, dirName, newPath, newDirName) {
  2602. var q = $q.defer();
  2603.  
  2604. newDirName = newDirName || dirName;
  2605.  
  2606. if (/^\//.test(dirName) || (/^\//.test(newDirName))) {
  2607. q.reject("file-name cannot start with \/");
  2608. }
  2609.  
  2610. try {
  2611. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2612. fileSystem.getDirectory(dirName, {create: false, exclusive: false}, function (dirEntry) {
  2613.  
  2614. $window.resolveLocalFileSystemURL(newPath, function (newDirEntry) {
  2615. dirEntry.copyTo(newDirEntry, newDirName, function (result) {
  2616. q.resolve(result);
  2617. }, function (error) {
  2618. error.message = $cordovaFileError[error.code];
  2619. q.reject(error);
  2620. });
  2621. }, function (erro) {
  2622. erro.message = $cordovaFileError[erro.code];
  2623. q.reject(erro);
  2624. });
  2625. }, function (err) {
  2626. err.message = $cordovaFileError[err.code];
  2627. q.reject(err);
  2628. });
  2629. }, function (er) {
  2630. er.message = $cordovaFileError[er.code];
  2631. q.reject(er);
  2632. });
  2633. } catch (e) {
  2634. e.message = $cordovaFileError[e.code];
  2635. q.reject(e);
  2636. }
  2637. return q.promise;
  2638. },
  2639.  
  2640. copyFile: function (path, fileName, newPath, newFileName) {
  2641. var q = $q.defer();
  2642.  
  2643. newFileName = newFileName || fileName;
  2644.  
  2645. if ((/^\//.test(fileName))) {
  2646. q.reject("file-name cannot start with \/");
  2647. }
  2648.  
  2649. try {
  2650. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2651. fileSystem.getFile(fileName, {create: false, exclusive: false}, function (fileEntry) {
  2652.  
  2653. $window.resolveLocalFileSystemURL(newPath, function (newFileEntry) {
  2654. fileEntry.copyTo(newFileEntry, newFileName, function (result) {
  2655. q.resolve(result);
  2656. }, function (error) {
  2657. error.message = $cordovaFileError[error.code];
  2658. q.reject(error);
  2659. });
  2660. }, function (erro) {
  2661. erro.message = $cordovaFileError[erro.code];
  2662. q.reject(erro);
  2663. });
  2664. }, function (err) {
  2665. err.message = $cordovaFileError[err.code];
  2666. q.reject(err);
  2667. });
  2668. }, function (er) {
  2669. er.message = $cordovaFileError[er.code];
  2670. q.reject(er);
  2671. });
  2672. } catch (e) {
  2673. e.message = $cordovaFileError[e.code];
  2674. q.reject(e);
  2675. }
  2676. return q.promise;
  2677. }
  2678.  
  2679. /*
  2680. listFiles: function (path, dir) {
  2681.  
  2682. },
  2683.  
  2684. listDir: function (path, dirName) {
  2685. var q = $q.defer();
  2686.  
  2687. try {
  2688. $window.resolveLocalFileSystemURL(path, function (fileSystem) {
  2689. fileSystem.getDirectory(dirName, options, function (parent) {
  2690. var reader = parent.createReader();
  2691. reader.readEntries(function (entries) {
  2692. q.resolve(entries);
  2693. }, function () {
  2694. q.reject('DIR_READ_ERROR : ' + path + dirName);
  2695. });
  2696. }, function (error) {
  2697. error.message = $cordovaFileError[error.code];
  2698. q.reject(error);
  2699. });
  2700. }, function (err) {
  2701. err.message = $cordovaFileError[err.code];
  2702. q.reject(err);
  2703. });
  2704. } catch (e) {
  2705. e.message = $cordovaFileError[e.code];
  2706. q.reject(e);
  2707. }
  2708.  
  2709. return q.promise;
  2710. },
  2711.  
  2712. readFileMetadata: function (filePath) {
  2713. //return getFile(filePath, {create: false});
  2714. }
  2715. */
  2716. };
  2717.  
  2718. }];
  2719. }]);
  2720.  
  2721. // install : cordova plugin add https://github.com/pwlin/cordova-plugin-file-opener2.git
  2722. // link : https://github.com/pwlin/cordova-plugin-file-opener2
  2723.  
  2724. angular.module('ngCordova.plugins.fileOpener2', [])
  2725.  
  2726. .factory('$cordovaFileOpener2', ['$q', function ($q) {
  2727.  
  2728. return {
  2729. open: function (file, type) {
  2730. var q = $q.defer();
  2731. cordova.plugins.fileOpener2.open(file, type, {
  2732. error: function (e) {
  2733. q.reject(e);
  2734. }, success: function () {
  2735. q.resolve();
  2736. }
  2737. });
  2738. return q.promise;
  2739. },
  2740.  
  2741. uninstall: function (pack) {
  2742. var q = $q.defer();
  2743. cordova.plugins.fileOpener2.uninstall(pack, {
  2744. error: function (e) {
  2745. q.reject(e);
  2746. }, success: function () {
  2747. q.resolve();
  2748. }
  2749. });
  2750. return q.promise;
  2751. },
  2752.  
  2753. appIsInstalled: function (pack) {
  2754. var q = $q.defer();
  2755. cordova.plugins.fileOpener2.appIsInstalled(pack, {
  2756. success: function (res) {
  2757. q.resolve(res);
  2758. }
  2759. });
  2760. return q.promise;
  2761. }
  2762. };
  2763. }]);
  2764.  
  2765. // install : cordova plugin add cordova-plugin-file-transfer
  2766. // link : https://github.com/apache/cordova-plugin-file-transfer
  2767.  
  2768. angular.module('ngCordova.plugins.fileTransfer', [])
  2769.  
  2770. .factory('$cordovaFileTransfer', ['$q', '$timeout', function ($q, $timeout) {
  2771. return {
  2772. download: function (source, filePath, options, trustAllHosts) {
  2773. var q = $q.defer();
  2774. var ft = new FileTransfer();
  2775. var uri = (options && options.encodeURI === false) ? source : encodeURI(source);
  2776.  
  2777. if (options && options.timeout !== undefined && options.timeout !== null) {
  2778. $timeout(function () {
  2779. ft.abort();
  2780. }, options.timeout);
  2781. options.timeout = null;
  2782. }
  2783.  
  2784. ft.onprogress = function (progress) {
  2785. q.notify(progress);
  2786. };
  2787.  
  2788. q.promise.abort = function () {
  2789. ft.abort();
  2790. };
  2791.  
  2792. ft.download(uri, filePath, q.resolve, q.reject, trustAllHosts, options);
  2793. return q.promise;
  2794. },
  2795.  
  2796. upload: function (server, filePath, options, trustAllHosts) {
  2797. var q = $q.defer();
  2798. var ft = new FileTransfer();
  2799. var uri = (options && options.encodeURI === false) ? server : encodeURI(server);
  2800.  
  2801. if (options && options.timeout !== undefined && options.timeout !== null) {
  2802. $timeout(function () {
  2803. ft.abort();
  2804. }, options.timeout);
  2805. options.timeout = null;
  2806. }
  2807.  
  2808. ft.onprogress = function (progress) {
  2809. q.notify(progress);
  2810. };
  2811.  
  2812. q.promise.abort = function () {
  2813. ft.abort();
  2814. };
  2815.  
  2816. ft.upload(filePath, uri, q.resolve, q.reject, options, trustAllHosts);
  2817. return q.promise;
  2818. }
  2819. };
  2820. }]);
  2821.  
  2822. // install : cordova plugin add https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin.git
  2823. // link : https://github.com/EddyVerbruggen/Flashlight-PhoneGap-Plugin
  2824.  
  2825. angular.module('ngCordova.plugins.flashlight', [])
  2826.  
  2827. .factory('$cordovaFlashlight', ['$q', '$window', function ($q, $window) {
  2828.  
  2829. return {
  2830. available: function () {
  2831. var q = $q.defer();
  2832. $window.plugins.flashlight.available(function (isAvailable) {
  2833. q.resolve(isAvailable);
  2834. });
  2835. return q.promise;
  2836. },
  2837.  
  2838. switchOn: function () {
  2839. var q = $q.defer();
  2840. $window.plugins.flashlight.switchOn(function (response) {
  2841. q.resolve(response);
  2842. }, function (error) {
  2843. q.reject(error);
  2844. });
  2845. return q.promise;
  2846. },
  2847.  
  2848. switchOff: function () {
  2849. var q = $q.defer();
  2850. $window.plugins.flashlight.switchOff(function (response) {
  2851. q.resolve(response);
  2852. }, function (error) {
  2853. q.reject(error);
  2854. });
  2855. return q.promise;
  2856. },
  2857.  
  2858. toggle: function () {
  2859. var q = $q.defer();
  2860. $window.plugins.flashlight.toggle(function (response) {
  2861. q.resolve(response);
  2862. }, function (error) {
  2863. q.reject(error);
  2864. });
  2865. return q.promise;
  2866. }
  2867. };
  2868. }]);
  2869.  
  2870. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-flurry.git
  2871. // link : https://github.com/floatinghotpot/cordova-plugin-flurry
  2872.  
  2873. angular.module('ngCordova.plugins.flurryAds', [])
  2874. .factory('$cordovaFlurryAds', ['$q', '$window', function ($q, $window) {
  2875.  
  2876. return {
  2877. setOptions: function (options) {
  2878. var d = $q.defer();
  2879.  
  2880. $window.FlurryAds.setOptions(options, function () {
  2881. d.resolve();
  2882. }, function () {
  2883. d.reject();
  2884. });
  2885.  
  2886. return d.promise;
  2887. },
  2888.  
  2889. createBanner: function (options) {
  2890. var d = $q.defer();
  2891.  
  2892. $window.FlurryAds.createBanner(options, function () {
  2893. d.resolve();
  2894. }, function () {
  2895. d.reject();
  2896. });
  2897.  
  2898. return d.promise;
  2899. },
  2900.  
  2901. removeBanner: function () {
  2902. var d = $q.defer();
  2903.  
  2904. $window.FlurryAds.removeBanner(function () {
  2905. d.resolve();
  2906. }, function () {
  2907. d.reject();
  2908. });
  2909.  
  2910. return d.promise;
  2911. },
  2912.  
  2913. showBanner: function (position) {
  2914. var d = $q.defer();
  2915.  
  2916. $window.FlurryAds.showBanner(position, function () {
  2917. d.resolve();
  2918. }, function () {
  2919. d.reject();
  2920. });
  2921.  
  2922. return d.promise;
  2923. },
  2924.  
  2925. showBannerAtXY: function (x, y) {
  2926. var d = $q.defer();
  2927.  
  2928. $window.FlurryAds.showBannerAtXY(x, y, function () {
  2929. d.resolve();
  2930. }, function () {
  2931. d.reject();
  2932. });
  2933.  
  2934. return d.promise;
  2935. },
  2936.  
  2937. hideBanner: function () {
  2938. var d = $q.defer();
  2939.  
  2940. $window.FlurryAds.hideBanner(function () {
  2941. d.resolve();
  2942. }, function () {
  2943. d.reject();
  2944. });
  2945.  
  2946. return d.promise;
  2947. },
  2948.  
  2949. prepareInterstitial: function (options) {
  2950. var d = $q.defer();
  2951.  
  2952. $window.FlurryAds.prepareInterstitial(options, function () {
  2953. d.resolve();
  2954. }, function () {
  2955. d.reject();
  2956. });
  2957.  
  2958. return d.promise;
  2959. },
  2960.  
  2961. showInterstitial: function () {
  2962. var d = $q.defer();
  2963.  
  2964. $window.FlurryAds.showInterstitial(function () {
  2965. d.resolve();
  2966. }, function () {
  2967. d.reject();
  2968. });
  2969.  
  2970. return d.promise;
  2971. }
  2972. };
  2973. }]);
  2974.  
  2975. // install : cordova plugin add https://github.com/phonegap-build/GAPlugin.git
  2976. // link : https://github.com/phonegap-build/GAPlugin
  2977.  
  2978. angular.module('ngCordova.plugins.ga', [])
  2979.  
  2980. .factory('$cordovaGA', ['$q', '$window', function ($q, $window) {
  2981.  
  2982. return {
  2983. init: function (id, mingap) {
  2984. var q = $q.defer();
  2985. mingap = (mingap >= 0) ? mingap : 10;
  2986. $window.plugins.gaPlugin.init(function (result) {
  2987. q.resolve(result);
  2988. },
  2989. function (error) {
  2990. q.reject(error);
  2991. },
  2992. id, mingap);
  2993. return q.promise;
  2994. },
  2995.  
  2996. trackEvent: function (success, fail, category, eventAction, eventLabel, eventValue) {
  2997. var q = $q.defer();
  2998. $window.plugins.gaPlugin.trackEvent(function (result) {
  2999. q.resolve(result);
  3000. },
  3001. function (error) {
  3002. q.reject(error);
  3003. },
  3004. category, eventAction, eventLabel, eventValue);
  3005. return q.promise;
  3006. },
  3007.  
  3008. trackPage: function (success, fail, pageURL) {
  3009. var q = $q.defer();
  3010. $window.plugins.gaPlugin.trackPage(function (result) {
  3011. q.resolve(result);
  3012. },
  3013. function (error) {
  3014. q.reject(error);
  3015. },
  3016. pageURL);
  3017. return q.promise;
  3018. },
  3019.  
  3020. setVariable: function (success, fail, index, value) {
  3021. var q = $q.defer();
  3022. $window.plugins.gaPlugin.setVariable(function (result) {
  3023. q.resolve(result);
  3024. },
  3025. function (error) {
  3026. q.reject(error);
  3027. },
  3028. index, value);
  3029. return q.promise;
  3030. },
  3031.  
  3032. exit: function (success, fail) {
  3033. var q = $q.defer();
  3034. $window.plugins.gaPlugin.exit(function (result) {
  3035. q.resolve(result);
  3036. },
  3037. function (error) {
  3038. q.reject(error);
  3039. });
  3040. return q.promise;
  3041. }
  3042. };
  3043. }]);
  3044.  
  3045. // install : cordova plugin add cordova-plugin-geolocation
  3046. // link : https://github.com/apache/cordova-plugin-geolocation
  3047.  
  3048. angular.module('ngCordova.plugins.geolocation', [])
  3049.  
  3050. .factory('$cordovaGeolocation', ['$q', function ($q) {
  3051.  
  3052. return {
  3053. getCurrentPosition: function (options) {
  3054. var q = $q.defer();
  3055.  
  3056. navigator.geolocation.getCurrentPosition(function (result) {
  3057. q.resolve(result);
  3058. }, function (err) {
  3059. q.reject(err);
  3060. }, options);
  3061.  
  3062. return q.promise;
  3063. },
  3064.  
  3065. watchPosition: function (options) {
  3066. var q = $q.defer();
  3067.  
  3068. var watchID = navigator.geolocation.watchPosition(function (result) {
  3069. q.notify(result);
  3070. }, function (err) {
  3071. q.reject(err);
  3072. }, options);
  3073.  
  3074. q.promise.cancel = function () {
  3075. navigator.geolocation.clearWatch(watchID);
  3076. };
  3077.  
  3078. q.promise.clearWatch = function (id) {
  3079. navigator.geolocation.clearWatch(id || watchID);
  3080. };
  3081.  
  3082. q.promise.watchID = watchID;
  3083.  
  3084. return q.promise;
  3085. },
  3086.  
  3087. clearWatch: function (watchID) {
  3088. return navigator.geolocation.clearWatch(watchID);
  3089. }
  3090. };
  3091. }]);
  3092.  
  3093. // install : cordova plugin add cordova-plugin-globalization
  3094. // link : https://github.com/apache/cordova-plugin-globalization
  3095.  
  3096. angular.module('ngCordova.plugins.globalization', [])
  3097.  
  3098. .factory('$cordovaGlobalization', ['$q', function ($q) {
  3099.  
  3100. return {
  3101. getPreferredLanguage: function () {
  3102. var q = $q.defer();
  3103.  
  3104. navigator.globalization.getPreferredLanguage(function (result) {
  3105. q.resolve(result);
  3106. },
  3107. function (err) {
  3108. q.reject(err);
  3109. });
  3110. return q.promise;
  3111. },
  3112.  
  3113. getLocaleName: function () {
  3114. var q = $q.defer();
  3115.  
  3116. navigator.globalization.getLocaleName(function (result) {
  3117. q.resolve(result);
  3118. },
  3119. function (err) {
  3120. q.reject(err);
  3121. });
  3122. return q.promise;
  3123. },
  3124.  
  3125. getFirstDayOfWeek: function () {
  3126. var q = $q.defer();
  3127.  
  3128. navigator.globalization.getFirstDayOfWeek(function (result) {
  3129. q.resolve(result);
  3130. },
  3131. function (err) {
  3132. q.reject(err);
  3133. });
  3134. return q.promise;
  3135. },
  3136.  
  3137. // "date" parameter must be a JavaScript Date Object.
  3138. dateToString: function (date, options) {
  3139. var q = $q.defer();
  3140.  
  3141. navigator.globalization.dateToString(
  3142. date,
  3143. function (result) {
  3144. q.resolve(result);
  3145. },
  3146. function (err) {
  3147. q.reject(err);
  3148. },
  3149. options);
  3150. return q.promise;
  3151. },
  3152.  
  3153. stringToDate: function (dateString, options) {
  3154. var q = $q.defer();
  3155.  
  3156. navigator.globalization.stringToDate(
  3157. dateString,
  3158. function (result) {
  3159. q.resolve(result);
  3160. },
  3161. function (err) {
  3162. q.reject(err);
  3163. },
  3164. options);
  3165. return q.promise;
  3166. },
  3167.  
  3168. getDatePattern: function (options) {
  3169. var q = $q.defer();
  3170.  
  3171. navigator.globalization.getDatePattern(
  3172. function (result) {
  3173. q.resolve(result);
  3174. },
  3175. function (err) {
  3176. q.reject(err);
  3177. },
  3178. options);
  3179. return q.promise;
  3180. },
  3181.  
  3182. getDateNames: function (options) {
  3183. var q = $q.defer();
  3184.  
  3185. navigator.globalization.getDateNames(
  3186. function (result) {
  3187. q.resolve(result);
  3188. },
  3189. function (err) {
  3190. q.reject(err);
  3191. },
  3192. options);
  3193. return q.promise;
  3194. },
  3195.  
  3196. // "date" parameter must be a JavaScript Date Object.
  3197. isDayLightSavingsTime: function (date) {
  3198. var q = $q.defer();
  3199.  
  3200. navigator.globalization.isDayLightSavingsTime(
  3201. date,
  3202. function (result) {
  3203. q.resolve(result);
  3204. },
  3205. function (err) {
  3206. q.reject(err);
  3207. });
  3208. return q.promise;
  3209. },
  3210.  
  3211. numberToString: function (number, options) {
  3212. var q = $q.defer();
  3213.  
  3214. navigator.globalization.numberToString(
  3215. number,
  3216. function (result) {
  3217. q.resolve(result);
  3218. },
  3219. function (err) {
  3220. q.reject(err);
  3221. },
  3222. options);
  3223. return q.promise;
  3224. },
  3225.  
  3226. stringToNumber: function (numberString, options) {
  3227. var q = $q.defer();
  3228.  
  3229. navigator.globalization.stringToNumber(
  3230. numberString,
  3231. function (result) {
  3232. q.resolve(result);
  3233. },
  3234. function (err) {
  3235. q.reject(err);
  3236. },
  3237. options);
  3238. return q.promise;
  3239. },
  3240.  
  3241. getNumberPattern: function (options) {
  3242. var q = $q.defer();
  3243.  
  3244. navigator.globalization.getNumberPattern(
  3245. function (result) {
  3246. q.resolve(result);
  3247. },
  3248. function (err) {
  3249. q.reject(err);
  3250. },
  3251. options);
  3252. return q.promise;
  3253. },
  3254.  
  3255. getCurrencyPattern: function (currencyCode) {
  3256. var q = $q.defer();
  3257.  
  3258. navigator.globalization.getCurrencyPattern(
  3259. currencyCode,
  3260. function (result) {
  3261. q.resolve(result);
  3262. },
  3263. function (err) {
  3264. q.reject(err);
  3265. });
  3266. return q.promise;
  3267. }
  3268.  
  3269. };
  3270. }]);
  3271.  
  3272. // install : cordova plugin add https://github.com/floatinghotpot/cordova-admob-pro.git
  3273. // link : https://github.com/floatinghotpot/cordova-admob-pro
  3274.  
  3275. angular.module('ngCordova.plugins.googleAds', [])
  3276.  
  3277. .factory('$cordovaGoogleAds', ['$q', '$window', function ($q, $window) {
  3278.  
  3279. return {
  3280. setOptions: function (options) {
  3281. var d = $q.defer();
  3282.  
  3283. $window.AdMob.setOptions(options, function () {
  3284. d.resolve();
  3285. }, function () {
  3286. d.reject();
  3287. });
  3288.  
  3289. return d.promise;
  3290. },
  3291.  
  3292. createBanner: function (options) {
  3293. var d = $q.defer();
  3294.  
  3295. $window.AdMob.createBanner(options, function () {
  3296. d.resolve();
  3297. }, function () {
  3298. d.reject();
  3299. });
  3300.  
  3301. return d.promise;
  3302. },
  3303.  
  3304. removeBanner: function () {
  3305. var d = $q.defer();
  3306.  
  3307. $window.AdMob.removeBanner(function () {
  3308. d.resolve();
  3309. }, function () {
  3310. d.reject();
  3311. });
  3312.  
  3313. return d.promise;
  3314. },
  3315.  
  3316. showBanner: function (position) {
  3317. var d = $q.defer();
  3318.  
  3319. $window.AdMob.showBanner(position, function () {
  3320. d.resolve();
  3321. }, function () {
  3322. d.reject();
  3323. });
  3324.  
  3325. return d.promise;
  3326. },
  3327.  
  3328. showBannerAtXY: function (x, y) {
  3329. var d = $q.defer();
  3330.  
  3331. $window.AdMob.showBannerAtXY(x, y, function () {
  3332. d.resolve();
  3333. }, function () {
  3334. d.reject();
  3335. });
  3336.  
  3337. return d.promise;
  3338. },
  3339.  
  3340. hideBanner: function () {
  3341. var d = $q.defer();
  3342.  
  3343. $window.AdMob.hideBanner(function () {
  3344. d.resolve();
  3345. }, function () {
  3346. d.reject();
  3347. });
  3348.  
  3349. return d.promise;
  3350. },
  3351.  
  3352. prepareInterstitial: function (options) {
  3353. var d = $q.defer();
  3354.  
  3355. $window.AdMob.prepareInterstitial(options, function () {
  3356. d.resolve();
  3357. }, function () {
  3358. d.reject();
  3359. });
  3360.  
  3361. return d.promise;
  3362. },
  3363.  
  3364. showInterstitial: function () {
  3365. var d = $q.defer();
  3366.  
  3367. $window.AdMob.showInterstitial(function () {
  3368. d.resolve();
  3369. }, function () {
  3370. d.reject();
  3371. });
  3372.  
  3373. return d.promise;
  3374. }
  3375. };
  3376. }]);
  3377.  
  3378. // install : cordova plugin add https://github.com/danwilson/google-analytics-plugin.git
  3379. // link : https://github.com/danwilson/google-analytics-plugin
  3380.  
  3381. angular.module('ngCordova.plugins.googleAnalytics', [])
  3382.  
  3383. .factory('$cordovaGoogleAnalytics', ['$q', '$window', function ($q, $window) {
  3384.  
  3385. return {
  3386. startTrackerWithId: function (id) {
  3387. var d = $q.defer();
  3388.  
  3389. $window.analytics.startTrackerWithId(id, function (response) {
  3390. d.resolve(response);
  3391. }, function (error) {
  3392. d.reject(error);
  3393. });
  3394.  
  3395. return d.promise;
  3396. },
  3397.  
  3398. setUserId: function (id) {
  3399. var d = $q.defer();
  3400.  
  3401. $window.analytics.setUserId(id, function (response) {
  3402. d.resolve(response);
  3403. }, function (error) {
  3404. d.reject(error);
  3405. });
  3406.  
  3407. return d.promise;
  3408. },
  3409.  
  3410. debugMode: function () {
  3411. var d = $q.defer();
  3412.  
  3413. $window.analytics.debugMode(function (response) {
  3414. d.resolve(response);
  3415. }, function () {
  3416. d.reject();
  3417. });
  3418.  
  3419. return d.promise;
  3420. },
  3421.  
  3422. trackView: function (screenName) {
  3423. var d = $q.defer();
  3424.  
  3425. $window.analytics.trackView(screenName, function (response) {
  3426. d.resolve(response);
  3427. }, function (error) {
  3428. d.reject(error);
  3429. });
  3430.  
  3431. return d.promise;
  3432. },
  3433.  
  3434. addCustomDimension: function (key, value) {
  3435. var d = $q.defer();
  3436.  
  3437. $window.analytics.addCustomDimension(key, value, function () {
  3438. d.resolve();
  3439. }, function (error) {
  3440. d.reject(error);
  3441. });
  3442.  
  3443. return d.promise;
  3444. },
  3445.  
  3446. trackEvent: function (category, action, label, value) {
  3447. var d = $q.defer();
  3448.  
  3449. $window.analytics.trackEvent(category, action, label, value, function (response) {
  3450. d.resolve(response);
  3451. }, function (error) {
  3452. d.reject(error);
  3453. });
  3454.  
  3455. return d.promise;
  3456. },
  3457.  
  3458. trackException: function (description, fatal) {
  3459. var d = $q.defer();
  3460.  
  3461. $window.analytics.trackException(description, fatal, function (response) {
  3462. d.resolve(response);
  3463. }, function (error) {
  3464. d.reject(error);
  3465. });
  3466.  
  3467. return d.promise;
  3468. },
  3469.  
  3470. trackTiming: function (category, milliseconds, variable, label) {
  3471. var d = $q.defer();
  3472.  
  3473. $window.analytics.trackTiming(category, milliseconds, variable, label, function (response) {
  3474. d.resolve(response);
  3475. }, function (error) {
  3476. d.reject(error);
  3477. });
  3478.  
  3479. return d.promise;
  3480. },
  3481.  
  3482. addTransaction: function (transactionId, affiliation, revenue, tax, shipping, currencyCode) {
  3483. var d = $q.defer();
  3484.  
  3485. $window.analytics.addTransaction(transactionId, affiliation, revenue, tax, shipping, currencyCode, function (response) {
  3486. d.resolve(response);
  3487. }, function (error) {
  3488. d.reject(error);
  3489. });
  3490.  
  3491. return d.promise;
  3492. },
  3493.  
  3494. addTransactionItem: function (transactionId, name, sku, category, price, quantity, currencyCode) {
  3495. var d = $q.defer();
  3496.  
  3497. $window.analytics.addTransactionItem(transactionId, name, sku, category, price, quantity, currencyCode, function (response) {
  3498. d.resolve(response);
  3499. }, function (error) {
  3500. d.reject(error);
  3501. });
  3502.  
  3503. return d.promise;
  3504. }
  3505. };
  3506. }]);
  3507.  
  3508. // install :
  3509. // link :
  3510.  
  3511. // Google Maps needs ALOT of work!
  3512. // Not for production use
  3513.  
  3514. angular.module('ngCordova.plugins.googleMap', [])
  3515.  
  3516. .factory('$cordovaGoogleMap', ['$q', '$window', function ($q, $window) {
  3517.  
  3518. var map = null;
  3519.  
  3520. return {
  3521. getMap: function (options) {
  3522. var q = $q.defer();
  3523.  
  3524. if (!$window.plugin.google.maps) {
  3525. q.reject(null);
  3526. } else {
  3527. var div = document.getElementById("map_canvas");
  3528. map = $window.plugin.google.maps.Map.getMap(options);
  3529. map.setDiv(div);
  3530. q.resolve(map);
  3531. }
  3532. return q.promise;
  3533. },
  3534.  
  3535. isMapLoaded: function () { // check if an instance of the map exists
  3536. return !!map;
  3537. },
  3538. addMarker: function (markerOptions) { // add a marker to the map with given markerOptions
  3539. var q = $q.defer();
  3540. map.addMarker(markerOptions, function (marker) {
  3541. q.resolve(marker);
  3542. });
  3543.  
  3544. return q.promise;
  3545. },
  3546. getMapTypeIds: function () {
  3547. return $window.plugin.google.maps.mapTypeId;
  3548. },
  3549. setVisible: function (isVisible) {
  3550. var q = $q.defer();
  3551. map.setVisible(isVisible);
  3552. return q.promise;
  3553. },
  3554. // I don't know how to deallocate te map and the google map plugin.
  3555. cleanup: function () {
  3556. map = null;
  3557. // delete map;
  3558. }
  3559. };
  3560. }]);
  3561.  
  3562. // install : cordova plugin add https://github.com/ptgamr/cordova-google-play-game.git --variable APP_ID=123456789
  3563. // link : https://github.com/ptgamr/cordova-google-play-game
  3564.  
  3565. angular.module('ngCordova.plugins.googlePlayGame', [])
  3566.  
  3567. .factory('$cordovaGooglePlayGame', ['$q', function ($q) {
  3568.  
  3569. return {
  3570. auth: function () {
  3571. var q = $q.defer();
  3572.  
  3573. googleplaygame.auth(function (success) {
  3574. return q.resolve(success);
  3575. }, function (err) {
  3576. return q.reject(err);
  3577. });
  3578.  
  3579. return q.promise;
  3580. },
  3581. signout: function () {
  3582. var q = $q.defer();
  3583.  
  3584. googleplaygame.signout(function (success) {
  3585. return q.resolve(success);
  3586. }, function (err) {
  3587. return q.reject(err);
  3588. });
  3589.  
  3590. return q.promise;
  3591. },
  3592. isSignedIn: function () {
  3593. var q = $q.defer();
  3594.  
  3595. googleplaygame.isSignedIn(function (success) {
  3596. return q.resolve(success);
  3597. }, function (err) {
  3598. return q.reject(err);
  3599. });
  3600.  
  3601. return q.promise;
  3602. },
  3603. showPlayer: function () {
  3604. var q = $q.defer();
  3605.  
  3606. googleplaygame.showPlayer(function (success) {
  3607. return q.resolve(success);
  3608. }, function (err) {
  3609. return q.reject(err);
  3610. });
  3611.  
  3612. return q.promise;
  3613. },
  3614. submitScore: function (data) {
  3615. var q = $q.defer();
  3616.  
  3617. googleplaygame.submitScore(data, function (success) {
  3618. return q.resolve(success);
  3619. }, function (err) {
  3620. return q.reject(err);
  3621. });
  3622.  
  3623. return q.promise;
  3624. },
  3625. showAllLeaderboards: function () {
  3626. var q = $q.defer();
  3627.  
  3628. googleplaygame.showAllLeaderboards(function (success) {
  3629. return q.resolve(success);
  3630. }, function (err) {
  3631. return q.reject(err);
  3632. });
  3633.  
  3634. return q.promise;
  3635. },
  3636. showLeaderboard: function (data) {
  3637. var q = $q.defer();
  3638.  
  3639. googleplaygame.showLeaderboard(data, function (success) {
  3640. return q.resolve(success);
  3641. }, function (err) {
  3642. return q.reject(err);
  3643. });
  3644.  
  3645. return q.promise;
  3646. },
  3647. unlockAchievement: function (data) {
  3648. var q = $q.defer();
  3649.  
  3650. googleplaygame.unlockAchievement(data, function (success) {
  3651. return q.resolve(success);
  3652. }, function (err) {
  3653. return q.reject(err);
  3654. });
  3655.  
  3656. return q.promise;
  3657. },
  3658. incrementAchievement: function (data) {
  3659. var q = $q.defer();
  3660.  
  3661. googleplaygame.incrementAchievement(data, function (success) {
  3662. return q.resolve(success);
  3663. }, function (err) {
  3664. return q.reject(err);
  3665. });
  3666.  
  3667. return q.promise;
  3668. },
  3669. showAchievements: function () {
  3670. var q = $q.defer();
  3671.  
  3672. googleplaygame.showAchievements(function (success) {
  3673. return q.resolve(success);
  3674. }, function (err) {
  3675. return q.reject(err);
  3676. });
  3677.  
  3678. return q.promise;
  3679. }
  3680. };
  3681.  
  3682. }]);
  3683.  
  3684. // install : cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-googleplus.git
  3685. // link : https://github.com/EddyVerbruggen/cordova-plugin-googleplus
  3686.  
  3687. angular.module('ngCordova.plugins.googlePlus', [])
  3688.  
  3689. .factory('$cordovaGooglePlus', ['$q', '$window', function ($q, $window) {
  3690.  
  3691. return {
  3692. login: function (iosKey) {
  3693. var q = $q.defer();
  3694.  
  3695. if (iosKey === undefined) {
  3696. iosKey = {};
  3697. }
  3698. $window.plugins.googleplus.login({'iOSApiKey': iosKey}, function (response) {
  3699. q.resolve(response);
  3700. }, function (error) {
  3701. q.reject(error);
  3702. });
  3703.  
  3704. return q.promise;
  3705. },
  3706.  
  3707. silentLogin: function (iosKey) {
  3708. var q = $q.defer();
  3709.  
  3710. if (iosKey === undefined) {
  3711. iosKey = {};
  3712. }
  3713. $window.plugins.googleplus.trySilentLogin({'iOSApiKey': iosKey}, function (response) {
  3714. q.resolve(response);
  3715. }, function (error) {
  3716. q.reject(error);
  3717. });
  3718.  
  3719. return q.promise;
  3720. },
  3721.  
  3722. logout: function () {
  3723. var q = $q.defer();
  3724. $window.plugins.googleplus.logout(function (response) {
  3725. q.resolve(response);
  3726. });
  3727. },
  3728.  
  3729. disconnect: function () {
  3730. var q = $q.defer();
  3731. $window.plugins.googleplus.disconnect(function (response) {
  3732. q.resolve(response);
  3733. });
  3734. },
  3735.  
  3736. isAvailable: function () {
  3737. var q = $q.defer();
  3738. $window.plugins.googleplus.isAvailable(function (available) {
  3739. if (available) {
  3740. q.resolve(available);
  3741. } else {
  3742. q.reject(available);
  3743. }
  3744. });
  3745.  
  3746. return q.promise;
  3747. }
  3748. };
  3749.  
  3750. }]);
  3751.  
  3752. // install : cordova plugin add https://github.com/Telerik-Verified-Plugins/HealthKit.git
  3753. // link : https://github.com/Telerik-Verified-Plugins/HealthKit
  3754.  
  3755. angular.module('ngCordova.plugins.healthKit', [])
  3756.  
  3757. .factory('$cordovaHealthKit', ['$q', '$window', function ($q, $window) {
  3758.  
  3759. return {
  3760. isAvailable: function () {
  3761. var q = $q.defer();
  3762.  
  3763. $window.plugins.healthkit.available(function (success) {
  3764. q.resolve(success);
  3765. }, function (err) {
  3766. q.reject(err);
  3767. });
  3768.  
  3769. return q.promise;
  3770. },
  3771.  
  3772. /**
  3773. * Check whether or not the user granted your app access to a specific HealthKit type.
  3774. * Reference for possible types:
  3775. * https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HealthKit_Constants/
  3776. */
  3777. checkAuthStatus: function (type) {
  3778. var q = $q.defer();
  3779.  
  3780. type = type || 'HKQuantityTypeIdentifierHeight';
  3781.  
  3782. $window.plugins.healthkit.checkAuthStatus({
  3783. 'type': type
  3784. }, function (success) {
  3785. q.resolve(success);
  3786. }, function (err) {
  3787. q.reject(err);
  3788. });
  3789.  
  3790. return q.promise;
  3791. },
  3792.  
  3793. /**
  3794. * Request authorization to access HealthKit data. See the full HealthKit constants
  3795. * reference for possible read and write types:
  3796. * https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HealthKit_Constants/
  3797. */
  3798. requestAuthorization: function (readTypes, writeTypes) {
  3799. var q = $q.defer();
  3800.  
  3801. readTypes = readTypes || [
  3802. 'HKCharacteristicTypeIdentifierDateOfBirth', 'HKQuantityTypeIdentifierActiveEnergyBurned', 'HKQuantityTypeIdentifierHeight'
  3803. ];
  3804. writeTypes = writeTypes || [
  3805. 'HKQuantityTypeIdentifierActiveEnergyBurned', 'HKQuantityTypeIdentifierHeight', 'HKQuantityTypeIdentifierDistanceCycling'
  3806. ];
  3807.  
  3808. $window.plugins.healthkit.requestAuthorization({
  3809. 'readTypes': readTypes,
  3810. 'writeTypes': writeTypes
  3811. }, function (success) {
  3812. q.resolve(success);
  3813. }, function (err) {
  3814. q.reject(err);
  3815. });
  3816.  
  3817. return q.promise;
  3818. },
  3819.  
  3820. readDateOfBirth: function () {
  3821. var q = $q.defer();
  3822. $window.plugins.healthkit.readDateOfBirth(
  3823. function (success) {
  3824. q.resolve(success);
  3825. },
  3826. function (err) {
  3827. q.resolve(err);
  3828. }
  3829. );
  3830.  
  3831. return q.promise;
  3832. },
  3833.  
  3834. readGender: function () {
  3835. var q = $q.defer();
  3836. $window.plugins.healthkit.readGender(
  3837. function (success) {
  3838. q.resolve(success);
  3839. },
  3840. function (err) {
  3841. q.resolve(err);
  3842. }
  3843. );
  3844.  
  3845. return q.promise;
  3846. },
  3847.  
  3848. saveWeight: function (value, units, date) {
  3849. var q = $q.defer();
  3850. $window.plugins.healthkit.saveWeight({
  3851. 'unit': units || 'lb',
  3852. 'amount': value,
  3853. 'date': date || new Date()
  3854. },
  3855. function (success) {
  3856. q.resolve(success);
  3857. },
  3858. function (err) {
  3859. q.resolve(err);
  3860. }
  3861. );
  3862. return q.promise;
  3863. },
  3864.  
  3865. readWeight: function (units) {
  3866. var q = $q.defer();
  3867. $window.plugins.healthkit.readWeight({
  3868. 'unit': units || 'lb'
  3869. },
  3870. function (success) {
  3871. q.resolve(success);
  3872. },
  3873. function (err) {
  3874. q.resolve(err);
  3875. }
  3876. );
  3877.  
  3878. return q.promise;
  3879. },
  3880. saveHeight: function (value, units, date) {
  3881. var q = $q.defer();
  3882. $window.plugins.healthkit.saveHeight({
  3883. 'unit': units || 'in',
  3884. 'amount': value,
  3885. 'date': date || new Date()
  3886. },
  3887. function (success) {
  3888. q.resolve(success);
  3889. },
  3890. function (err) {
  3891. q.resolve(err);
  3892. }
  3893. );
  3894. return q.promise;
  3895. },
  3896. readHeight: function (units) {
  3897. var q = $q.defer();
  3898. $window.plugins.healthkit.readHeight({
  3899. 'unit': units || 'in'
  3900. },
  3901. function (success) {
  3902. q.resolve(success);
  3903. },
  3904. function (err) {
  3905. q.resolve(err);
  3906. }
  3907. );
  3908.  
  3909. return q.promise;
  3910. },
  3911.  
  3912. findWorkouts: function () {
  3913. var q = $q.defer();
  3914. $window.plugins.healthkit.findWorkouts({},
  3915. function (success) {
  3916. q.resolve(success);
  3917. },
  3918. function (err) {
  3919. q.resolve(err);
  3920. }
  3921. );
  3922. return q.promise;
  3923. },
  3924.  
  3925. /**
  3926. * Save a workout.
  3927. *
  3928. * Workout param should be of the format:
  3929. {
  3930. 'activityType': 'HKWorkoutActivityTypeCycling', // HKWorkoutActivityType constant (https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKWorkout_Class/#//apple_ref/c/tdef/HKWorkoutActivityType)
  3931. 'quantityType': 'HKQuantityTypeIdentifierDistanceCycling',
  3932. 'startDate': new Date(), // mandatory
  3933. 'endDate': null, // optional, use either this or duration
  3934. 'duration': 3600, // in seconds, optional, use either this or endDate
  3935. 'energy': 300, //
  3936. 'energyUnit': 'kcal', // J|cal|kcal
  3937. 'distance': 11, // optional
  3938. 'distanceUnit': 'km' // probably useful with the former param
  3939. // 'extraData': "", // Not sure how necessary this is
  3940. },
  3941. */
  3942. saveWorkout: function (workout) {
  3943. var q = $q.defer();
  3944. $window.plugins.healthkit.saveWorkout(workout,
  3945. function (success) {
  3946. q.resolve(success);
  3947. },
  3948. function (err) {
  3949. q.resolve(err);
  3950. }
  3951. );
  3952. return q.promise;
  3953. },
  3954.  
  3955. /**
  3956. * Sample any kind of health data through a given date range.
  3957. * sampleQuery of the format:
  3958. {
  3959. 'startDate': yesterday, // mandatory
  3960. 'endDate': tomorrow, // mandatory
  3961. 'sampleType': 'HKQuantityTypeIdentifierHeight',
  3962. 'unit' : 'cm'
  3963. },
  3964. */
  3965. querySampleType: function (sampleQuery) {
  3966. var q = $q.defer();
  3967. $window.plugins.healthkit.querySampleType(sampleQuery,
  3968. function (success) {
  3969. q.resolve(success);
  3970. },
  3971. function (err) {
  3972. q.resolve(err);
  3973. }
  3974. );
  3975. return q.promise;
  3976. }
  3977. };
  3978. }]);
  3979.  
  3980. // install : cordova plugin add https://github.com/floatinghotpot/cordova-httpd.git
  3981. // link : https://github.com/floatinghotpot/cordova-httpd
  3982.  
  3983. angular.module('ngCordova.plugins.httpd', [])
  3984.  
  3985. .factory('$cordovaHttpd', ['$q', function ($q) {
  3986.  
  3987. return {
  3988. startServer: function (options) {
  3989. var d = $q.defer();
  3990.  
  3991. cordova.plugins.CorHttpd.startServer(options, function () {
  3992. d.resolve();
  3993. }, function () {
  3994. d.reject();
  3995. });
  3996.  
  3997. return d.promise;
  3998. },
  3999.  
  4000. stopServer: function () {
  4001. var d = $q.defer();
  4002.  
  4003. cordova.plugins.CorHttpd.stopServer(function () {
  4004. d.resolve();
  4005. }, function () {
  4006. d.reject();
  4007. });
  4008.  
  4009. return d.promise;
  4010. },
  4011.  
  4012. getURL: function () {
  4013. var d = $q.defer();
  4014.  
  4015. cordova.plugins.CorHttpd.getURL(function (url) {
  4016. d.resolve(url);
  4017. }, function () {
  4018. d.reject();
  4019. });
  4020.  
  4021. return d.promise;
  4022. },
  4023.  
  4024. getLocalPath: function () {
  4025. var d = $q.defer();
  4026.  
  4027. cordova.plugins.CorHttpd.getLocalPath(function (path) {
  4028. d.resolve(path);
  4029. }, function () {
  4030. d.reject();
  4031. });
  4032.  
  4033. return d.promise;
  4034. }
  4035.  
  4036. };
  4037. }]);
  4038.  
  4039. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-iad.git
  4040. // link : https://github.com/floatinghotpot/cordova-plugin-iad
  4041.  
  4042. angular.module('ngCordova.plugins.iAd', [])
  4043. .factory('$cordovaiAd', ['$q', '$window', function ($q, $window) {
  4044.  
  4045. return {
  4046. setOptions: function (options) {
  4047. var d = $q.defer();
  4048.  
  4049. $window.iAd.setOptions(options, function () {
  4050. d.resolve();
  4051. }, function () {
  4052. d.reject();
  4053. });
  4054.  
  4055. return d.promise;
  4056. },
  4057.  
  4058. createBanner: function (options) {
  4059. var d = $q.defer();
  4060.  
  4061. $window.iAd.createBanner(options, function () {
  4062. d.resolve();
  4063. }, function () {
  4064. d.reject();
  4065. });
  4066.  
  4067. return d.promise;
  4068. },
  4069.  
  4070. removeBanner: function () {
  4071. var d = $q.defer();
  4072.  
  4073. $window.iAd.removeBanner(function () {
  4074. d.resolve();
  4075. }, function () {
  4076. d.reject();
  4077. });
  4078.  
  4079. return d.promise;
  4080. },
  4081.  
  4082. showBanner: function (position) {
  4083. var d = $q.defer();
  4084.  
  4085. $window.iAd.showBanner(position, function () {
  4086. d.resolve();
  4087. }, function () {
  4088. d.reject();
  4089. });
  4090.  
  4091. return d.promise;
  4092. },
  4093.  
  4094. showBannerAtXY: function (x, y) {
  4095. var d = $q.defer();
  4096.  
  4097. $window.iAd.showBannerAtXY(x, y, function () {
  4098. d.resolve();
  4099. }, function () {
  4100. d.reject();
  4101. });
  4102.  
  4103. return d.promise;
  4104. },
  4105.  
  4106. hideBanner: function () {
  4107. var d = $q.defer();
  4108.  
  4109. $window.iAd.hideBanner(function () {
  4110. d.resolve();
  4111. }, function () {
  4112. d.reject();
  4113. });
  4114.  
  4115. return d.promise;
  4116. },
  4117.  
  4118. prepareInterstitial: function (options) {
  4119. var d = $q.defer();
  4120.  
  4121. $window.iAd.prepareInterstitial(options, function () {
  4122. d.resolve();
  4123. }, function () {
  4124. d.reject();
  4125. });
  4126.  
  4127. return d.promise;
  4128. },
  4129.  
  4130. showInterstitial: function () {
  4131. var d = $q.defer();
  4132.  
  4133. $window.iAd.showInterstitial(function () {
  4134. d.resolve();
  4135. }, function () {
  4136. d.reject();
  4137. });
  4138.  
  4139. return d.promise;
  4140. }
  4141. };
  4142. }]);
  4143.  
  4144. // install : cordova plugin add https://github.com/wymsee/cordova-imagePicker.git
  4145. // link : https://github.com/wymsee/cordova-imagePicker
  4146.  
  4147. angular.module('ngCordova.plugins.imagePicker', [])
  4148.  
  4149. .factory('$cordovaImagePicker', ['$q', '$window', function ($q, $window) {
  4150.  
  4151. return {
  4152. getPictures: function (options) {
  4153. var q = $q.defer();
  4154.  
  4155. $window.imagePicker.getPictures(function (results) {
  4156. q.resolve(results);
  4157. }, function (error) {
  4158. q.reject(error);
  4159. }, options);
  4160.  
  4161. return q.promise;
  4162. }
  4163. };
  4164. }]);
  4165.  
  4166. // install : cordova plugin add cordova-plugin-inappbrowser
  4167. // link : https://github.com/apache/cordova-plugin-inappbrowser
  4168.  
  4169. angular.module('ngCordova.plugins.inAppBrowser', [])
  4170.  
  4171. .provider('$cordovaInAppBrowser', [function () {
  4172.  
  4173. var ref;
  4174. var defaultOptions = this.defaultOptions = {};
  4175.  
  4176. this.setDefaultOptions = function (config) {
  4177. defaultOptions = angular.extend(defaultOptions, config);
  4178. };
  4179.  
  4180. this.$get = ['$rootScope', '$q', '$window', '$timeout', function ($rootScope, $q, $window, $timeout) {
  4181. return {
  4182. open: function (url, target, requestOptions) {
  4183. var q = $q.defer();
  4184.  
  4185. if (requestOptions && !angular.isObject(requestOptions)) {
  4186. q.reject("options must be an object");
  4187. return q.promise;
  4188. }
  4189.  
  4190. var options = angular.extend({}, defaultOptions, requestOptions);
  4191.  
  4192. var opt = [];
  4193. angular.forEach(options, function (value, key) {
  4194. opt.push(key + '=' + value);
  4195. });
  4196. var optionsString = opt.join();
  4197.  
  4198. ref = $window.open(url, target, optionsString);
  4199.  
  4200. ref.addEventListener('loadstart', function (event) {
  4201. $timeout(function () {
  4202. $rootScope.$broadcast('$cordovaInAppBrowser:loadstart', event);
  4203. });
  4204. }, false);
  4205.  
  4206. ref.addEventListener('loadstop', function (event) {
  4207. q.resolve(event);
  4208. $timeout(function () {
  4209. $rootScope.$broadcast('$cordovaInAppBrowser:loadstop', event);
  4210. });
  4211. }, false);
  4212.  
  4213. ref.addEventListener('loaderror', function (event) {
  4214. q.reject(event);
  4215. $timeout(function () {
  4216. $rootScope.$broadcast('$cordovaInAppBrowser:loaderror', event);
  4217. });
  4218. }, false);
  4219.  
  4220. ref.addEventListener('exit', function (event) {
  4221. $timeout(function () {
  4222. $rootScope.$broadcast('$cordovaInAppBrowser:exit', event);
  4223. });
  4224. }, false);
  4225.  
  4226. return q.promise;
  4227. },
  4228.  
  4229. close: function () {
  4230. ref.close();
  4231. ref = null;
  4232. },
  4233.  
  4234. show: function () {
  4235. ref.show();
  4236. },
  4237.  
  4238. executeScript: function (details) {
  4239. var q = $q.defer();
  4240.  
  4241. ref.executeScript(details, function (result) {
  4242. q.resolve(result);
  4243. });
  4244.  
  4245. return q.promise;
  4246. },
  4247.  
  4248. insertCSS: function (details) {
  4249. var q = $q.defer();
  4250.  
  4251. ref.insertCSS(details, function (result) {
  4252. q.resolve(result);
  4253. });
  4254.  
  4255. return q.promise;
  4256. }
  4257. };
  4258. }];
  4259. }]);
  4260.  
  4261. // install : cordova plugin add https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin.git
  4262. // link : https://github.com/EddyVerbruggen/Insomnia-PhoneGap-Plugin
  4263. angular.module('ngCordova.plugins.insomnia', [])
  4264.  
  4265. .factory('$cordovaInsomnia', ['$window', function ($window) {
  4266.  
  4267. return {
  4268. keepAwake: function () {
  4269. return $window.plugins.insomnia.keepAwake();
  4270. },
  4271. allowSleepAgain: function () {
  4272. return $window.plugins.insomnia.allowSleepAgain();
  4273. }
  4274. };
  4275.  
  4276. }]);
  4277.  
  4278. // install : cordova plugins add https://github.com/vstirbu/InstagramPlugin.git
  4279. // link : https://github.com/vstirbu/InstagramPlugin
  4280.  
  4281. angular.module('ngCordova.plugins.instagram', [])
  4282.  
  4283. .factory('$cordovaInstagram', ['$q', function ($q) {
  4284.  
  4285. return {
  4286. share: function (options) {
  4287. var q = $q.defer();
  4288.  
  4289. if (!window.Instagram) {
  4290. console.error('Tried to call Instagram.share but the Instagram plugin isn\'t installed!');
  4291. q.resolve(null);
  4292. return q.promise;
  4293. }
  4294.  
  4295. Instagram.share(options.image, options.caption, function (err) {
  4296. if(err) {
  4297. q.reject(err);
  4298. } else {
  4299. q.resolve(true);
  4300. }
  4301. });
  4302. return q.promise;
  4303. },
  4304. isInstalled: function () {
  4305. var q = $q.defer();
  4306.  
  4307. if (!window.Instagram) {
  4308. console.error('Tried to call Instagram.isInstalled but the Instagram plugin isn\'t installed!');
  4309. q.resolve(null);
  4310. return q.promise;
  4311. }
  4312.  
  4313. Instagram.isInstalled(function (err, installed) {
  4314. if (err) {
  4315. q.reject(err);
  4316. } else {
  4317. q.resolve(installed || true);
  4318. }
  4319. });
  4320. return q.promise;
  4321. }
  4322. };
  4323. }]);
  4324.  
  4325. // install : cordova plugin add https://github.com/driftyco/ionic-plugins-keyboard.git
  4326. // link : https://github.com/driftyco/ionic-plugins-keyboard
  4327.  
  4328. angular.module('ngCordova.plugins.keyboard', [])
  4329.  
  4330. .factory('$cordovaKeyboard', ['$rootScope', function ($rootScope) {
  4331.  
  4332. var keyboardShowEvent = function () {
  4333. $rootScope.$evalAsync(function () {
  4334. $rootScope.$broadcast('$cordovaKeyboard:show');
  4335. });
  4336. };
  4337.  
  4338. var keyboardHideEvent = function () {
  4339. $rootScope.$evalAsync(function () {
  4340. $rootScope.$broadcast('$cordovaKeyboard:hide');
  4341. });
  4342. };
  4343.  
  4344. document.addEventListener("deviceready", function () {
  4345. if (cordova.plugins.Keyboard) {
  4346. window.addEventListener("native.keyboardshow", keyboardShowEvent, false);
  4347. window.addEventListener("native.keyboardhide", keyboardHideEvent, false);
  4348. }
  4349. });
  4350.  
  4351. return {
  4352. hideAccessoryBar: function (bool) {
  4353. return cordova.plugins.Keyboard.hideKeyboardAccessoryBar(bool);
  4354. },
  4355.  
  4356. close: function () {
  4357. return cordova.plugins.Keyboard.close();
  4358. },
  4359.  
  4360. show: function () {
  4361. return cordova.plugins.Keyboard.show();
  4362. },
  4363.  
  4364. disableScroll: function (bool) {
  4365. return cordova.plugins.Keyboard.disableScroll(bool);
  4366. },
  4367.  
  4368. isVisible: function () {
  4369. return cordova.plugins.Keyboard.isVisible;
  4370. },
  4371.  
  4372. clearShowWatch: function () {
  4373. document.removeEventListener("native.keyboardshow", keyboardShowEvent);
  4374. $rootScope.$$listeners["$cordovaKeyboard:show"] = [];
  4375. },
  4376.  
  4377. clearHideWatch: function () {
  4378. document.removeEventListener("native.keyboardhide", keyboardHideEvent);
  4379. $rootScope.$$listeners["$cordovaKeyboard:hide"] = [];
  4380. }
  4381. };
  4382. }]);
  4383.  
  4384. // install : cordova plugin add https://github.com/shazron/KeychainPlugin.git
  4385. // link : https://github.com/shazron/KeychainPlugin
  4386.  
  4387. angular.module('ngCordova.plugins.keychain', [])
  4388.  
  4389. .factory('$cordovaKeychain', ['$q', function ($q) {
  4390.  
  4391. return {
  4392. getForKey: function (key, serviceName) {
  4393. var defer = $q.defer(),
  4394. kc = new Keychain();
  4395.  
  4396. kc.getForKey(defer.resolve, defer.reject, key, serviceName);
  4397.  
  4398. return defer.promise;
  4399. },
  4400.  
  4401. setForKey: function (key, serviceName, value) {
  4402. var defer = $q.defer(),
  4403. kc = new Keychain();
  4404.  
  4405. kc.setForKey(defer.resolve, defer.reject, key, serviceName, value);
  4406.  
  4407. return defer.promise;
  4408. },
  4409.  
  4410. removeForKey: function (key, serviceName) {
  4411. var defer = $q.defer(),
  4412. kc = new Keychain();
  4413.  
  4414. kc.removeForKey(defer.resolve, defer.reject, key, serviceName);
  4415.  
  4416. return defer.promise;
  4417. }
  4418. };
  4419. }]);
  4420.  
  4421. // install : cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator
  4422. // link : https://github.com/dpa99c/phonegap-launch-navigator
  4423.  
  4424. angular.module('ngCordova.plugins.launchNavigator', [])
  4425.  
  4426. .factory('$cordovaLaunchNavigator', ['$q', function ($q) {
  4427.  
  4428. return {
  4429. navigate: function (destination, start, successFn, errorFn, options) {
  4430. var q = $q.defer();
  4431. launchnavigator.navigate(
  4432. destination,
  4433. start,
  4434. function (){
  4435. q.resolve();
  4436. },
  4437. function (error){
  4438. q.reject(error);
  4439. },
  4440. options);
  4441. return q.promise;
  4442. }
  4443. };
  4444.  
  4445. }]);
  4446.  
  4447. // install : cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git
  4448. // link : https://github.com/katzer/cordova-plugin-local-notifications
  4449.  
  4450. angular.module('ngCordova.plugins.localNotification', [])
  4451.  
  4452. .factory('$cordovaLocalNotification', ['$q', '$window', '$rootScope', '$timeout', function ($q, $window, $rootScope, $timeout) {
  4453. document.addEventListener('deviceready', function () {
  4454. if ($window.cordova &&
  4455. $window.cordova.plugins &&
  4456. $window.cordova.plugins.notification &&
  4457. $window.cordova.plugins.notification.local) {
  4458. // ----- "Scheduling" events
  4459.  
  4460. // A local notification was scheduled
  4461. $window.cordova.plugins.notification.local.on('schedule', function (notification, state) {
  4462. $timeout(function () {
  4463. $rootScope.$broadcast('$cordovaLocalNotification:schedule', notification, state);
  4464. });
  4465. });
  4466.  
  4467. // A local notification was triggered
  4468. $window.cordova.plugins.notification.local.on('trigger', function (notification, state) {
  4469. $timeout(function () {
  4470. $rootScope.$broadcast('$cordovaLocalNotification:trigger', notification, state);
  4471. });
  4472. });
  4473.  
  4474. // ----- "Update" events
  4475.  
  4476. // A local notification was updated
  4477. $window.cordova.plugins.notification.local.on('update', function (notification, state) {
  4478. $timeout(function () {
  4479. $rootScope.$broadcast('$cordovaLocalNotification:update', notification, state);
  4480. });
  4481. });
  4482.  
  4483. // ----- "Clear" events
  4484.  
  4485. // A local notification was cleared from the notification center
  4486. $window.cordova.plugins.notification.local.on('clear', function (notification, state) {
  4487. $timeout(function () {
  4488. $rootScope.$broadcast('$cordovaLocalNotification:clear', notification, state);
  4489. });
  4490. });
  4491.  
  4492. // All local notifications were cleared from the notification center
  4493. $window.cordova.plugins.notification.local.on('clearall', function (state) {
  4494. $timeout(function () {
  4495. $rootScope.$broadcast('$cordovaLocalNotification:clearall', state);
  4496. });
  4497. });
  4498.  
  4499. // ----- "Cancel" events
  4500.  
  4501. // A local notification was cancelled
  4502. $window.cordova.plugins.notification.local.on('cancel', function (notification, state) {
  4503. $timeout(function () {
  4504. $rootScope.$broadcast('$cordovaLocalNotification:cancel', notification, state);
  4505. });
  4506. });
  4507.  
  4508. // All local notifications were cancelled
  4509. $window.cordova.plugins.notification.local.on('cancelall', function (state) {
  4510. $timeout(function () {
  4511. $rootScope.$broadcast('$cordovaLocalNotification:cancelall', state);
  4512. });
  4513. });
  4514.  
  4515. // ----- Other events
  4516.  
  4517. // A local notification was clicked
  4518. $window.cordova.plugins.notification.local.on('click', function (notification, state) {
  4519. $timeout(function () {
  4520. $rootScope.$broadcast('$cordovaLocalNotification:click', notification, state);
  4521. });
  4522. });
  4523. }
  4524. }, false);
  4525. return {
  4526. schedule: function (options, scope) {
  4527. var q = $q.defer();
  4528. scope = scope || null;
  4529.  
  4530. $window.cordova.plugins.notification.local.schedule(options, function (result) {
  4531. q.resolve(result);
  4532. }, scope);
  4533.  
  4534. return q.promise;
  4535. },
  4536.  
  4537. add: function (options, scope) {
  4538. console.warn('Deprecated: use "schedule" instead.');
  4539.  
  4540. var q = $q.defer();
  4541. scope = scope || null;
  4542.  
  4543. $window.cordova.plugins.notification.local.schedule(options, function (result) {
  4544. q.resolve(result);
  4545. }, scope);
  4546.  
  4547. return q.promise;
  4548. },
  4549.  
  4550. update: function (options, scope) {
  4551. var q = $q.defer();
  4552. scope = scope || null;
  4553.  
  4554. $window.cordova.plugins.notification.local.update(options, function (result) {
  4555. q.resolve(result);
  4556. }, scope);
  4557.  
  4558. return q.promise;
  4559. },
  4560.  
  4561. clear: function (ids, scope) {
  4562. var q = $q.defer();
  4563. scope = scope || null;
  4564.  
  4565. $window.cordova.plugins.notification.local.clear(ids, function (result) {
  4566. q.resolve(result);
  4567. }, scope);
  4568.  
  4569. return q.promise;
  4570. },
  4571.  
  4572. clearAll: function (scope) {
  4573. var q = $q.defer();
  4574. scope = scope || null;
  4575.  
  4576. $window.cordova.plugins.notification.local.clearAll(function (result) {
  4577. q.resolve(result);
  4578. }, scope);
  4579.  
  4580. return q.promise;
  4581. },
  4582.  
  4583. cancel: function (ids, scope) {
  4584. var q = $q.defer();
  4585. scope = scope || null;
  4586.  
  4587. $window.cordova.plugins.notification.local.cancel(ids, function (result) {
  4588. q.resolve(result);
  4589. }, scope);
  4590.  
  4591. return q.promise;
  4592. },
  4593.  
  4594. cancelAll: function (scope) {
  4595. var q = $q.defer();
  4596. scope = scope || null;
  4597.  
  4598. $window.cordova.plugins.notification.local.cancelAll(function (result) {
  4599. q.resolve(result);
  4600. }, scope);
  4601.  
  4602. return q.promise;
  4603. },
  4604.  
  4605. isPresent: function (id, scope) {
  4606. var q = $q.defer();
  4607. scope = scope || null;
  4608.  
  4609. $window.cordova.plugins.notification.local.isPresent(id, function (result) {
  4610. q.resolve(result);
  4611. }, scope);
  4612.  
  4613. return q.promise;
  4614. },
  4615.  
  4616. isScheduled: function (id, scope) {
  4617. var q = $q.defer();
  4618. scope = scope || null;
  4619.  
  4620. $window.cordova.plugins.notification.local.isScheduled(id, function (result) {
  4621. q.resolve(result);
  4622. }, scope);
  4623.  
  4624. return q.promise;
  4625. },
  4626.  
  4627. isTriggered: function (id, scope) {
  4628. var q = $q.defer();
  4629. scope = scope || null;
  4630.  
  4631. $window.cordova.plugins.notification.local.isTriggered(id, function (result) {
  4632. q.resolve(result);
  4633. }, scope);
  4634.  
  4635. return q.promise;
  4636. },
  4637.  
  4638. hasPermission: function (scope) {
  4639. var q = $q.defer();
  4640. scope = scope || null;
  4641.  
  4642. $window.cordova.plugins.notification.local.hasPermission(function (result) {
  4643. if (result) {
  4644. q.resolve(result);
  4645. } else {
  4646. q.reject(result);
  4647. }
  4648. }, scope);
  4649.  
  4650. return q.promise;
  4651. },
  4652.  
  4653. registerPermission: function (scope) {
  4654. var q = $q.defer();
  4655. scope = scope || null;
  4656.  
  4657. $window.cordova.plugins.notification.local.registerPermission(function (result) {
  4658. if (result) {
  4659. q.resolve(result);
  4660. } else {
  4661. q.reject(result);
  4662. }
  4663. }, scope);
  4664.  
  4665. return q.promise;
  4666. },
  4667.  
  4668. promptForPermission: function (scope) {
  4669. console.warn('Deprecated: use "registerPermission" instead.');
  4670.  
  4671. var q = $q.defer();
  4672. scope = scope || null;
  4673.  
  4674. $window.cordova.plugins.notification.local.registerPermission(function (result) {
  4675. if (result) {
  4676. q.resolve(result);
  4677. } else {
  4678. q.reject(result);
  4679. }
  4680. }, scope);
  4681.  
  4682. return q.promise;
  4683. },
  4684.  
  4685. getAllIds: function (scope) {
  4686. var q = $q.defer();
  4687. scope = scope || null;
  4688.  
  4689. $window.cordova.plugins.notification.local.getAllIds(function (result) {
  4690. q.resolve(result);
  4691. }, scope);
  4692.  
  4693. return q.promise;
  4694. },
  4695.  
  4696. getIds: function (scope) {
  4697. var q = $q.defer();
  4698. scope = scope || null;
  4699.  
  4700. $window.cordova.plugins.notification.local.getIds(function (result) {
  4701. q.resolve(result);
  4702. }, scope);
  4703.  
  4704. return q.promise;
  4705. },
  4706.  
  4707. getScheduledIds: function (scope) {
  4708. var q = $q.defer();
  4709. scope = scope || null;
  4710.  
  4711. $window.cordova.plugins.notification.local.getScheduledIds(function (result) {
  4712. q.resolve(result);
  4713. }, scope);
  4714.  
  4715. return q.promise;
  4716. },
  4717.  
  4718. getTriggeredIds: function (scope) {
  4719. var q = $q.defer();
  4720. scope = scope || null;
  4721.  
  4722. $window.cordova.plugins.notification.local.getTriggeredIds(function (result) {
  4723. q.resolve(result);
  4724. }, scope);
  4725.  
  4726. return q.promise;
  4727. },
  4728.  
  4729. get: function (ids, scope) {
  4730. var q = $q.defer();
  4731. scope = scope || null;
  4732.  
  4733. $window.cordova.plugins.notification.local.get(ids, function (result) {
  4734. q.resolve(result);
  4735. }, scope);
  4736.  
  4737. return q.promise;
  4738. },
  4739.  
  4740. getAll: function (scope) {
  4741. var q = $q.defer();
  4742. scope = scope || null;
  4743.  
  4744. $window.cordova.plugins.notification.local.getAll(function (result) {
  4745. q.resolve(result);
  4746. }, scope);
  4747.  
  4748. return q.promise;
  4749. },
  4750.  
  4751. getScheduled: function (ids, scope) {
  4752. var q = $q.defer();
  4753. scope = scope || null;
  4754.  
  4755. $window.cordova.plugins.notification.local.getScheduled(ids, function (result) {
  4756. q.resolve(result);
  4757. }, scope);
  4758.  
  4759. return q.promise;
  4760. },
  4761.  
  4762. getAllScheduled: function (scope) {
  4763. var q = $q.defer();
  4764. scope = scope || null;
  4765.  
  4766. $window.cordova.plugins.notification.local.getAllScheduled(function (result) {
  4767. q.resolve(result);
  4768. }, scope);
  4769.  
  4770. return q.promise;
  4771. },
  4772.  
  4773. getTriggered: function (ids, scope) {
  4774. var q = $q.defer();
  4775. scope = scope || null;
  4776.  
  4777. $window.cordova.plugins.notification.local.getTriggered(ids, function (result) {
  4778. q.resolve(result);
  4779. }, scope);
  4780.  
  4781. return q.promise;
  4782. },
  4783.  
  4784. getAllTriggered: function (scope) {
  4785. var q = $q.defer();
  4786. scope = scope || null;
  4787.  
  4788. $window.cordova.plugins.notification.local.getAllTriggered(function (result) {
  4789. q.resolve(result);
  4790. }, scope);
  4791.  
  4792. return q.promise;
  4793. },
  4794.  
  4795. getDefaults: function () {
  4796. return $window.cordova.plugins.notification.local.getDefaults();
  4797. },
  4798.  
  4799. setDefaults: function (Object) {
  4800. $window.cordova.plugins.notification.local.setDefaults(Object);
  4801. }
  4802. };
  4803. }]);
  4804.  
  4805. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-mmedia.git
  4806. // link : https://github.com/floatinghotpot/cordova-plugin-mmedia
  4807.  
  4808. angular.module('ngCordova.plugins.mMediaAds', [])
  4809.  
  4810. .factory('$cordovaMMediaAds', ['$q', '$window', function ($q, $window) {
  4811.  
  4812. return {
  4813. setOptions: function (options) {
  4814. var d = $q.defer();
  4815.  
  4816. $window.mMedia.setOptions(options, function () {
  4817. d.resolve();
  4818. }, function () {
  4819. d.reject();
  4820. });
  4821.  
  4822. return d.promise;
  4823. },
  4824.  
  4825. createBanner: function (options) {
  4826. var d = $q.defer();
  4827.  
  4828. $window.mMedia.createBanner(options, function () {
  4829. d.resolve();
  4830. }, function () {
  4831. d.reject();
  4832. });
  4833.  
  4834. return d.promise;
  4835. },
  4836.  
  4837. removeBanner: function () {
  4838. var d = $q.defer();
  4839.  
  4840. $window.mMedia.removeBanner(function () {
  4841. d.resolve();
  4842. }, function () {
  4843. d.reject();
  4844. });
  4845.  
  4846. return d.promise;
  4847. },
  4848.  
  4849. showBanner: function (position) {
  4850. var d = $q.defer();
  4851.  
  4852. $window.mMedia.showBanner(position, function () {
  4853. d.resolve();
  4854. }, function () {
  4855. d.reject();
  4856. });
  4857.  
  4858. return d.promise;
  4859. },
  4860.  
  4861. showBannerAtXY: function (x, y) {
  4862. var d = $q.defer();
  4863.  
  4864. $window.mMedia.showBannerAtXY(x, y, function () {
  4865. d.resolve();
  4866. }, function () {
  4867. d.reject();
  4868. });
  4869.  
  4870. return d.promise;
  4871. },
  4872.  
  4873. hideBanner: function () {
  4874. var d = $q.defer();
  4875.  
  4876. $window.mMedia.hideBanner(function () {
  4877. d.resolve();
  4878. }, function () {
  4879. d.reject();
  4880. });
  4881.  
  4882. return d.promise;
  4883. },
  4884.  
  4885. prepareInterstitial: function (options) {
  4886. var d = $q.defer();
  4887.  
  4888. $window.mMedia.prepareInterstitial(options, function () {
  4889. d.resolve();
  4890. }, function () {
  4891. d.reject();
  4892. });
  4893.  
  4894. return d.promise;
  4895. },
  4896.  
  4897. showInterstitial: function () {
  4898. var d = $q.defer();
  4899.  
  4900. $window.mMedia.showInterstitial(function () {
  4901. d.resolve();
  4902. }, function () {
  4903. d.reject();
  4904. });
  4905.  
  4906. return d.promise;
  4907. }
  4908. };
  4909. }]);
  4910.  
  4911. // install : cordova plugin add cordova-plugin-media
  4912. // link : https://github.com/apache/cordova-plugin-media
  4913.  
  4914. angular.module('ngCordova.plugins.media', [])
  4915.  
  4916. .service('NewMedia', ['$q', '$interval', function ($q, $interval) {
  4917. var q, q2, q3, mediaStatus = null, mediaPosition = -1, mediaTimer, mediaDuration = -1;
  4918.  
  4919. function setTimer(media) {
  4920. if (angular.isDefined(mediaTimer)) return;
  4921.  
  4922. mediaTimer = $interval(function () {
  4923. if (mediaDuration < 0) {
  4924. mediaDuration = media.getDuration();
  4925. if (q && mediaDuration > 0) q.notify({duration: mediaDuration});
  4926. }
  4927.  
  4928. media.getCurrentPosition(
  4929. // success callback
  4930. function (position) {
  4931. if (position > -1) {
  4932. mediaPosition = position;
  4933. }
  4934. },
  4935. // error callback
  4936. function (e) {
  4937. console.log("Error getting pos=" + e);
  4938. });
  4939.  
  4940. if (q) q.notify({position: mediaPosition});
  4941.  
  4942. }, 1000);
  4943. }
  4944.  
  4945. function clearTimer() {
  4946. if (angular.isDefined(mediaTimer)) {
  4947. $interval.cancel(mediaTimer);
  4948. mediaTimer = undefined;
  4949. }
  4950. }
  4951.  
  4952. function resetValues() {
  4953. mediaPosition = -1;
  4954. mediaDuration = -1;
  4955. }
  4956.  
  4957. function NewMedia(src) {
  4958. this.media = new Media(src,
  4959. function (success) {
  4960. clearTimer();
  4961. resetValues();
  4962. q.resolve(success);
  4963. }, function (error) {
  4964. clearTimer();
  4965. resetValues();
  4966. q.reject(error);
  4967. }, function (status) {
  4968. mediaStatus = status;
  4969. q.notify({status: mediaStatus});
  4970. });
  4971. }
  4972.  
  4973. // iOS quirks :
  4974. // - myMedia.play({ numberOfLoops: 2 }) -> looping
  4975. // - myMedia.play({ playAudioWhenScreenIsLocked : false })
  4976. NewMedia.prototype.play = function (options) {
  4977. q = $q.defer();
  4978.  
  4979. if (typeof options !== "object") {
  4980. options = {};
  4981. }
  4982.  
  4983. this.media.play(options);
  4984.  
  4985. setTimer(this.media);
  4986.  
  4987. return q.promise;
  4988. };
  4989.  
  4990. NewMedia.prototype.pause = function () {
  4991. clearTimer();
  4992. this.media.pause();
  4993. };
  4994.  
  4995. NewMedia.prototype.stop = function () {
  4996. this.media.stop();
  4997. };
  4998.  
  4999. NewMedia.prototype.release = function () {
  5000. this.media.release();
  5001. this.media = undefined;
  5002. };
  5003.  
  5004. NewMedia.prototype.seekTo = function (timing) {
  5005. this.media.seekTo(timing);
  5006. };
  5007.  
  5008. NewMedia.prototype.setVolume = function (volume) {
  5009. this.media.setVolume(volume);
  5010. };
  5011.  
  5012. NewMedia.prototype.startRecord = function () {
  5013. this.media.startRecord();
  5014. };
  5015.  
  5016. NewMedia.prototype.stopRecord = function () {
  5017. this.media.stopRecord();
  5018. };
  5019.  
  5020. NewMedia.prototype.currentTime = function () {
  5021. q2 = $q.defer();
  5022. this.media.getCurrentPosition(function (position){
  5023. q2.resolve(position);
  5024. });
  5025. return q2.promise;
  5026. };
  5027.  
  5028. NewMedia.prototype.getDuration = function () {
  5029. q3 = $q.defer();
  5030. this.media.getDuration(function (duration){
  5031. q3.resolve(duration);
  5032. });
  5033. return q3.promise;
  5034. }
  5035.  
  5036. return NewMedia;
  5037.  
  5038. }])
  5039. .factory('$cordovaMedia2', ['NewMedia', function (NewMedia) {
  5040. return {
  5041. newMedia: function (src) {
  5042. return new NewMedia(src);
  5043. }
  5044. };
  5045. }]);
  5046.  
  5047. // install : cordova plugin add https://github.com/floatinghotpot/cordova-mobfox-pro.git
  5048. // link : https://github.com/floatinghotpot/cordova-mobfox-pro
  5049.  
  5050. angular.module('ngCordova.plugins.mobfoxAds', [])
  5051.  
  5052. .factory('$cordovaMobFoxAds', ['$q', '$window', function ($q, $window) {
  5053.  
  5054. return {
  5055. setOptions: function (options) {
  5056. var d = $q.defer();
  5057.  
  5058. $window.MobFox.setOptions(options, function () {
  5059. d.resolve();
  5060. }, function () {
  5061. d.reject();
  5062. });
  5063.  
  5064. return d.promise;
  5065. },
  5066.  
  5067. createBanner: function (options) {
  5068. var d = $q.defer();
  5069.  
  5070. $window.MobFox.createBanner(options, function () {
  5071. d.resolve();
  5072. }, function () {
  5073. d.reject();
  5074. });
  5075.  
  5076. return d.promise;
  5077. },
  5078.  
  5079. removeBanner: function () {
  5080. var d = $q.defer();
  5081.  
  5082. $window.MobFox.removeBanner(function () {
  5083. d.resolve();
  5084. }, function () {
  5085. d.reject();
  5086. });
  5087.  
  5088. return d.promise;
  5089. },
  5090.  
  5091. showBanner: function (position) {
  5092. var d = $q.defer();
  5093.  
  5094. $window.MobFox.showBanner(position, function () {
  5095. d.resolve();
  5096. }, function () {
  5097. d.reject();
  5098. });
  5099.  
  5100. return d.promise;
  5101. },
  5102.  
  5103. showBannerAtXY: function (x, y) {
  5104. var d = $q.defer();
  5105.  
  5106. $window.MobFox.showBannerAtXY(x, y, function () {
  5107. d.resolve();
  5108. }, function () {
  5109. d.reject();
  5110. });
  5111.  
  5112. return d.promise;
  5113. },
  5114.  
  5115. hideBanner: function () {
  5116. var d = $q.defer();
  5117.  
  5118. $window.MobFox.hideBanner(function () {
  5119. d.resolve();
  5120. }, function () {
  5121. d.reject();
  5122. });
  5123.  
  5124. return d.promise;
  5125. },
  5126.  
  5127. prepareInterstitial: function (options) {
  5128. var d = $q.defer();
  5129.  
  5130. $window.MobFox.prepareInterstitial(options, function () {
  5131. d.resolve();
  5132. }, function () {
  5133. d.reject();
  5134. });
  5135.  
  5136. return d.promise;
  5137. },
  5138.  
  5139. showInterstitial: function () {
  5140. var d = $q.defer();
  5141.  
  5142. $window.MobFox.showInterstitial(function () {
  5143. d.resolve();
  5144. }, function () {
  5145. d.reject();
  5146. });
  5147.  
  5148. return d.promise;
  5149. }
  5150. };
  5151. }]);
  5152.  
  5153. angular.module('ngCordova.plugins', [
  5154. 'ngCordova.plugins.actionSheet',
  5155. 'ngCordova.plugins.adMob',
  5156. 'ngCordova.plugins.appAvailability',
  5157. 'ngCordova.plugins.appRate',
  5158. 'ngCordova.plugins.appVersion',
  5159. 'ngCordova.plugins.backgroundGeolocation',
  5160. 'ngCordova.plugins.badge',
  5161. 'ngCordova.plugins.barcodeScanner',
  5162. 'ngCordova.plugins.batteryStatus',
  5163. 'ngCordova.plugins.ble',
  5164. 'ngCordova.plugins.bluetoothSerial',
  5165. 'ngCordova.plugins.brightness',
  5166. 'ngCordova.plugins.calendar',
  5167. 'ngCordova.plugins.camera',
  5168. 'ngCordova.plugins.capture',
  5169. 'ngCordova.plugins.clipboard',
  5170. 'ngCordova.plugins.contacts',
  5171. 'ngCordova.plugins.datePicker',
  5172. 'ngCordova.plugins.device',
  5173. 'ngCordova.plugins.deviceMotion',
  5174. 'ngCordova.plugins.deviceOrientation',
  5175. 'ngCordova.plugins.dialogs',
  5176. 'ngCordova.plugins.emailComposer',
  5177. 'ngCordova.plugins.facebook',
  5178. 'ngCordova.plugins.facebookAds',
  5179. 'ngCordova.plugins.file',
  5180. 'ngCordova.plugins.fileTransfer',
  5181. 'ngCordova.plugins.fileOpener2',
  5182. 'ngCordova.plugins.flashlight',
  5183. 'ngCordova.plugins.flurryAds',
  5184. 'ngCordova.plugins.ga',
  5185. 'ngCordova.plugins.geolocation',
  5186. 'ngCordova.plugins.globalization',
  5187. 'ngCordova.plugins.googleAds',
  5188. 'ngCordova.plugins.googleAnalytics',
  5189. 'ngCordova.plugins.googleMap',
  5190. 'ngCordova.plugins.googlePlayGame',
  5191. 'ngCordova.plugins.googlePlus',
  5192. 'ngCordova.plugins.healthKit',
  5193. 'ngCordova.plugins.httpd',
  5194. 'ngCordova.plugins.iAd',
  5195. 'ngCordova.plugins.imagePicker',
  5196. 'ngCordova.plugins.inAppBrowser',
  5197. 'ngCordova.plugins.instagram',
  5198. 'ngCordova.plugins.keyboard',
  5199. 'ngCordova.plugins.keychain',
  5200. 'ngCordova.plugins.launchNavigator',
  5201. 'ngCordova.plugins.localNotification',
  5202. 'ngCordova.plugins.media',
  5203. 'ngCordova.plugins.mMediaAds',
  5204. 'ngCordova.plugins.mobfoxAds',
  5205. 'ngCordova.plugins.mopubAds',
  5206. 'ngCordova.plugins.nativeAudio',
  5207. 'ngCordova.plugins.network',
  5208. 'ngCordovaOauth',
  5209. 'ngCordova.plugins.pinDialog',
  5210. 'ngCordova.plugins.prefs',
  5211. 'ngCordova.plugins.printer',
  5212. 'ngCordova.plugins.progressIndicator',
  5213. 'ngCordova.plugins.push',
  5214. 'ngCordova.plugins.sms',
  5215. 'ngCordova.plugins.socialSharing',
  5216. 'ngCordova.plugins.spinnerDialog',
  5217. 'ngCordova.plugins.splashscreen',
  5218. 'ngCordova.plugins.sqlite',
  5219. 'ngCordova.plugins.statusbar',
  5220. 'ngCordova.plugins.toast',
  5221. 'ngCordova.plugins.touchid',
  5222. 'ngCordova.plugins.vibration',
  5223. 'ngCordova.plugins.videoCapturePlus',
  5224. 'ngCordova.plugins.zip',
  5225. 'ngCordova.plugins.insomnia'
  5226. ]);
  5227.  
  5228. // install : cordova plugin add https://github.com/floatinghotpot/cordova-plugin-mopub.git
  5229. // link : https://github.com/floatinghotpot/cordova-plugin-mopub
  5230.  
  5231. angular.module('ngCordova.plugins.mopubAds', [])
  5232. .factory('$cordovaMoPubAds', ['$q', '$window', function ($q, $window) {
  5233.  
  5234. return {
  5235. setOptions: function (options) {
  5236. var d = $q.defer();
  5237.  
  5238. $window.MoPub.setOptions(options, function () {
  5239. d.resolve();
  5240. }, function () {
  5241. d.reject();
  5242. });
  5243.  
  5244. return d.promise;
  5245. },
  5246.  
  5247. createBanner: function (options) {
  5248. var d = $q.defer();
  5249.  
  5250. $window.MoPub.createBanner(options, function () {
  5251. d.resolve();
  5252. }, function () {
  5253. d.reject();
  5254. });
  5255.  
  5256. return d.promise;
  5257. },
  5258.  
  5259. removeBanner: function () {
  5260. var d = $q.defer();
  5261.  
  5262. $window.MoPub.removeBanner(function () {
  5263. d.resolve();
  5264. }, function () {
  5265. d.reject();
  5266. });
  5267.  
  5268. return d.promise;
  5269. },
  5270.  
  5271. showBanner: function (position) {
  5272. var d = $q.defer();
  5273.  
  5274. $window.MoPub.showBanner(position, function () {
  5275. d.resolve();
  5276. }, function () {
  5277. d.reject();
  5278. });
  5279.  
  5280. return d.promise;
  5281. },
  5282.  
  5283. showBannerAtXY: function (x, y) {
  5284. var d = $q.defer();
  5285.  
  5286. $window.MoPub.showBannerAtXY(x, y, function () {
  5287. d.resolve();
  5288. }, function () {
  5289. d.reject();
  5290. });
  5291.  
  5292. return d.promise;
  5293. },
  5294.  
  5295. hideBanner: function () {
  5296. var d = $q.defer();
  5297.  
  5298. $window.MoPub.hideBanner(function () {
  5299. d.resolve();
  5300. }, function () {
  5301. d.reject();
  5302. });
  5303.  
  5304. return d.promise;
  5305. },
  5306.  
  5307. prepareInterstitial: function (options) {
  5308. var d = $q.defer();
  5309.  
  5310. $window.MoPub.prepareInterstitial(options, function () {
  5311. d.resolve();
  5312. }, function () {
  5313. d.reject();
  5314. });
  5315.  
  5316. return d.promise;
  5317. },
  5318.  
  5319. showInterstitial: function () {
  5320. var d = $q.defer();
  5321.  
  5322. $window.MoPub.showInterstitial(function () {
  5323. d.resolve();
  5324. }, function () {
  5325. d.reject();
  5326. });
  5327.  
  5328. return d.promise;
  5329. }
  5330. };
  5331. }]);
  5332.  
  5333. // install : cordova plugin add https://github.com/sidneys/cordova-plugin-nativeaudio.git
  5334. // link : https://github.com/sidneys/cordova-plugin-nativeaudio
  5335.  
  5336. angular.module('ngCordova.plugins.nativeAudio', [])
  5337.  
  5338. .factory('$cordovaNativeAudio', ['$q', '$window', function ($q, $window) {
  5339.  
  5340. return {
  5341. preloadSimple: function (id, assetPath) {
  5342. var q = $q.defer();
  5343. $window.plugins.NativeAudio.preloadSimple(id, assetPath, function (result) {
  5344. q.resolve(result);
  5345. }, function (err) {
  5346. q.reject(err);
  5347. });
  5348.  
  5349. return q.promise;
  5350. },
  5351.  
  5352. preloadComplex: function (id, assetPath, volume, voices) {
  5353. var q = $q.defer();
  5354. $window.plugins.NativeAudio.preloadComplex(id, assetPath, volume, voices, function (result) {
  5355. q.resolve(result);
  5356. }, function (err) {
  5357. q.reject(err);
  5358. });
  5359.  
  5360. return q.promise;
  5361. },
  5362.  
  5363. play: function (id, completeCallback) {
  5364. var q = $q.defer();
  5365. $window.plugins.NativeAudio.play(id, completeCallback
  5366. ,function (err) {
  5367. q.reject(err);
  5368. }
  5369. , function (result) {
  5370. q.resolve(result);
  5371. });
  5372.  
  5373. return q.promise;
  5374. },
  5375.  
  5376. stop: function (id) {
  5377. var q = $q.defer();
  5378. $window.plugins.NativeAudio.stop(id, function (result) {
  5379. q.resolve(result);
  5380. }, function (err) {
  5381. q.reject(err);
  5382. });
  5383. return q.promise;
  5384. },
  5385.  
  5386. loop: function (id) {
  5387. var q = $q.defer();
  5388. $window.plugins.NativeAudio.loop(id, function (result) {
  5389. q.resolve(result);
  5390. }, function (err) {
  5391. q.reject(err);
  5392. });
  5393.  
  5394. return q.promise;
  5395. },
  5396.  
  5397. unload: function (id) {
  5398. var q = $q.defer();
  5399. $window.plugins.NativeAudio.unload(id, function (result) {
  5400. q.resolve(result);
  5401. }, function (err) {
  5402. q.reject(err);
  5403. });
  5404.  
  5405. return q.promise;
  5406. },
  5407.  
  5408. setVolumeForComplexAsset: function (id, volume) {
  5409. var q = $q.defer();
  5410. $window.plugins.NativeAudio.setVolumeForComplexAsset(id, volume, function (result) {
  5411. q.resolve(result);
  5412. }, function (err) {
  5413. q.reject(err);
  5414. });
  5415.  
  5416. return q.promise;
  5417. }
  5418. };
  5419. }]);
  5420.  
  5421. // install : cordova plugin add cordova-plugin-network-information
  5422. // link : https://github.com/apache/cordova-plugin-network-information
  5423.  
  5424. angular.module('ngCordova.plugins.network', [])
  5425.  
  5426. .factory('$cordovaNetwork', ['$rootScope', '$timeout', function ($rootScope, $timeout) {
  5427.  
  5428.  
  5429. /**
  5430. * Fires offline a event
  5431. */
  5432. var offlineEvent = function () {
  5433. var networkState = navigator.connection.type;
  5434. $timeout(function () {
  5435. $rootScope.$broadcast('$cordovaNetwork:offline', networkState);
  5436. });
  5437. };
  5438.  
  5439. /**
  5440. * Fires online a event
  5441. */
  5442. var onlineEvent = function () {
  5443. var networkState = navigator.connection.type;
  5444. $timeout(function () {
  5445. $rootScope.$broadcast('$cordovaNetwork:online', networkState);
  5446. });
  5447. };
  5448.  
  5449. document.addEventListener("deviceready", function () {
  5450. if (navigator.connection) {
  5451. document.addEventListener("offline", offlineEvent, false);
  5452. document.addEventListener("online", onlineEvent, false);
  5453. }
  5454. });
  5455.  
  5456. return {
  5457. getNetwork: function () {
  5458. return navigator.connection.type;
  5459. },
  5460.  
  5461. isOnline: function () {
  5462. var networkState = navigator.connection.type;
  5463. return networkState !== Connection.UNKNOWN && networkState !== Connection.NONE;
  5464. },
  5465.  
  5466. isOffline: function () {
  5467. var networkState = navigator.connection.type;
  5468. return networkState === Connection.UNKNOWN || networkState === Connection.NONE;
  5469. },
  5470.  
  5471. clearOfflineWatch: function () {
  5472. document.removeEventListener("offline", offlineEvent);
  5473. $rootScope.$$listeners["$cordovaNetwork:offline"] = [];
  5474. },
  5475.  
  5476. clearOnlineWatch: function () {
  5477. document.removeEventListener("online", onlineEvent);
  5478. $rootScope.$$listeners["$cordovaNetwork:online"] = [];
  5479. }
  5480. };
  5481. }])
  5482. .run(['$cordovaNetwork', function ($cordovaNetwork) {
  5483. }]);
  5484.  
  5485. // install : cordova plugin add https://github.com/Paldom/PinDialog.git
  5486. // link : https://github.com/Paldom/PinDialog
  5487.  
  5488. angular.module('ngCordova.plugins.pinDialog', [])
  5489.  
  5490. .factory('$cordovaPinDialog', ['$q', '$window', function ($q, $window) {
  5491.  
  5492. return {
  5493. prompt: function (message, title, buttons) {
  5494. var q = $q.defer();
  5495.  
  5496. $window.plugins.pinDialog.prompt(message, function (res) {
  5497. q.resolve(res);
  5498. }, title, buttons);
  5499.  
  5500. return q.promise;
  5501. }
  5502. };
  5503. }]);
  5504.  
  5505. // install :
  5506. // link :
  5507.  
  5508. angular.module('ngCordova.plugins.prefs', [])
  5509.  
  5510. .factory('$cordovaPreferences', ['$window', '$q', function ($window, $q) {
  5511.  
  5512. return {
  5513. set: function (key, value) {
  5514. var q = $q.defer();
  5515.  
  5516. $window.appgiraffe.plugins.applicationPreferences.set(key, value, function (result) {
  5517. q.resolve(result);
  5518. }, function (err) {
  5519. q.reject(err);
  5520. });
  5521.  
  5522. return q.promise;
  5523. },
  5524.  
  5525. get: function (key) {
  5526. var q = $q.defer();
  5527.  
  5528. $window.appgiraffe.plugins.applicationPreferences.get(key, function (value) {
  5529. q.resolve(value);
  5530. }, function (err) {
  5531. q.reject(err);
  5532. });
  5533.  
  5534. return q.promise;
  5535. }
  5536. };
  5537. }]);
  5538.  
  5539. // install : cordova plugin add https://github.com/katzer/cordova-plugin-printer.git
  5540. // link : https://github.com/katzer/cordova-plugin-printer
  5541.  
  5542. angular.module('ngCordova.plugins.printer', [])
  5543.  
  5544. .factory('$cordovaPrinter', ['$q', '$window', function ($q, $window) {
  5545.  
  5546. return {
  5547. isAvailable: function () {
  5548. var q = $q.defer();
  5549.  
  5550. $window.plugin.printer.isAvailable(function (isAvailable) {
  5551. q.resolve(isAvailable);
  5552. });
  5553.  
  5554. return q.promise;
  5555. },
  5556.  
  5557. print: function (doc, options) {
  5558. var q = $q.defer();
  5559. $window.plugin.printer.print(doc, options, function () {
  5560. q.resolve();
  5561. });
  5562. return q.promise;
  5563. }
  5564. };
  5565. }]);
  5566.  
  5567. // install : cordova plugin add https://github.com/pbernasconi/cordova-progressIndicator.git
  5568. // link : http://pbernasconi.github.io/cordova-progressIndicator/
  5569.  
  5570. angular.module('ngCordova.plugins.progressIndicator', [])
  5571.  
  5572. .factory('$cordovaProgress', ['$q', function ($q) {
  5573.  
  5574. return {
  5575. show: function (_message) {
  5576. var message = _message || "Please wait...";
  5577. return ProgressIndicator.show(message);
  5578. },
  5579.  
  5580. showSimple: function (_dim) {
  5581. var dim = _dim || false;
  5582. return ProgressIndicator.showSimple(dim);
  5583. },
  5584.  
  5585. showSimpleWithLabel: function (_dim, _label) {
  5586. var dim = _dim || false;
  5587. var label = _label || "Loading...";
  5588. return ProgressIndicator.showSimpleWithLabel(dim, label);
  5589. },
  5590.  
  5591. showSimpleWithLabelDetail: function (_dim, _label, _detail) {
  5592. var dim = _dim || false;
  5593. var label = _label || "Loading...";
  5594. var detail = _detail || "Please wait";
  5595. return ProgressIndicator.showSimpleWithLabelDetail(dim, label, detail);
  5596. },
  5597.  
  5598. showDeterminate: function (_dim, _timeout) {
  5599. var dim = _dim || false;
  5600. var timeout = _timeout || 50000;
  5601. return ProgressIndicator.showDeterminate(dim, timeout);
  5602. },
  5603.  
  5604. showDeterminateWithLabel: function (_dim, _timeout, _label) {
  5605. var dim = _dim || false;
  5606. var timeout = _timeout || 50000;
  5607. var label = _label || "Loading...";
  5608.  
  5609. return ProgressIndicator.showDeterminateWithLabel(dim, timeout, label);
  5610. },
  5611.  
  5612. showAnnular: function (_dim, _timeout) {
  5613. var dim = _dim || false;
  5614. var timeout = _timeout || 50000;
  5615. return ProgressIndicator.showAnnular(dim, timeout);
  5616. },
  5617.  
  5618. showAnnularWithLabel: function (_dim, _timeout, _label) {
  5619. var dim = _dim || false;
  5620. var timeout = _timeout || 50000;
  5621. var label = _label || "Loading...";
  5622. return ProgressIndicator.showAnnularWithLabel(dim, timeout, label);
  5623. },
  5624.  
  5625. showBar: function (_dim, _timeout) {
  5626. var dim = _dim || false;
  5627. var timeout = _timeout || 50000;
  5628. return ProgressIndicator.showBar(dim, timeout);
  5629. },
  5630.  
  5631. showBarWithLabel: function (_dim, _timeout, _label) {
  5632. var dim = _dim || false;
  5633. var timeout = _timeout || 50000;
  5634. var label = _label || "Loading...";
  5635. return ProgressIndicator.showBarWithLabel(dim, timeout, label);
  5636. },
  5637.  
  5638. showSuccess: function (_dim, _label) {
  5639. var dim = _dim || false;
  5640. var label = _label || "Success";
  5641. return ProgressIndicator.showSuccess(dim, label);
  5642. },
  5643.  
  5644. showText: function (_dim, _text, _position) {
  5645. var dim = _dim || false;
  5646. var text = _text || "Warning";
  5647. var position = _position || "center";
  5648. return ProgressIndicator.showText(dim, text, position);
  5649. },
  5650.  
  5651. hide: function () {
  5652. return ProgressIndicator.hide();
  5653. }
  5654. };
  5655.  
  5656. }]);
  5657.  
  5658. // install : cordova plugin add https://github.com/phonegap-build/PushPlugin.git
  5659. // link : https://github.com/phonegap-build/PushPlugin
  5660.  
  5661. angular.module('ngCordova.plugins.push', [])
  5662.  
  5663. .factory('$cordovaPush', ['$q', '$window', '$rootScope', '$timeout', function ($q, $window, $rootScope, $timeout) {
  5664.  
  5665. return {
  5666. onNotification: function (notification) {
  5667. $timeout(function () {
  5668. $rootScope.$broadcast('$cordovaPush:notificationReceived', notification);
  5669. });
  5670. },
  5671.  
  5672. register: function (config) {
  5673. var q = $q.defer();
  5674. var injector;
  5675. if (config !== undefined && config.ecb === undefined) {
  5676. if (document.querySelector('[ng-app]') === null) {
  5677. injector = "document.body";
  5678. }
  5679. else {
  5680. injector = "document.querySelector('[ng-app]')";
  5681. }
  5682. config.ecb = "angular.element(" + injector + ").injector().get('$cordovaPush').onNotification";
  5683. }
  5684.  
  5685. $window.plugins.pushNotification.register(function (token) {
  5686. q.resolve(token);
  5687. }, function (error) {
  5688. q.reject(error);
  5689. }, config);
  5690.  
  5691. return q.promise;
  5692. },
  5693.  
  5694. unregister: function (options) {
  5695. var q = $q.defer();
  5696. $window.plugins.pushNotification.unregister(function (result) {
  5697. q.resolve(result);
  5698. }, function (error) {
  5699. q.reject(error);
  5700. }, options);
  5701.  
  5702. return q.promise;
  5703. },
  5704.  
  5705. // iOS only
  5706. setBadgeNumber: function (number) {
  5707. var q = $q.defer();
  5708. $window.plugins.pushNotification.setApplicationIconBadgeNumber(function (result) {
  5709. q.resolve(result);
  5710. }, function (error) {
  5711. q.reject(error);
  5712. }, number);
  5713. return q.promise;
  5714. }
  5715. };
  5716. }]);
  5717.  
  5718. // install : cordova plugin add https://github.com/cordova-sms/cordova-sms-plugin.git
  5719. // link : https://github.com/cordova-sms/cordova-sms-plugin
  5720.  
  5721. angular.module('ngCordova.plugins.sms', [])
  5722.  
  5723. .factory('$cordovaSms', ['$q', function ($q) {
  5724.  
  5725. return {
  5726. send: function (number, message, options) {
  5727. var q = $q.defer();
  5728. sms.send(number, message, options, function (res) {
  5729. q.resolve(res);
  5730. }, function (err) {
  5731. q.reject(err);
  5732. });
  5733. return q.promise;
  5734. }
  5735. };
  5736.  
  5737. }]);
  5738.  
  5739. // install : cordova plugin add https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin.git
  5740. // link : https://github.com/EddyVerbruggen/SocialSharing-PhoneGap-Plugin
  5741.  
  5742. // NOTE: shareViaEmail -> if user cancels sharing email, success is still called
  5743. // TODO: add support for iPad
  5744.  
  5745. angular.module('ngCordova.plugins.socialSharing', [])
  5746.  
  5747. .factory('$cordovaSocialSharing', ['$q', '$window', function ($q, $window) {
  5748.  
  5749. return {
  5750. share: function (message, subject, file, link) {
  5751. var q = $q.defer();
  5752. subject = subject || null;
  5753. file = file || null;
  5754. link = link || null;
  5755. $window.plugins.socialsharing.share(message, subject, file, link, function () {
  5756. q.resolve(true);
  5757. }, function () {
  5758. q.reject(false);
  5759. });
  5760. return q.promise;
  5761. },
  5762.  
  5763. shareViaTwitter: function (message, file, link) {
  5764. var q = $q.defer();
  5765. file = file || null;
  5766. link = link || null;
  5767. $window.plugins.socialsharing.shareViaTwitter(message, file, link, function () {
  5768. q.resolve(true);
  5769. }, function () {
  5770. q.reject(false);
  5771. });
  5772. return q.promise;
  5773. },
  5774.  
  5775. shareViaWhatsApp: function (message, file, link) {
  5776. var q = $q.defer();
  5777. file = file || null;
  5778. link = link || null;
  5779. $window.plugins.socialsharing.shareViaWhatsApp(message, file, link, function () {
  5780. q.resolve(true);
  5781. }, function () {
  5782. q.reject(false);
  5783. });
  5784. return q.promise;
  5785. },
  5786.  
  5787. shareViaFacebook: function (message, file, link) {
  5788. var q = $q.defer();
  5789. message = message || null;
  5790. file = file || null;
  5791. link = link || null;
  5792. $window.plugins.socialsharing.shareViaFacebook(message, file, link, function () {
  5793. q.resolve(true);
  5794. }, function () {
  5795. q.reject(false);
  5796. });
  5797. return q.promise;
  5798. },
  5799.  
  5800. shareViaFacebookWithPasteMessageHint: function (message, file, link, pasteMessageHint) {
  5801. var q = $q.defer();
  5802. file = file || null;
  5803. link = link || null;
  5804. $window.plugins.socialsharing.shareViaFacebookWithPasteMessageHint(message, file, link, pasteMessageHint, function () {
  5805. q.resolve(true);
  5806. }, function () {
  5807. q.reject(false);
  5808. });
  5809. return q.promise;
  5810. },
  5811.  
  5812. shareViaSMS: function (message, commaSeparatedPhoneNumbers) {
  5813. var q = $q.defer();
  5814. $window.plugins.socialsharing.shareViaSMS(message, commaSeparatedPhoneNumbers, function () {
  5815. q.resolve(true);
  5816. }, function () {
  5817. q.reject(false);
  5818. });
  5819. return q.promise;
  5820. },
  5821.  
  5822. shareViaEmail: function (message, subject, toArr, ccArr, bccArr, fileArr) {
  5823. var q = $q.defer();
  5824. toArr = toArr || null;
  5825. ccArr = ccArr || null;
  5826. bccArr = bccArr || null;
  5827. fileArr = fileArr || null;
  5828. $window.plugins.socialsharing.shareViaEmail(message, subject, toArr, ccArr, bccArr, fileArr, function () {
  5829. q.resolve(true);
  5830. }, function () {
  5831. q.reject(false);
  5832. });
  5833. return q.promise;
  5834. },
  5835.  
  5836. shareVia: function (via, message, subject, file, link) {
  5837. var q = $q.defer();
  5838. message = message || null;
  5839. subject = subject || null;
  5840. file = file || null;
  5841. link = link || null;
  5842. $window.plugins.socialsharing.shareVia(via, message, subject, file, link, function () {
  5843. q.resolve(true);
  5844. }, function () {
  5845. q.reject(false);
  5846. });
  5847. return q.promise;
  5848. },
  5849.  
  5850. canShareViaEmail: function () {
  5851. var q = $q.defer();
  5852. $window.plugins.socialsharing.canShareViaEmail(function () {
  5853. q.resolve(true);
  5854. }, function () {
  5855. q.reject(false);
  5856. });
  5857. return q.promise;
  5858. },
  5859.  
  5860. canShareVia: function (via, message, subject, file, link) {
  5861. var q = $q.defer();
  5862. $window.plugins.socialsharing.canShareVia(via, message, subject, file, link, function (success) {
  5863. q.resolve(success);
  5864. }, function (error) {
  5865. q.reject(error);
  5866. });
  5867. return q.promise;
  5868. },
  5869.  
  5870. available: function () {
  5871. var q = $q.defer();
  5872. window.plugins.socialsharing.available(function (isAvailable) {
  5873. if (isAvailable) {
  5874. q.resolve();
  5875. }
  5876. else {
  5877. q.reject();
  5878. }
  5879. });
  5880. }
  5881. };
  5882. }]);
  5883.  
  5884. // install : cordova plugin add https://github.com/Paldom/SpinnerDialog.git
  5885. // link : https://github.com/Paldom/SpinnerDialog
  5886.  
  5887. angular.module('ngCordova.plugins.spinnerDialog', [])
  5888.  
  5889. .factory('$cordovaSpinnerDialog', ['$window', function ($window) {
  5890.  
  5891. return {
  5892. show: function (title, message, fixed) {
  5893. fixed = fixed || false;
  5894. return $window.plugins.spinnerDialog.show(title, message, fixed);
  5895. },
  5896. hide: function () {
  5897. return $window.plugins.spinnerDialog.hide();
  5898. }
  5899. };
  5900.  
  5901. }]);
  5902.  
  5903. // install : cordova plugin add cordova-plugin-splashscreen
  5904. // link : https://github.com/apache/cordova-plugin-splashscreen
  5905.  
  5906. angular.module('ngCordova.plugins.splashscreen', [])
  5907.  
  5908. .factory('$cordovaSplashscreen', [function () {
  5909.  
  5910. return {
  5911. hide: function () {
  5912. return navigator.splashscreen.hide();
  5913. },
  5914.  
  5915. show: function () {
  5916. return navigator.splashscreen.show();
  5917. }
  5918. };
  5919.  
  5920. }]);
  5921.  
  5922. // install : cordova plugin add https://github.com/litehelpers/Cordova-sqlite-storage.git
  5923. // link : https://github.com/litehelpers/Cordova-sqlite-storage
  5924.  
  5925. angular.module('ngCordova.plugins.sqlite', [])
  5926.  
  5927. .factory('$cordovaSQLite', ['$q', '$window', function ($q, $window) {
  5928.  
  5929. return {
  5930. openDB: function (options, background) {
  5931. if (typeof options !== 'object') {
  5932. options = {name: options};
  5933. }
  5934. if (typeof background !== 'undefined') {
  5935. options.bgType = background;
  5936. }
  5937.  
  5938. return $window.sqlitePlugin.openDatabase(options);
  5939. },
  5940.  
  5941. execute: function (db, query, binding) {
  5942. var q = $q.defer();
  5943. db.transaction(function (tx) {
  5944. tx.executeSql(query, binding, function (tx, result) {
  5945. q.resolve(result);
  5946. },
  5947. function (transaction, error) {
  5948. q.reject(error);
  5949. });
  5950. });
  5951. return q.promise;
  5952. },
  5953.  
  5954. insertCollection: function (db, query, bindings) {
  5955. var q = $q.defer();
  5956. var coll = bindings.slice(0); // clone collection
  5957.  
  5958. db.transaction(function (tx) {
  5959. (function insertOne() {
  5960. var record = coll.splice(0, 1)[0]; // get the first record of coll and reduce coll by one
  5961. try {
  5962. tx.executeSql(query, record, function (tx, result) {
  5963. if (coll.length === 0) {
  5964. q.resolve(result);
  5965. } else {
  5966. insertOne();
  5967. }
  5968. }, function (transaction, error) {
  5969. q.reject(error);
  5970. return;
  5971. });
  5972. } catch (exception) {
  5973. q.reject(exception);
  5974. }
  5975. })();
  5976. });
  5977. return q.promise;
  5978. },
  5979.  
  5980. nestedExecute: function (db, query1, query2, binding1, binding2) {
  5981. var q = $q.defer();
  5982.  
  5983. db.transaction(function (tx) {
  5984. tx.executeSql(query1, binding1, function (tx, result) {
  5985. q.resolve(result);
  5986. tx.executeSql(query2, binding2, function (tx, res) {
  5987. q.resolve(res);
  5988. });
  5989. });
  5990. },
  5991. function (transaction, error) {
  5992. q.reject(error);
  5993. });
  5994.  
  5995. return q.promise;
  5996. },
  5997.  
  5998. deleteDB: function (dbName) {
  5999. var q = $q.defer();
  6000.  
  6001. $window.sqlitePlugin.deleteDatabase(dbName, function (success) {
  6002. q.resolve(success);
  6003. }, function (error) {
  6004. q.reject(error);
  6005. });
  6006.  
  6007. return q.promise;
  6008. }
  6009. };
  6010. }]);
  6011.  
  6012. // install : cordova plugin add cordova-plugin-statusbar
  6013. // link : https://github.com/apache/cordova-plugin-statusbar
  6014.  
  6015. angular.module('ngCordova.plugins.statusbar', [])
  6016.  
  6017. .factory('$cordovaStatusbar', [function () {
  6018.  
  6019. return {
  6020.  
  6021. /**
  6022. * @param {boolean} bool
  6023. */
  6024. overlaysWebView: function (bool) {
  6025. return StatusBar.overlaysWebView(!!bool);
  6026. },
  6027.  
  6028. STYLES: {
  6029. DEFAULT: 0,
  6030. LIGHT_CONTENT: 1,
  6031. BLACK_TRANSLUCENT: 2,
  6032. BLACK_OPAQUE: 3
  6033. },
  6034.  
  6035. /**
  6036. * @param {number} style
  6037. */
  6038. style: function (style) {
  6039. switch (style) {
  6040. // Default
  6041. case 0:
  6042. return StatusBar.styleDefault();
  6043.  
  6044. // LightContent
  6045. case 1:
  6046. return StatusBar.styleLightContent();
  6047.  
  6048. // BlackTranslucent
  6049. case 2:
  6050. return StatusBar.styleBlackTranslucent();
  6051.  
  6052. // BlackOpaque
  6053. case 3:
  6054. return StatusBar.styleBlackOpaque();
  6055.  
  6056. default:
  6057. return StatusBar.styleDefault();
  6058. }
  6059. },
  6060.  
  6061. // supported names:
  6062. // black, darkGray, lightGray, white, gray, red, green,
  6063. // blue, cyan, yellow, magenta, orange, purple, brown
  6064. styleColor: function (color) {
  6065. return StatusBar.backgroundColorByName(color);
  6066. },
  6067.  
  6068. styleHex: function (colorHex) {
  6069. return StatusBar.backgroundColorByHexString(colorHex);
  6070. },
  6071.  
  6072. hide: function () {
  6073. return StatusBar.hide();
  6074. },
  6075.  
  6076. show: function () {
  6077. return StatusBar.show();
  6078. },
  6079.  
  6080. isVisible: function () {
  6081. return StatusBar.isVisible;
  6082. }
  6083. };
  6084. }]);
  6085.  
  6086. // install : cordova plugin add https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin.git
  6087. // link : https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin
  6088.  
  6089. angular.module('ngCordova.plugins.toast', [])
  6090.  
  6091. .factory('$cordovaToast', ['$q', '$window', function ($q, $window) {
  6092.  
  6093. return {
  6094. showShortTop: function (message) {
  6095. var q = $q.defer();
  6096. $window.plugins.toast.showShortTop(message, function (response) {
  6097. q.resolve(response);
  6098. }, function (error) {
  6099. q.reject(error);
  6100. });
  6101. return q.promise;
  6102. },
  6103.  
  6104. showShortCenter: function (message) {
  6105. var q = $q.defer();
  6106. $window.plugins.toast.showShortCenter(message, function (response) {
  6107. q.resolve(response);
  6108. }, function (error) {
  6109. q.reject(error);
  6110. });
  6111. return q.promise;
  6112. },
  6113.  
  6114. showShortBottom: function (message) {
  6115. var q = $q.defer();
  6116. $window.plugins.toast.showShortBottom(message, function (response) {
  6117. q.resolve(response);
  6118. }, function (error) {
  6119. q.reject(error);
  6120. });
  6121. return q.promise;
  6122. },
  6123.  
  6124. showLongTop: function (message) {
  6125. var q = $q.defer();
  6126. $window.plugins.toast.showLongTop(message, function (response) {
  6127. q.resolve(response);
  6128. }, function (error) {
  6129. q.reject(error);
  6130. });
  6131. return q.promise;
  6132. },
  6133.  
  6134. showLongCenter: function (message) {
  6135. var q = $q.defer();
  6136. $window.plugins.toast.showLongCenter(message, function (response) {
  6137. q.resolve(response);
  6138. }, function (error) {
  6139. q.reject(error);
  6140. });
  6141. return q.promise;
  6142. },
  6143.  
  6144. showLongBottom: function (message) {
  6145. var q = $q.defer();
  6146. $window.plugins.toast.showLongBottom(message, function (response) {
  6147. q.resolve(response);
  6148. }, function (error) {
  6149. q.reject(error);
  6150. });
  6151. return q.promise;
  6152. },
  6153.  
  6154.  
  6155. show: function (message, duration, position) {
  6156. var q = $q.defer();
  6157. $window.plugins.toast.show(message, duration, position, function (response) {
  6158. q.resolve(response);
  6159. }, function (error) {
  6160. q.reject(error);
  6161. });
  6162. return q.promise;
  6163. }
  6164. };
  6165.  
  6166. }]);
  6167.  
  6168. // install : cordova plugin add https://github.com/leecrossley/cordova-plugin-touchid.git
  6169. // link : https://github.com/leecrossley/cordova-plugin-touchid
  6170.  
  6171. angular.module('ngCordova.plugins.touchid', [])
  6172.  
  6173. .factory('$cordovaTouchID', ['$q', function ($q) {
  6174.  
  6175. return {
  6176. checkSupport: function () {
  6177. var defer = $q.defer();
  6178. if (!window.cordova) {
  6179. defer.reject("Not supported without cordova.js");
  6180. } else {
  6181. touchid.checkSupport(function (value) {
  6182. defer.resolve(value);
  6183. }, function (err) {
  6184. defer.reject(err);
  6185. });
  6186. }
  6187.  
  6188. return defer.promise;
  6189. },
  6190.  
  6191. authenticate: function (auth_reason_text) {
  6192. var defer = $q.defer();
  6193. if (!window.cordova) {
  6194. defer.reject("Not supported without cordova.js");
  6195. } else {
  6196. touchid.authenticate(function (value) {
  6197. defer.resolve(value);
  6198. }, function (err) {
  6199. defer.reject(err);
  6200. }, auth_reason_text);
  6201. }
  6202.  
  6203. return defer.promise;
  6204. }
  6205. };
  6206. }]);
  6207.  
  6208. // install : cordova plugin add cordova-plugin-vibration
  6209. // link : https://github.com/apache/cordova-plugin-vibration
  6210.  
  6211. angular.module('ngCordova.plugins.vibration', [])
  6212.  
  6213. .factory('$cordovaVibration', [function () {
  6214.  
  6215. return {
  6216. vibrate: function (times) {
  6217. return navigator.notification.vibrate(times);
  6218. },
  6219. vibrateWithPattern: function (pattern, repeat) {
  6220. return navigator.notification.vibrateWithPattern(pattern, repeat);
  6221. },
  6222. cancelVibration: function () {
  6223. return navigator.notification.cancelVibration();
  6224. }
  6225. };
  6226. }]);
  6227.  
  6228. // install : cordova plugin add https://github.com/EddyVerbruggen/VideoCapturePlus-PhoneGap-Plugin.git
  6229. // link : https://github.com/EddyVerbruggen/VideoCapturePlus-PhoneGap-Plugin
  6230.  
  6231. angular.module('ngCordova.plugins.videoCapturePlus', [])
  6232.  
  6233. .provider('$cordovaVideoCapturePlus', [function () {
  6234.  
  6235. var defaultOptions = {};
  6236.  
  6237.  
  6238. /**
  6239. * the nr of videos to record, default 1 (on iOS always 1)
  6240. *
  6241. * @param limit
  6242. */
  6243. this.setLimit = function setLimit(limit) {
  6244. defaultOptions.limit = limit;
  6245. };
  6246.  
  6247.  
  6248. /**
  6249. * max duration in seconds, default 0, which is 'forever'
  6250. *
  6251. * @param seconds
  6252. */
  6253. this.setMaxDuration = function setMaxDuration(seconds) {
  6254. defaultOptions.duration = seconds;
  6255. };
  6256.  
  6257.  
  6258. /**
  6259. * set to true to override the default low quality setting
  6260. *
  6261. * @param {Boolean} highquality
  6262. */
  6263. this.setHighQuality = function setHighQuality(highquality) {
  6264. defaultOptions.highquality = highquality;
  6265. };
  6266.  
  6267. /**
  6268. * you'll want to sniff the user-Agent/device and pass the best overlay based on that..
  6269. * set to true to override the default backfacing camera setting. iOS: works fine, Android: YMMV (#18)
  6270. *
  6271. * @param {Boolean} frontcamera
  6272. */
  6273. this.useFrontCamera = function useFrontCamera(frontcamera) {
  6274. defaultOptions.frontcamera = frontcamera;
  6275. };
  6276.  
  6277.  
  6278. /**
  6279. * put the png in your www folder
  6280. *
  6281. * @param {String} imageUrl
  6282. */
  6283. this.setPortraitOverlay = function setPortraitOverlay(imageUrl) {
  6284. defaultOptions.portraitOverlay = imageUrl;
  6285. };
  6286.  
  6287.  
  6288. /**
  6289. *
  6290. * @param {String} imageUrl
  6291. */
  6292. this.setLandscapeOverlay = function setLandscapeOverlay(imageUrl) {
  6293. defaultOptions.landscapeOverlay = imageUrl;
  6294. };
  6295.  
  6296.  
  6297. /**
  6298. * iOS only
  6299. *
  6300. * @param text
  6301. */
  6302. this.setOverlayText = function setOverlayText(text) {
  6303. defaultOptions.overlayText = text;
  6304. };
  6305.  
  6306.  
  6307. this.$get = ['$q', '$window', function ($q, $window) {
  6308. return {
  6309. captureVideo: function (options) {
  6310. var q = $q.defer();
  6311.  
  6312. if (!$window.plugins.videocaptureplus) {
  6313. q.resolve(null);
  6314. return q.promise;
  6315. }
  6316.  
  6317. $window.plugins.videocaptureplus.captureVideo(q.resolve, q.reject,
  6318. angular.extend({}, defaultOptions, options));
  6319.  
  6320. return q.promise;
  6321. }
  6322. };
  6323. }];
  6324. }]);
  6325.  
  6326. // install : cordova plugin add https://github.com/MobileChromeApps/zip.git
  6327. // link : https://github.com/MobileChromeApps/zip
  6328.  
  6329. angular.module('ngCordova.plugins.zip', [])
  6330.  
  6331. .factory('$cordovaZip', ['$q', '$window', function ($q, $window) {
  6332.  
  6333. return {
  6334. unzip: function (source, destination) {
  6335. var q = $q.defer();
  6336.  
  6337. $window.zip.unzip(source, destination, function (isError) {
  6338. if (isError === 0) {
  6339. q.resolve();
  6340. } else {
  6341. q.reject();
  6342. }
  6343. }, function (progressEvent) {
  6344. q.notify(progressEvent);
  6345. });
  6346.  
  6347. return q.promise;
  6348. }
  6349. };
  6350. }]);
  6351.  
  6352. angular.module("oauth.providers", ["oauth.utils"])
  6353.  
  6354. .factory("$cordovaOauth", ["$q", '$http', "$cordovaOauthUtility", function($q, $http, $cordovaOauthUtility) {
  6355.  
  6356. return {
  6357.  
  6358. /*
  6359. * Sign into the ADFS service (ADFS 3.0 onwards)
  6360. *
  6361. * @param string clientId (client registered in ADFS, with redirect_uri configured to: http://localhost/callback)
  6362. * @param string adfsServer (url of the ADFS Server)
  6363. * @param string relyingPartyId (url of the Relying Party (resource relying on ADFS for authentication) configured in ADFS)
  6364. * @return promise
  6365. */
  6366. adfs: function(clientId, adfsServer, relyingPartyId) {
  6367. var deferred = $q.defer();
  6368. if(window.cordova) {
  6369. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6370. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6371. var browserRef = window.open(adfsServer + '/adfs/oauth2/authorize?response_type=code&client_id=' + clientId +'&redirect_uri=http://localhost/callback&resource=' + relyingPartyId, '_blank', 'location=no');
  6372.  
  6373. browserRef.addEventListener("loadstart", function(event) {
  6374. if((event.url).indexOf('http://localhost/callback') === 0) {
  6375. var requestToken = (event.url).split("code=")[1];
  6376. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6377. $http({method: "post", url: adfsServer + "/adfs/oauth2/token", data: "client_id=" + clientId + "&code=" + requestToken + "&redirect_uri=http://localhost/callback&grant_type=authorization_code" })
  6378. .success(function(data) {
  6379. deferred.resolve(data);
  6380. })
  6381. .error(function(data, status) {
  6382. deferred.reject("Problem authenticating");
  6383. })
  6384. .finally(function() {
  6385. setTimeout(function() {
  6386. browserRef.close();
  6387. }, 10);
  6388. });
  6389. }
  6390. });
  6391. browserRef.addEventListener('exit', function(event) {
  6392. deferred.reject("The sign in flow was canceled");
  6393. });
  6394. } else {
  6395. deferred.reject("Could not find InAppBrowser plugin");
  6396. }
  6397. } else {
  6398. deferred.reject("Cannot authenticate via a web browser");
  6399. }
  6400. return deferred.promise;
  6401. },
  6402.  
  6403. /*
  6404. * Sign into the Dropbox service
  6405. *
  6406. * @param string appKey
  6407. * @param object options
  6408. * @return promise
  6409. */
  6410. dropbox: function(appKey, options) {
  6411. var deferred = $q.defer();
  6412. if(window.cordova) {
  6413. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6414. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6415. var redirect_uri = "http://localhost/callback";
  6416. if(options !== undefined) {
  6417. if(options.hasOwnProperty("redirect_uri")) {
  6418. redirect_uri = options.redirect_uri;
  6419. }
  6420. }
  6421. var browserRef = window.open("https://www.dropbox.com/1/oauth2/authorize?client_id=" + appKey + "&redirect_uri=" + redirect_uri + "&response_type=token", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  6422. browserRef.addEventListener("loadstart", function(event) {
  6423. if((event.url).indexOf(redirect_uri) === 0) {
  6424. browserRef.removeEventListener("exit",function(event){});
  6425. browserRef.close();
  6426. var callbackResponse = (event.url).split("#")[1];
  6427. var responseParameters = (callbackResponse).split("&");
  6428. var parameterMap = [];
  6429. for(var i = 0; i < responseParameters.length; i++) {
  6430. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  6431. }
  6432. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  6433. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, uid: parameterMap.uid });
  6434. } else {
  6435. deferred.reject("Problem authenticating");
  6436. }
  6437. }
  6438. });
  6439. browserRef.addEventListener('exit', function(event) {
  6440. deferred.reject("The sign in flow was canceled");
  6441. });
  6442. } else {
  6443. deferred.reject("Could not find InAppBrowser plugin");
  6444. }
  6445. } else {
  6446. deferred.reject("Cannot authenticate via a web browser");
  6447. }
  6448. return deferred.promise;
  6449. },
  6450.  
  6451. /*
  6452. * Sign into the Digital Ocean service
  6453. *
  6454. * @param string clientId
  6455. * @param string clientSecret
  6456. * @param object options
  6457. * @return promise
  6458. */
  6459. digitalOcean: function(clientId, clientSecret, options) {
  6460. var deferred = $q.defer();
  6461. if(window.cordova) {
  6462. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6463. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6464. var redirect_uri = "http://localhost/callback";
  6465. if(options !== undefined) {
  6466. if(options.hasOwnProperty("redirect_uri")) {
  6467. redirect_uri = options.redirect_uri;
  6468. }
  6469. }
  6470. var browserRef = window.open("https://cloud.digitalocean.com/v1/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=read%20write", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  6471. browserRef.addEventListener("loadstart", function(event) {
  6472. if((event.url).indexOf(redirect_uri) === 0) {
  6473. var requestToken = (event.url).split("code=")[1];
  6474. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6475. $http({method: "post", url: "https://cloud.digitalocean.com/v1/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  6476. .success(function(data) {
  6477. deferred.resolve(data);
  6478. })
  6479. .error(function(data, status) {
  6480. deferred.reject("Problem authenticating");
  6481. })
  6482. .finally(function() {
  6483. setTimeout(function() {
  6484. browserRef.close();
  6485. }, 10);
  6486. });
  6487. }
  6488. });
  6489. browserRef.addEventListener('exit', function(event) {
  6490. deferred.reject("The sign in flow was canceled");
  6491. });
  6492. } else {
  6493. deferred.reject("Could not find InAppBrowser plugin");
  6494. }
  6495. } else {
  6496. deferred.reject("Cannot authenticate via a web browser");
  6497. }
  6498. return deferred.promise;
  6499. },
  6500.  
  6501. /*
  6502. * Sign into the Google service
  6503. *
  6504. * @param string clientId
  6505. * @param array appScope
  6506. * @param object options
  6507. * @return promise
  6508. */
  6509. google: function(clientId, appScope, options) {
  6510. var deferred = $q.defer();
  6511. if(window.cordova) {
  6512. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6513. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6514. var redirect_uri = "http://localhost/callback";
  6515. if(options !== undefined) {
  6516. if(options.hasOwnProperty("redirect_uri")) {
  6517. redirect_uri = options.redirect_uri;
  6518. }
  6519. }
  6520. var browserRef = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&approval_prompt=force&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6521. browserRef.addEventListener("loadstart", function(event) {
  6522. if((event.url).indexOf(redirect_uri) === 0) {
  6523. browserRef.removeEventListener("exit",function(event){});
  6524. browserRef.close();
  6525. var callbackResponse = (event.url).split("#")[1];
  6526. var responseParameters = (callbackResponse).split("&");
  6527. var parameterMap = [];
  6528. for(var i = 0; i < responseParameters.length; i++) {
  6529. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  6530. }
  6531. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  6532. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in });
  6533. } else {
  6534. deferred.reject("Problem authenticating");
  6535. }
  6536. }
  6537. });
  6538. browserRef.addEventListener('exit', function(event) {
  6539. deferred.reject("The sign in flow was canceled");
  6540. });
  6541. } else {
  6542. deferred.reject("Could not find InAppBrowser plugin");
  6543. }
  6544. } else {
  6545. deferred.reject("Cannot authenticate via a web browser");
  6546. }
  6547. return deferred.promise;
  6548. },
  6549.  
  6550. /*
  6551. * Sign into the GitHub service
  6552. *
  6553. * @param string clientId
  6554. * @param string clientSecret
  6555. * @param array appScope
  6556. * @param object options
  6557. * @return promise
  6558. */
  6559. github: function(clientId, clientSecret, appScope, options) {
  6560. var deferred = $q.defer();
  6561. if(window.cordova) {
  6562. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6563. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6564. var redirect_uri = "http://localhost/callback";
  6565. if(options !== undefined) {
  6566. if(options.hasOwnProperty("redirect_uri")) {
  6567. redirect_uri = options.redirect_uri;
  6568. }
  6569. }
  6570. var browserRef = window.open('https://github.com/login/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(","), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6571. browserRef.addEventListener('loadstart', function(event) {
  6572. if((event.url).indexOf(redirect_uri) === 0) {
  6573. requestToken = (event.url).split("code=")[1];
  6574. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6575. $http.defaults.headers.post.accept = 'application/json';
  6576. $http({method: "post", url: "https://github.com/login/oauth/access_token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&code=" + requestToken })
  6577. .success(function(data) {
  6578. deferred.resolve(data);
  6579. })
  6580. .error(function(data, status) {
  6581. deferred.reject("Problem authenticating");
  6582. })
  6583. .finally(function() {
  6584. setTimeout(function() {
  6585. browserRef.close();
  6586. }, 10);
  6587. });
  6588. }
  6589. });
  6590. browserRef.addEventListener('exit', function(event) {
  6591. deferred.reject("The sign in flow was canceled");
  6592. });
  6593. } else {
  6594. deferred.reject("Could not find InAppBrowser plugin");
  6595. }
  6596. } else {
  6597. deferred.reject("Cannot authenticate via a web browser");
  6598. }
  6599. return deferred.promise;
  6600. },
  6601.  
  6602. /*
  6603. * Sign into the Facebook service
  6604. *
  6605. * @param string clientId
  6606. * @param array appScope
  6607. * @param object options
  6608. * @return promise
  6609. */
  6610. facebook: function(clientId, appScope, options) {
  6611. var deferred = $q.defer();
  6612. if(window.cordova) {
  6613. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6614. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6615. var redirect_uri = "http://localhost/callback";
  6616. if(options !== undefined) {
  6617. if(options.hasOwnProperty("redirect_uri")) {
  6618. redirect_uri = options.redirect_uri;
  6619. }
  6620. }
  6621. var flowUrl = "https://www.facebook.com/v2.0/dialog/oauth?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=token&scope=" + appScope.join(",");
  6622. if(options !== undefined && options.hasOwnProperty("auth_type")) {
  6623. flowUrl += "&auth_type=" + options.auth_type;
  6624. }
  6625. var browserRef = window.open(flowUrl, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6626. browserRef.addEventListener('loadstart', function(event) {
  6627. if((event.url).indexOf(redirect_uri) === 0) {
  6628. browserRef.removeEventListener("exit",function(event){});
  6629. browserRef.close();
  6630. var callbackResponse = (event.url).split("#")[1];
  6631. var responseParameters = (callbackResponse).split("&");
  6632. var parameterMap = [];
  6633. for(var i = 0; i < responseParameters.length; i++) {
  6634. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  6635. }
  6636. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  6637. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  6638. } else {
  6639. if ((event.url).indexOf("error_code=100") !== 0)
  6640. deferred.reject("Facebook returned error_code=100: Invalid permissions");
  6641. else
  6642. deferred.reject("Problem authenticating");
  6643. }
  6644. }
  6645. });
  6646. browserRef.addEventListener('exit', function(event) {
  6647. deferred.reject("The sign in flow was canceled");
  6648. });
  6649. } else {
  6650. deferred.reject("Could not find InAppBrowser plugin");
  6651. }
  6652. } else {
  6653. deferred.reject("Cannot authenticate via a web browser");
  6654. }
  6655. return deferred.promise;
  6656. },
  6657.  
  6658. /*
  6659. * Sign into the LinkedIn service
  6660. *
  6661. * @param string clientId
  6662. * @param string clientSecret
  6663. * @param array appScope
  6664. * @param string state
  6665. * @param object options
  6666. * @return promise
  6667. */
  6668. linkedin: function(clientId, clientSecret, appScope, state, options) {
  6669. var deferred = $q.defer();
  6670. if(window.cordova) {
  6671. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6672. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6673. var redirect_uri = "http://localhost/callback";
  6674. if(options !== undefined) {
  6675. if(options.hasOwnProperty("redirect_uri")) {
  6676. redirect_uri = options.redirect_uri;
  6677. }
  6678. }
  6679.  
  6680. var browserRef = window.open('https://www.linkedin.com/uas/oauth2/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type=code&state=' + state, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6681.  
  6682. browserRef.addEventListener('loadstart', function(event) {
  6683. if((event.url).indexOf(redirect_uri) === 0) {
  6684. requestToken = (event.url).split("code=")[1];
  6685. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6686. $http({method: "post", url: "https://www.linkedin.com/uas/oauth2/accessToken", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  6687. .success(function(data) {
  6688. deferred.resolve(data);
  6689. })
  6690. .error(function(data, status) {
  6691. deferred.reject("Problem authenticating");
  6692. })
  6693. .finally(function() {
  6694. setTimeout(function() {
  6695. browserRef.close();
  6696. }, 10);
  6697. });
  6698. }
  6699. });
  6700. browserRef.addEventListener('exit', function(event) {
  6701. deferred.reject("The sign in flow was canceled");
  6702. });
  6703. } else {
  6704. deferred.reject("Could not find InAppBrowser plugin");
  6705. }
  6706. } else {
  6707. deferred.reject("Cannot authenticate via a web browser");
  6708. }
  6709. return deferred.promise;
  6710. },
  6711.  
  6712. /*
  6713. * Sign into the Instagram service
  6714. *
  6715. * @param string clientId
  6716. * @param array appScope
  6717. * @param object options
  6718. * @return promise
  6719. */
  6720. instagram: function(clientId, appScope, options) {
  6721. var deferred = $q.defer();
  6722.  
  6723. var split_tokens = {
  6724. 'code':'?',
  6725. 'token':'#'
  6726. };
  6727.  
  6728. if(window.cordova) {
  6729. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6730. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6731. var redirect_uri = "http://localhost/callback";
  6732. var response_type = "token";
  6733. if(options !== undefined) {
  6734. if(options.hasOwnProperty("redirect_uri")) {
  6735. redirect_uri = options.redirect_uri;
  6736. }
  6737. if(options.hasOwnProperty("response_type")) {
  6738. response_type = options.response_type;
  6739. }
  6740. }
  6741.  
  6742. var browserRef = window.open('https://api.instagram.com/oauth/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type='+response_type, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6743. browserRef.addEventListener('loadstart', function(event) {
  6744. if((event.url).indexOf(redirect_uri) === 0) {
  6745. browserRef.removeEventListener("exit",function(event){});
  6746. browserRef.close();
  6747. var callbackResponse = (event.url).split(split_tokens[response_type])[1];
  6748. var parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
  6749. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  6750. deferred.resolve({ access_token: parameterMap.access_token });
  6751. } else if(parameterMap.code !== undefined && parameterMap.code !== null) {
  6752. deferred.resolve({ code: parameterMap.code });
  6753. } else {
  6754. deferred.reject("Problem authenticating");
  6755. }
  6756. }
  6757. });
  6758. browserRef.addEventListener('exit', function(event) {
  6759. deferred.reject("The sign in flow was canceled");
  6760. });
  6761. } else {
  6762. deferred.reject("Could not find InAppBrowser plugin");
  6763. }
  6764. } else {
  6765. deferred.reject("Cannot authenticate via a web browser");
  6766. }
  6767. return deferred.promise;
  6768. },
  6769.  
  6770. /*
  6771. * Sign into the Box service
  6772. *
  6773. * @param string clientId
  6774. * @param string clientSecret
  6775. * @param string appState
  6776. * @param object options
  6777. * @return promise
  6778. */
  6779. box: function(clientId, clientSecret, appState, options) {
  6780. var deferred = $q.defer();
  6781. if(window.cordova) {
  6782. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6783. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6784. var redirect_uri = "http://localhost/callback";
  6785. if(options !== undefined) {
  6786. if(options.hasOwnProperty("redirect_uri")) {
  6787. redirect_uri = options.redirect_uri;
  6788. }
  6789. }
  6790. var browserRef = window.open('https://app.box.com/api/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&state=' + appState + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6791. browserRef.addEventListener('loadstart', function(event) {
  6792. if((event.url).indexOf(redirect_uri) === 0) {
  6793. requestToken = (event.url).split("code=")[1];
  6794. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6795. $http({method: "post", url: "https://app.box.com/api/oauth2/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  6796. .success(function(data) {
  6797. deferred.resolve(data);
  6798. })
  6799. .error(function(data, status) {
  6800. deferred.reject("Problem authenticating");
  6801. })
  6802. .finally(function() {
  6803. setTimeout(function() {
  6804. browserRef.close();
  6805. }, 10);
  6806. });
  6807. }
  6808. });
  6809. browserRef.addEventListener('exit', function(event) {
  6810. deferred.reject("The sign in flow was canceled");
  6811. });
  6812. } else {
  6813. deferred.reject("Could not find InAppBrowser plugin");
  6814. }
  6815. } else {
  6816. deferred.reject("Cannot authenticate via a web browser");
  6817. }
  6818. return deferred.promise;
  6819. },
  6820.  
  6821. /*
  6822. * Sign into the Reddit service
  6823. *
  6824. * @param string clientId
  6825. * @param string clientSecret
  6826. * @param array appScope
  6827. * @param object options
  6828. * @return promise
  6829. */
  6830. reddit: function(clientId, clientSecret, appScope, compact, options) {
  6831. var deferred = $q.defer();
  6832. if(window.cordova) {
  6833. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6834. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6835. var redirect_uri = "http://localhost/callback";
  6836. if(options !== undefined) {
  6837. if(options.hasOwnProperty("redirect_uri")) {
  6838. redirect_uri = options.redirect_uri;
  6839. }
  6840. }
  6841. var browserRef = window.open('https://ssl.reddit.com/api/v1/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&duration=permanent&state=ngcordovaoauth&scope=' + appScope.join(",") + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6842. browserRef.addEventListener('loadstart', function(event) {
  6843. if((event.url).indexOf(redirect_uri) === 0) {
  6844. requestToken = (event.url).split("code=")[1];
  6845. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  6846. $http.defaults.headers.post.Authorization = 'Basic ' + btoa(clientId + ":" + clientSecret);
  6847. $http({method: "post", url: "https://ssl.reddit.com/api/v1/access_token", data: "redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  6848. .success(function(data) {
  6849. deferred.resolve(data);
  6850. })
  6851. .error(function(data, status) {
  6852. deferred.reject("Problem authenticating");
  6853. })
  6854. .finally(function() {
  6855. setTimeout(function() {
  6856. browserRef.close();
  6857. }, 10);
  6858. });
  6859. }
  6860. });
  6861. browserRef.addEventListener('exit', function(event) {
  6862. deferred.reject("The sign in flow was canceled");
  6863. });
  6864. } else {
  6865. deferred.reject("Could not find InAppBrowser plugin");
  6866. }
  6867. } else {
  6868. deferred.reject("Cannot authenticate via a web browser");
  6869. }
  6870. return deferred.promise;
  6871. },
  6872.  
  6873. /*
  6874. * Sign into the Twitter service
  6875. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  6876. *
  6877. * @param string clientId
  6878. * @param string clientSecret
  6879. * @return promise
  6880. */
  6881. twitter: function(clientId, clientSecret, options) {
  6882. var deferred = $q.defer();
  6883. if(window.cordova) {
  6884. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6885. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6886. var redirect_uri = "https://rails-tutorial-denialtorres.c9.io/";
  6887. if(options !== undefined) {
  6888. if(options.hasOwnProperty("redirect_uri")) {
  6889. redirect_uri = options.redirect_uri;
  6890. }
  6891. }
  6892.  
  6893. if(typeof jsSHA !== "undefined") {
  6894. var oauthObject = {
  6895. oauth_consumer_key: clientId,
  6896. oauth_nonce: $cordovaOauthUtility.createNonce(10),
  6897. oauth_signature_method: "HMAC-SHA1",
  6898. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  6899. oauth_version: "1.0"
  6900. };
  6901. var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/request_token", oauthObject, { oauth_callback: redirect_uri }, clientSecret);
  6902. $http({
  6903. method: "post",
  6904. url: "https://api.twitter.com/oauth/request_token",
  6905. headers: {
  6906. "Authorization": signatureObj.authorization_header,
  6907. "Content-Type": "application/x-www-form-urlencoded"
  6908. },
  6909. data: "oauth_callback=" + encodeURIComponent(redirect_uri)
  6910. })
  6911. .success(function(requestTokenResult) {
  6912. var requestTokenParameters = (requestTokenResult).split("&");
  6913. var parameterMap = {};
  6914. for(var i = 0; i < requestTokenParameters.length; i++) {
  6915. parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
  6916. }
  6917. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  6918. deferred.reject("Oauth request token was not received");
  6919. }
  6920. var browserRef = window.open('https://api.twitter.com/oauth/authenticate?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  6921. browserRef.addEventListener('loadstart', function(event) {
  6922. if((event.url).indexOf(redirect_uri) === 0) {
  6923. var callbackResponse = (event.url).split("?")[1];
  6924. var responseParameters = (callbackResponse).split("&");
  6925. var parameterMap = {};
  6926. for(var i = 0; i < responseParameters.length; i++) {
  6927. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  6928. }
  6929. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  6930. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  6931. }
  6932. delete oauthObject.oauth_signature;
  6933. oauthObject.oauth_token = parameterMap.oauth_token;
  6934. var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/access_token", oauthObject, { oauth_verifier: parameterMap.oauth_verifier }, clientSecret);
  6935. $http({
  6936. method: "post",
  6937. url: "https://api.twitter.com/oauth/access_token",
  6938. headers: {
  6939. "Authorization": signatureObj.authorization_header
  6940. },
  6941. params: {
  6942. "oauth_verifier": parameterMap.oauth_verifier
  6943. }
  6944. })
  6945. .success(function(result) {
  6946. var accessTokenParameters = result.split("&");
  6947. var parameterMap = {};
  6948. for(var i = 0; i < accessTokenParameters.length; i++) {
  6949. parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
  6950. }
  6951. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  6952. deferred.reject("Oauth access token was not received");
  6953. }
  6954. deferred.resolve(parameterMap);
  6955. })
  6956. .error(function(error) {
  6957. deferred.reject(error);
  6958. })
  6959. .finally(function() {
  6960. setTimeout(function() {
  6961. browserRef.close();
  6962. }, 10);
  6963. });
  6964. }
  6965. });
  6966. browserRef.addEventListener('exit', function(event) {
  6967. deferred.reject("The sign in flow was canceled");
  6968. });
  6969. })
  6970. .error(function(error) {
  6971. deferred.reject(error);
  6972. });
  6973. } else {
  6974. deferred.reject("Missing jsSHA JavaScript library");
  6975. }
  6976. } else {
  6977. deferred.reject("Could not find InAppBrowser plugin");
  6978. }
  6979. } else {
  6980. deferred.reject("Cannot authenticate via a web browser");
  6981. }
  6982. return deferred.promise;
  6983. },
  6984.  
  6985. /*
  6986. * Sign into the Meetup service
  6987. *
  6988. * @param string clientId
  6989. * @param object options
  6990. * @return promise
  6991. */
  6992. meetup: function(clientId, options) {
  6993. var deferred = $q.defer();
  6994. if(window.cordova) {
  6995. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  6996. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  6997. var redirect_uri = "http://localhost/callback";
  6998. if(options !== undefined) {
  6999. if(options.hasOwnProperty("redirect_uri")) {
  7000. redirect_uri = options.redirect_uri;
  7001. }
  7002. }
  7003. var browserRef = window.open('https://secure.meetup.com/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7004. browserRef.addEventListener('loadstart', function(event) {
  7005. if((event.url).indexOf(redirect_uri) === 0) {
  7006. browserRef.removeEventListener("exit",function(event){});
  7007. browserRef.close();
  7008. var callbackResponse = (event.url).split("#")[1];
  7009. var responseParameters = (callbackResponse).split("&");
  7010. var parameterMap = {};
  7011. for(var i = 0; i < responseParameters.length; i++) {
  7012. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7013. }
  7014. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7015. deferred.resolve(parameterMap);
  7016. } else {
  7017. deferred.reject("Problem authenticating");
  7018. }
  7019. }
  7020. });
  7021. browserRef.addEventListener('exit', function(event) {
  7022. deferred.reject("The sign in flow was canceled");
  7023. });
  7024. } else {
  7025. deferred.reject("Could not find InAppBrowser plugin");
  7026. }
  7027. } else {
  7028. deferred.reject("Cannot authenticate via a web browser");
  7029. }
  7030. return deferred.promise;
  7031. },
  7032.  
  7033. /*
  7034. * Sign into the Salesforce service
  7035. *
  7036. * Suggestion: use salesforce oauth with forcetk.js(as SDK)
  7037. *
  7038. * @param string loginUrl (such as: https://login.salesforce.com ; please notice community login)
  7039. * @param string clientId (copy from connection app info)
  7040. * @param string redirectUri (callback url in connection app info)
  7041. * @return promise
  7042. */
  7043. salesforce: function (loginUrl, clientId) {
  7044. var redirectUri = 'http://localhost/callback';
  7045. var getAuthorizeUrl = function (loginUrl, clientId, redirectUri) {
  7046. return loginUrl+'services/oauth2/authorize?display=touch'+
  7047. '&response_type=token&client_id='+escape(clientId)+
  7048. '&redirect_uri='+escape(redirectUri);
  7049. };
  7050. var startWith = function(string, str) {
  7051. return (string.substr(0, str.length) === str);
  7052. };
  7053. var deferred = $q.defer();
  7054. if(window.cordova) {
  7055. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7056. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7057. var browserRef = window.open(getAuthorizeUrl(loginUrl, clientId, redirectUri), "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  7058. browserRef.addEventListener("loadstart", function(event) {
  7059. if(startWith(event.url, redirectUri)) {
  7060. var oauthResponse = {};
  7061.  
  7062. var fragment = (event.url).split('#')[1];
  7063.  
  7064. if (fragment) {
  7065. var nvps = fragment.split('&');
  7066. for (var nvp in nvps) {
  7067. var parts = nvps[nvp].split('=');
  7068. oauthResponse[parts[0]] = unescape(parts[1]);
  7069. }
  7070. }
  7071.  
  7072. if (typeof oauthResponse === 'undefined' ||
  7073. typeof oauthResponse.access_token === 'undefined') {
  7074. deferred.reject("Problem authenticating");
  7075. } else {
  7076. deferred.resolve(oauthResponse);
  7077. }
  7078. setTimeout(function() {
  7079. browserRef.close();
  7080. }, 10);
  7081. }
  7082. });
  7083. browserRef.addEventListener('exit', function(event) {
  7084. deferred.reject("The sign in flow was canceled");
  7085. });
  7086. } else {
  7087. deferred.reject("Could not find InAppBrowser plugin");
  7088. }
  7089. } else {
  7090. deferred.reject("Cannot authenticate via a web browser");
  7091. }
  7092. return deferred.promise;
  7093. },
  7094.  
  7095. /*
  7096. * Sign into the Strava service
  7097. *
  7098. * @param string clientId
  7099. * @param string clientSecret
  7100. * @param array appScope
  7101. * @param object options
  7102. * @return promise
  7103. */
  7104. strava: function(clientId, clientSecret, appScope, options) {
  7105. var deferred = $q.defer();
  7106. if(window.cordova) {
  7107. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7108. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7109. var redirect_uri = "http://localhost/callback";
  7110. if(options !== undefined) {
  7111. if(options.hasOwnProperty("redirect_uri")) {
  7112. redirect_uri = options.redirect_uri;
  7113. }
  7114. }
  7115. var browserRef = window.open('https://www.strava.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(",") + '&response_type=code&approval_prompt=force', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7116. browserRef.addEventListener('loadstart', function(event) {
  7117. if((event.url).indexOf(redirect_uri) === 0) {
  7118. requestToken = (event.url).split("code=")[1];
  7119. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7120. $http({method: "post", url: "https://www.strava.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + requestToken })
  7121. .success(function(data) {
  7122. deferred.resolve(data);
  7123. })
  7124. .error(function(data, status) {
  7125. deferred.reject("Problem authenticating");
  7126. })
  7127. .finally(function() {
  7128. setTimeout(function() {
  7129. browserRef.close();
  7130. }, 10);
  7131. });
  7132. }
  7133. });
  7134. browserRef.addEventListener('exit', function(event) {
  7135. deferred.reject("The sign in flow was canceled");
  7136. });
  7137. } else {
  7138. deferred.reject("Could not find InAppBrowser plugin");
  7139. }
  7140. } else {
  7141. deferred.reject("Cannot authenticate via a web browser");
  7142. }
  7143. return deferred.promise;
  7144. },
  7145.  
  7146. /*
  7147. * Sign into the Withings service
  7148. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  7149. *
  7150. * @param string clientId
  7151. * @param string clientSecret
  7152. * @return promise
  7153. */
  7154. withings: function(clientId, clientSecret) {
  7155. var deferred = $q.defer();
  7156. if(window.cordova) {
  7157. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7158. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7159. if(typeof jsSHA !== "undefined") {
  7160.  
  7161. // Step 1 : get a oAuth "request token"
  7162. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  7163. oauthObject.oauth_callback = 'http://localhost/callback';
  7164.  
  7165. var requestTokenUrlBase = "https://oauth.withings.com/account/request_token";
  7166. var signatureObj = $cordovaOauthUtility.createSignature("GET", requestTokenUrlBase, {}, oauthObject, clientSecret);
  7167. oauthObject.oauth_signature = signatureObj.signature;
  7168.  
  7169. var requestTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  7170.  
  7171. $http({method: "get", url: requestTokenUrlBase + "?" + requestTokenParameters })
  7172. .success(function(requestTokenResult) {
  7173.  
  7174. // Step 2 : End-user authorization
  7175. var parameterMap = $cordovaOauthUtility.parseResponseParameters(requestTokenResult);
  7176. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  7177. deferred.reject("Oauth request token was not received");
  7178. }
  7179. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  7180. oauthObject.oauth_token = parameterMap.oauth_token;
  7181.  
  7182. // used in step 3
  7183. var oauthTokenSecret = parameterMap.oauth_token_secret;
  7184.  
  7185. var authorizeUrlBase = "https://oauth.withings.com/account/authorize";
  7186. var signatureObj = $cordovaOauthUtility.createSignature("GET", authorizeUrlBase, {}, oauthObject, clientSecret);
  7187. oauthObject.oauth_signature = signatureObj.signature;
  7188.  
  7189. var authorizeParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  7190. var browserRef = window.open(authorizeUrlBase + '?' + authorizeParameters, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7191.  
  7192. // STEP 3: User Data Access token
  7193. browserRef.addEventListener('loadstart', function(event) {
  7194. if((event.url).indexOf("http://localhost/callback") === 0) {
  7195. var callbackResponse = (event.url).split("?")[1];
  7196. parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
  7197. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  7198. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  7199. }
  7200.  
  7201. var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
  7202. oauthObject.oauth_token = parameterMap.oauth_token;
  7203.  
  7204. var accessTokenUrlBase = "https://oauth.withings.com/account/access_token";
  7205. var signatureObj = $cordovaOauthUtility.createSignature("GET", accessTokenUrlBase, {}, oauthObject, clientSecret, oauthTokenSecret);
  7206. oauthObject.oauth_signature = signatureObj.signature;
  7207.  
  7208. var accessTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
  7209.  
  7210. $http({method: "get", url: accessTokenUrlBase + '?' + accessTokenParameters})
  7211. .success(function(result) {
  7212. var parameterMap = $cordovaOauthUtility.parseResponseParameters(result);
  7213. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  7214. deferred.reject("Oauth access token was not received");
  7215. }
  7216. deferred.resolve(parameterMap);
  7217. })
  7218. .error(function(error) {
  7219. deferred.reject(error);
  7220. })
  7221. .finally(function() {
  7222. setTimeout(function() {
  7223. browserRef.close();
  7224. }, 10);
  7225. });
  7226. }
  7227. });
  7228. browserRef.addEventListener('exit', function(event) {
  7229. deferred.reject("The sign in flow was canceled");
  7230. });
  7231. })
  7232. .error(function(error) {
  7233. deferred.reject(error);
  7234. });
  7235. } else {
  7236. deferred.reject("Missing jsSHA JavaScript library");
  7237. }
  7238. } else {
  7239. deferred.reject("Could not find InAppBrowser plugin");
  7240. }
  7241. } else {
  7242. deferred.reject("Cannot authenticate via a web browser");
  7243. }
  7244. return deferred.promise;
  7245. },
  7246.  
  7247. /*
  7248. * Sign into the Foursquare service
  7249. *
  7250. * @param string clientId
  7251. * @param object options
  7252. * @return promise
  7253. */
  7254. foursquare: function(clientId, options) {
  7255. var deferred = $q.defer();
  7256. if (window.cordova) {
  7257. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7258. if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7259. var redirect_uri = "http://localhost/callback";
  7260. if(options !== undefined) {
  7261. if(options.hasOwnProperty("redirect_uri")) {
  7262. redirect_uri = options.redirect_uri;
  7263. }
  7264. }
  7265. var browserRef = window.open('https://foursquare.com/oauth2/authenticate?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7266. browserRef.addEventListener('loadstart', function (event) {
  7267. if ((event.url).indexOf(redirect_uri) === 0) {
  7268. browserRef.removeEventListener("exit",function(event){});
  7269. browserRef.close();
  7270. var callbackResponse = (event.url).split("#")[1];
  7271. var responseParameters = (callbackResponse).split("&");
  7272. var parameterMap = [];
  7273. for (var i = 0; i < responseParameters.length; i++) {
  7274. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7275. }
  7276. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7277. var promiseResponse = {
  7278. access_token: parameterMap.access_token,
  7279. expires_in: parameterMap.expires_in
  7280. };
  7281. deferred.resolve(promiseResponse);
  7282. } else {
  7283. deferred.reject("Problem authenticating");
  7284. }
  7285. }
  7286. });
  7287. browserRef.addEventListener('exit', function(event) {
  7288. deferred.reject("The sign in flow was canceled");
  7289. });
  7290. } else {
  7291. deferred.reject("Could not find InAppBrowser plugin");
  7292. }
  7293. } else {
  7294. deferred.reject("Cannot authenticate via a web browser");
  7295. }
  7296. return deferred.promise;
  7297. },
  7298.  
  7299. /*
  7300. * Sign into the Magento service
  7301. * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
  7302. *
  7303. * @param string baseUrl
  7304. * @param string clientId
  7305. * @param string clientSecret
  7306. * @return promise
  7307. */
  7308. magento: function(baseUrl, clientId, clientSecret) {
  7309. var deferred = $q.defer();
  7310. if(window.cordova) {
  7311. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7312. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7313. if(typeof jsSHA !== "undefined") {
  7314. var oauthObject = {
  7315. oauth_callback: "http://localhost/callback",
  7316. oauth_consumer_key: clientId,
  7317. oauth_nonce: $cordovaOauthUtility.createNonce(5),
  7318. oauth_signature_method: "HMAC-SHA1",
  7319. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  7320. oauth_version: "1.0"
  7321. };
  7322. var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/initiate", oauthObject, { oauth_callback: "http://localhost/callback" }, clientSecret);
  7323. $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
  7324. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7325. $http({method: "post", url: baseUrl + "/oauth/initiate", data: "oauth_callback=http://localhost/callback" })
  7326. .success(function(requestTokenResult) {
  7327. var requestTokenParameters = (requestTokenResult).split("&");
  7328. var parameterMap = {};
  7329. for(var i = 0; i < requestTokenParameters.length; i++) {
  7330. parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
  7331. }
  7332. if(parameterMap.hasOwnProperty("oauth_token") === false) {
  7333. deferred.reject("Oauth request token was not received");
  7334. }
  7335. var tokenSecret = parameterMap.oauth_token_secret;
  7336. var browserRef = window.open(baseUrl + '/oauth/authorize?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7337. browserRef.addEventListener('loadstart', function(event) {
  7338. if((event.url).indexOf("http://localhost/callback") === 0) {
  7339. var callbackResponse = (event.url).split("?")[1];
  7340. var responseParameters = (callbackResponse).split("&");
  7341. var parameterMap = {};
  7342. for(var i = 0; i < responseParameters.length; i++) {
  7343. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7344. }
  7345. if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
  7346. deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
  7347. }
  7348. delete oauthObject.oauth_signature;
  7349. delete oauthObject.oauth_callback;
  7350. oauthObject.oauth_token = parameterMap.oauth_token;
  7351. oauthObject.oauth_nonce = $cordovaOauthUtility.createNonce(5);
  7352. oauthObject.oauth_verifier = parameterMap.oauth_verifier;
  7353. var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/token", oauthObject, {}, clientSecret, tokenSecret);
  7354. $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
  7355. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7356. $http({method: "post", url: baseUrl + "/oauth/token" })
  7357. .success(function(result) {
  7358. var accessTokenParameters = result.split("&");
  7359. var parameterMap = {};
  7360. for(var i = 0; i < accessTokenParameters.length; i++) {
  7361. parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
  7362. }
  7363. if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
  7364. deferred.reject("Oauth access token was not received");
  7365. }
  7366. deferred.resolve(parameterMap);
  7367. })
  7368. .error(function(error) {
  7369. deferred.reject(error);
  7370. })
  7371. .finally(function() {
  7372. setTimeout(function() {
  7373. browserRef.close();
  7374. }, 10);
  7375. });
  7376. }
  7377. });
  7378. browserRef.addEventListener('exit', function(event) {
  7379. deferred.reject("The sign in flow was canceled");
  7380. });
  7381. })
  7382. .error(function(error) {
  7383. deferred.reject(error);
  7384. });
  7385. } else {
  7386. deferred.reject("Missing jsSHA JavaScript library");
  7387. }
  7388. } else {
  7389. deferred.reject("Could not find InAppBrowser plugin");
  7390. }
  7391. } else {
  7392. deferred.reject("Cannot authenticate via a web browser");
  7393. }
  7394. return deferred.promise;
  7395. },
  7396.  
  7397. /*
  7398. * Sign into the Vkontakte service
  7399. *
  7400. * @param string clientId
  7401. * @param array appScope (for example: "friends,wall,photos,messages")
  7402. * @return promise
  7403. */
  7404. vkontakte: function(clientId, appScope) {
  7405. var deferred = $q.defer();
  7406. if(window.cordova) {
  7407. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7408. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7409. var browserRef = window.open('https://oauth.vk.com/authorize?client_id=' + clientId + '&redirect_uri=http://oauth.vk.com/blank.html&response_type=token&scope=' + appScope.join(",") + '&display=touch&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7410. browserRef.addEventListener('loadstart', function(event) {
  7411. var tmp = (event.url).split("#");
  7412. if (tmp[0] == 'https://oauth.vk.com/blank.html' || tmp[0] == 'http://oauth.vk.com/blank.html') {
  7413. browserRef.removeEventListener("exit",function(event){});
  7414. browserRef.close();
  7415. var callbackResponse = (event.url).split("#")[1];
  7416. var responseParameters = (callbackResponse).split("&");
  7417. var parameterMap = [];
  7418. for(var i = 0; i < responseParameters.length; i++) {
  7419. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7420. }
  7421. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7422. var output = { access_token: parameterMap.access_token, expires_in: parameterMap.expires_in };
  7423. if(parameterMap.email !== undefined && parameterMap.email !== null){
  7424. output.email = parameterMap.email;
  7425. }
  7426. deferred.resolve(output);
  7427. } else {
  7428. deferred.reject("Problem authenticating");
  7429. }
  7430. }
  7431. });
  7432. browserRef.addEventListener('exit', function(event) {
  7433. deferred.reject("The sign in flow was canceled");
  7434. });
  7435. } else {
  7436. deferred.reject("Could not find InAppBrowser plugin");
  7437. }
  7438. } else {
  7439. deferred.reject("Cannot authenticate via a web browser");
  7440. }
  7441. return deferred.promise;
  7442. },
  7443.  
  7444. /*
  7445. * Sign into the Odnoklassniki service
  7446. *
  7447. * @param string clientId
  7448. * @param array appScope (for example: "VALUABLE_ACCESS ,GROUP_CONTENT,VIDEO_CONTENT")
  7449. * @return promise
  7450. */
  7451. odnoklassniki: function (clientId, appScope)
  7452. {
  7453. var deferred = $q.defer();
  7454. if (window.cordova)
  7455. {
  7456. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7457. if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true)
  7458. {
  7459. var browserRef = window.open('http://www.odnoklassniki.ru/oauth/authorize?client_id=' + clientId + '&scope=' + appScope.join(",") + '&response_type=token&redirect_uri=http://localhost/callback' + '&layout=m', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7460. browserRef.addEventListener('loadstart', function (event)
  7461. {
  7462. if ((event.url).indexOf("http://localhost/callback") === 0)
  7463. {
  7464. var callbackResponse = (event.url).split("#")[1];
  7465. var responseParameters = (callbackResponse).split("&");
  7466. var parameterMap = [];
  7467. for (var i = 0; i < responseParameters.length; i++)
  7468. {
  7469. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7470. }
  7471. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null)
  7472. {
  7473. deferred.resolve({ access_token: parameterMap.access_token, session_secret_key: parameterMap.session_secret_key });
  7474. } else
  7475. {
  7476. deferred.reject("Problem authenticating");
  7477. }
  7478. setTimeout(function ()
  7479. {
  7480. browserRef.close();
  7481. }, 10);
  7482. }
  7483. });
  7484. browserRef.addEventListener('exit', function (event)
  7485. {
  7486. deferred.reject("The sign in flow was canceled");
  7487. });
  7488. } else
  7489. {
  7490. deferred.reject("Could not find InAppBrowser plugin");
  7491. }
  7492. } else
  7493. {
  7494. deferred.reject("Cannot authenticate via a web browser");
  7495. }
  7496. return deferred.promise;
  7497. },
  7498.  
  7499.  
  7500. /*
  7501. * Sign into the Imgur service
  7502. *
  7503. * @param string clientId
  7504. * @param object options
  7505. * @return promise
  7506. */
  7507. imgur: function(clientId, options) {
  7508. var deferred = $q.defer();
  7509. if(window.cordova) {
  7510. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7511. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7512. var redirect_uri = "http://localhost/callback";
  7513. if(options !== undefined) {
  7514. if(options.hasOwnProperty("redirect_uri")) {
  7515. redirect_uri = options.redirect_uri;
  7516. }
  7517. }
  7518. var browserRef = window.open('https://api.imgur.com/oauth2/authorize?client_id=' + clientId + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7519. browserRef.addEventListener('loadstart', function(event) {
  7520. if((event.url).indexOf(redirect_uri) === 0) {
  7521. browserRef.removeEventListener("exit",function(event){});
  7522. browserRef.close();
  7523. var callbackResponse = (event.url).split("#")[1];
  7524. var responseParameters = (callbackResponse).split("&");
  7525. var parameterMap = [];
  7526. for(var i = 0; i < responseParameters.length; i++) {
  7527. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7528. }
  7529. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7530. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
  7531. } else {
  7532. deferred.reject("Problem authenticating");
  7533. }
  7534. }
  7535. });
  7536. browserRef.addEventListener('exit', function(event) {
  7537. deferred.reject("The sign in flow was canceled");
  7538. });
  7539. } else {
  7540. deferred.reject("Could not find InAppBrowser plugin");
  7541. }
  7542. } else {
  7543. deferred.reject("Cannot authenticate via a web browser");
  7544. }
  7545. return deferred.promise;
  7546. },
  7547.  
  7548. /*
  7549. * Sign into the Spotify service
  7550. *
  7551. * @param string clientId
  7552. * @param object options
  7553. * @return promise
  7554. */
  7555. spotify: function(clientId, appScope, options) {
  7556. var deferred = $q.defer();
  7557. if(window.cordova) {
  7558. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7559. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7560. var redirect_uri = "http://localhost/callback";
  7561. if(options !== undefined) {
  7562. if(options.hasOwnProperty("redirect_uri")) {
  7563. redirect_uri = options.redirect_uri;
  7564. }
  7565. }
  7566. var browserRef = window.open('https://accounts.spotify.com/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7567. browserRef.addEventListener('loadstart', function(event) {
  7568. if((event.url).indexOf(redirect_uri) === 0) {
  7569. browserRef.removeEventListener("exit",function(event){});
  7570. browserRef.close();
  7571. var callbackResponse = (event.url).split("#")[1];
  7572. var responseParameters = (callbackResponse).split("&");
  7573. var parameterMap = [];
  7574. for(var i = 0; i < responseParameters.length; i++) {
  7575. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7576. }
  7577. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7578. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
  7579. } else {
  7580. deferred.reject("Problem authenticating");
  7581. }
  7582. }
  7583. });
  7584. browserRef.addEventListener('exit', function(event) {
  7585. deferred.reject("The sign in flow was canceled");
  7586. });
  7587. } else {
  7588. deferred.reject("Could not find InAppBrowser plugin");
  7589. }
  7590. } else {
  7591. deferred.reject("Cannot authenticate via a web browser");
  7592. }
  7593. return deferred.promise;
  7594. },
  7595.  
  7596. /*
  7597. * Sign into the Uber service
  7598. *
  7599. * @param string clientId
  7600. * @param appScope array
  7601. * @param object options
  7602. * @return promise
  7603. */
  7604. uber: function(clientId, appScope, options) {
  7605. var deferred = $q.defer();
  7606. if(window.cordova) {
  7607. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7608. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7609. var redirect_uri = "http://localhost/callback";
  7610. if(options !== undefined) {
  7611. if(options.hasOwnProperty("redirect_uri")) {
  7612. redirect_uri = options.redirect_uri;
  7613. }
  7614. }
  7615. var browserRef = window.open('https://login.uber.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7616. browserRef.addEventListener('loadstart', function(event) {
  7617. if((event.url).indexOf(redirect_uri) === 0) {
  7618. browserRef.removeEventListener("exit",function(event){});
  7619. browserRef.close();
  7620. var callbackResponse = (event.url).split("#")[1];
  7621. var responseParameters = (callbackResponse).split("&");
  7622. var parameterMap = [];
  7623. for(var i = 0; i < responseParameters.length; i++) {
  7624. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7625. }
  7626. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7627. deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in, scope: parameterMap.scope });
  7628. } else {
  7629. deferred.reject("Problem authenticating");
  7630. }
  7631. }
  7632. });
  7633. browserRef.addEventListener('exit', function(event) {
  7634. deferred.reject("The sign in flow was canceled");
  7635. });
  7636. } else {
  7637. deferred.reject("Could not find InAppBrowser plugin");
  7638. }
  7639. } else {
  7640. deferred.reject("Cannot authenticate via a web browser");
  7641. }
  7642. return deferred.promise;
  7643. },
  7644.  
  7645. /*
  7646. * Sign into the Windows Live Connect service
  7647. *
  7648. * @param string clientId
  7649. * @param array appScope
  7650. * @param object options
  7651. * @return promise
  7652. */
  7653. windowsLive: function (clientId, appScope, options) {
  7654. var deferred = $q.defer();
  7655. if(window.cordova) {
  7656. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7657. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7658. var redirect_uri = "https://login.live.com/oauth20_desktop.srf";
  7659. if(options !== undefined) {
  7660. if(options.hasOwnProperty("redirect_uri")) {
  7661. redirect_uri = options.redirect_uri;
  7662. }
  7663. }
  7664. var browserRef = window.open('https://login.live.com/oauth20_authorize.srf?client_id=' + clientId + "&scope=" + appScope.join(",") + '&response_type=token&display=touch' + '&redirect_uri=' + redirect_uri, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7665. browserRef.addEventListener('loadstart', function (event) {
  7666. if((event.url).indexOf(redirect_uri) === 0) {
  7667. browserRef.removeEventListener("exit", function (event) { });
  7668. browserRef.close();
  7669. var callbackResponse = (event.url).split("#")[1];
  7670. var responseParameters = (callbackResponse).split("&");
  7671. var parameterMap = [];
  7672. for (var i = 0; i < responseParameters.length; i++) {
  7673. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7674. }
  7675. if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7676. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  7677. } else {
  7678. deferred.reject("Problem authenticating");
  7679. }
  7680. }
  7681. });
  7682. browserRef.addEventListener('exit', function (event) {
  7683. deferred.reject("The sign in flow was canceled");
  7684. });
  7685. } else {
  7686. deferred.reject("Could not find InAppBrowser plugin");
  7687. }
  7688. } else {
  7689. deferred.reject("Cannot authenticate via a web browser");
  7690. }
  7691. return deferred.promise;
  7692. },
  7693.  
  7694. /*
  7695. * Sign into the Yammer service
  7696. *
  7697. * @param string clientId
  7698. * @param object options
  7699. * @return promise
  7700. */
  7701. yammer: function(clientId, options) {
  7702. var deferred = $q.defer();
  7703. if(window.cordova) {
  7704. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7705. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7706. var redirect_uri = "http://localhost/callback";
  7707. if(options !== undefined) {
  7708. if(options.hasOwnProperty("redirect_uri")) {
  7709. redirect_uri = options.redirect_uri;
  7710. }
  7711. }
  7712. var browserRef = window.open('https://www.yammer.com/dialog/oauth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7713. browserRef.addEventListener('loadstart', function(event) {
  7714. if((event.url).indexOf(redirect_uri) === 0) {
  7715. browserRef.removeEventListener("exit",function(event){});
  7716. browserRef.close();
  7717. var callbackResponse = (event.url).split("#")[1];
  7718. var responseParameters = (callbackResponse).split("&");
  7719. var parameterMap = [];
  7720. for(var i = 0; i < responseParameters.length; i++) {
  7721. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7722. }
  7723. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7724. deferred.resolve({ access_token: parameterMap.access_token });
  7725. } else {
  7726. deferred.reject("Problem authenticating");
  7727. }
  7728. }
  7729. });
  7730. browserRef.addEventListener('exit', function(event) {
  7731. deferred.reject("The sign in flow was canceled");
  7732. });
  7733. } else {
  7734. deferred.reject("Could not find InAppBrowser plugin");
  7735. }
  7736. } else {
  7737. deferred.reject("Cannot authenticate via a web browser");
  7738. }
  7739. return deferred.promise;
  7740. },
  7741.  
  7742. /*
  7743. * Sign into the Venmo service
  7744. *
  7745. * @param string clientId
  7746. * @param array appScope
  7747. * @param object options
  7748. * @return promise
  7749. */
  7750. venmo: function(clientId, appScope, options) {
  7751. var deferred = $q.defer();
  7752. if(window.cordova) {
  7753. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7754. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7755. var redirect_uri = "http://localhost/callback";
  7756. if(options !== undefined) {
  7757. if(options.hasOwnProperty("redirect_uri")) {
  7758. redirect_uri = options.redirect_uri;
  7759. }
  7760. }
  7761. var browserRef = window.open('https://api.venmo.com/v1/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7762. browserRef.addEventListener('loadstart', function(event) {
  7763. if((event.url).indexOf(redirect_uri) === 0) {
  7764. browserRef.removeEventListener("exit",function(event){});
  7765. browserRef.close();
  7766. var callbackResponse = (event.url).split("#")[1];
  7767. var responseParameters = (callbackResponse).split("&");
  7768. var parameterMap = [];
  7769. for(var i = 0; i < responseParameters.length; i++) {
  7770. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7771. }
  7772. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7773. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  7774. } else {
  7775. deferred.reject("Problem authenticating");
  7776. }
  7777. }
  7778. });
  7779. browserRef.addEventListener('exit', function(event) {
  7780. deferred.reject("The sign in flow was canceled");
  7781. });
  7782. } else {
  7783. deferred.reject("Could not find InAppBrowser plugin");
  7784. }
  7785. } else {
  7786. deferred.reject("Cannot authenticate via a web browser");
  7787. }
  7788. return deferred.promise;
  7789. },
  7790.  
  7791. /*
  7792. * Sign into the Stripe service
  7793. *
  7794. * @param string clientId
  7795. * @param string clientSecret
  7796. * @param string appScope
  7797. * @param object options
  7798. * @return promise
  7799. */
  7800. stripe: function(clientId, clientSecret, appScope, options) {
  7801. var deferred = $q.defer();
  7802. if(window.cordova) {
  7803. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7804. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7805. var redirect_uri = "http://localhost/callback";
  7806. if(options !== undefined) {
  7807. if(options.hasOwnProperty("redirect_uri")) {
  7808. redirect_uri = options.redirect_uri;
  7809. }
  7810. }
  7811. var browserRef = window.open('https://connect.stripe.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7812. browserRef.addEventListener('loadstart', function(event) {
  7813. if((event.url).indexOf("http://localhost/callback") === 0) {
  7814. requestToken = (event.url).split("code=")[1];
  7815. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7816. $http({method: "post", url: "https://connect.stripe.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  7817. .success(function(data) {
  7818. deferred.resolve(data);
  7819. })
  7820. .error(function(data, status) {
  7821. deferred.reject("Problem authenticating");
  7822. })
  7823. .finally(function() {
  7824. setTimeout(function() {
  7825. browserRef.close();
  7826. }, 10);
  7827. });
  7828. }
  7829. });
  7830. browserRef.addEventListener('exit', function(event) {
  7831. deferred.reject("The sign in flow was canceled");
  7832. });
  7833. } else {
  7834. deferred.reject("Could not find InAppBrowser plugin");
  7835. }
  7836. } else {
  7837. deferred.reject("Cannot authenticate via a web browser");
  7838. }
  7839. return deferred.promise;
  7840. },
  7841.  
  7842. /*
  7843. * Sign into the Rally service
  7844. *
  7845. * @param string clientId
  7846. * @param string clientSecret
  7847. * @param string appScope
  7848. * @param object options
  7849. * @return promise
  7850. */
  7851. rally: function(clientId, clientSecret, appScope, options) {
  7852. var deferred = $q.defer();
  7853. if(window.cordova) {
  7854. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7855. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7856. var redirect_uri = "http://localhost/callback";
  7857. if(options !== undefined) {
  7858. if(options.hasOwnProperty("redirect_uri")) {
  7859. redirect_uri = options.redirect_uri;
  7860. }
  7861. }
  7862. var browserRef = window.open('https://rally1.rallydev.com/login/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7863. browserRef.addEventListener('loadstart', function(event) {
  7864. if((event.url).indexOf("http://localhost/callback") === 0) {
  7865. requestToken = (event.url).split("code=")[1];
  7866. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7867. $http({method: "post", url: "https://rally1.rallydev.com/login/oauth2/auth", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
  7868. .success(function(data) {
  7869. deferred.resolve(data);
  7870. })
  7871. .error(function(data, status) {
  7872. deferred.reject("Problem authenticating");
  7873. })
  7874. .finally(function() {
  7875. setTimeout(function() {
  7876. browserRef.close();
  7877. }, 10);
  7878. });
  7879. }
  7880. });
  7881. browserRef.addEventListener('exit', function(event) {
  7882. deferred.reject("The sign in flow was canceled");
  7883. });
  7884. } else {
  7885. deferred.reject("Could not find InAppBrowser plugin");
  7886. }
  7887. } else {
  7888. deferred.reject("Cannot authenticate via a web browser");
  7889. }
  7890. return deferred.promise;
  7891. },
  7892.  
  7893. /*
  7894. * Sign into the FamilySearch service
  7895. *
  7896. * @param string clientId
  7897. * @param object options
  7898. * @return promise
  7899. */
  7900. familySearch: function(clientId, state, options) {
  7901. var deferred = $q.defer();
  7902. if(window.cordova) {
  7903. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7904. if(cordovaMetadata.hasOwnProperty("cordova-plugin-inappbrowser") === true) {
  7905. var redirect_uri = "http://localhost/callback";
  7906. if(options !== undefined) {
  7907. if(options.hasOwnProperty("redirect_uri")) {
  7908. redirect_uri = options.redirect_uri;
  7909. }
  7910. }
  7911. var browserRef = window.open("https://ident.familysearch.org/cis-web/oauth2/v3/authorization?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&state=" + state, "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
  7912. browserRef.addEventListener("loadstart", function(event) {
  7913. if((event.url).indexOf(redirect_uri) === 0) {
  7914. var requestToken = (event.url).split("code=")[1];
  7915. $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  7916. $http({method: "post", url: "https://ident.familysearch.org/cis-web/oauth2/v3/token", data: "client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code&code=" + requestToken })
  7917. .success(function(data) {
  7918. deferred.resolve(data);
  7919. })
  7920. .error(function(data, status) {
  7921. deferred.reject("Problem authenticating");
  7922. })
  7923. .finally(function() {
  7924. setTimeout(function() {
  7925. browserRef.close();
  7926. }, 10);
  7927. });
  7928. }
  7929. });
  7930. browserRef.addEventListener('exit', function(event) {
  7931. deferred.reject("The sign in flow was canceled");
  7932. });
  7933. } else {
  7934. deferred.reject("Could not find InAppBrowser plugin");
  7935. }
  7936. } else {
  7937. deferred.reject("Cannot authenticate via a web browser");
  7938. }
  7939. return deferred.promise;
  7940. },
  7941.  
  7942. /*
  7943. * Sign into the Envato service
  7944. *
  7945. * @param string clientId
  7946. * @param object options
  7947. * @return promise
  7948. */
  7949. envato: function(clientId, options) {
  7950. var deferred = $q.defer();
  7951. if(window.cordova) {
  7952. var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
  7953. if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
  7954. var redirect_uri = "http://localhost/callback";
  7955. if(options !== undefined) {
  7956. if(options.hasOwnProperty("redirect_uri")) {
  7957. redirect_uri = options.redirect_uri;
  7958. }
  7959. }
  7960. var browserRef = window.open('https://api.envato.com/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
  7961. browserRef.addEventListener('loadstart', function(event) {
  7962. if((event.url).indexOf(redirect_uri) === 0) {
  7963. browserRef.removeEventListener("exit",function(event){});
  7964. browserRef.close();
  7965. var callbackResponse = (event.url).split("#")[1];
  7966. var responseParameters = (callbackResponse).split("&");
  7967. var parameterMap = [];
  7968. for(var i = 0; i < responseParameters.length; i++) {
  7969. parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
  7970. }
  7971. if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
  7972. deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
  7973. } else {
  7974. deferred.reject("Problem authenticating");
  7975. }
  7976. }
  7977. });
  7978. browserRef.addEventListener('exit', function(event) {
  7979. deferred.reject("The sign in flow was canceled");
  7980. });
  7981. } else {
  7982. deferred.reject("Could not find InAppBrowser plugin");
  7983. }
  7984. } else {
  7985. deferred.reject("Cannot authenticate via a web browser");
  7986. }
  7987. return deferred.promise;
  7988. }
  7989.  
  7990. };
  7991.  
  7992. }]);
  7993.  
  7994. /*
  7995. * Cordova AngularJS Oauth
  7996. *
  7997. * Created by Nic Raboy
  7998. * http://www.nraboy.com
  7999. *
  8000. *
  8001. *
  8002. * DESCRIPTION:
  8003. *
  8004. * Use Oauth sign in for various web services.
  8005. *
  8006. *
  8007. * REQUIRES:
  8008. *
  8009. * Apache Cordova 3.5+
  8010. * Apache InAppBrowser Plugin
  8011. * Apache Cordova Whitelist Plugin
  8012. *
  8013. *
  8014. * SUPPORTS:
  8015. *
  8016. * Dropbox
  8017. * Digital Ocean
  8018. * Google
  8019. * GitHub
  8020. * Facebook
  8021. * LinkedIn
  8022. * Instagram
  8023. * Box
  8024. * Reddit
  8025. * Twitter
  8026. * Meetup
  8027. * Salesforce
  8028. * Strava
  8029. * Withings
  8030. * Foursquare
  8031. * Magento
  8032. * vkontakte
  8033. * Odnoklassniki
  8034. * ADFS
  8035. * Imgur
  8036. * Spotify
  8037. * Uber
  8038. * Windows Live Connect
  8039. * Yammer
  8040. * Venmo
  8041. * Stripe
  8042. * Rally
  8043. * Family Search
  8044. * Envato
  8045. */
  8046.  
  8047. angular.module("ngCordovaOauth", [
  8048. "oauth.providers",
  8049. "oauth.utils"
  8050. ]);
  8051.  
  8052. angular.module("oauth.utils", [])
  8053.  
  8054. .factory("$cordovaOauthUtility", ["$q", function($q) {
  8055.  
  8056. return {
  8057.  
  8058. /*
  8059. * Check to see if the mandatory InAppBrowser plugin is installed
  8060. *
  8061. * @param
  8062. * @return boolean
  8063. */
  8064. isInAppBrowserInstalled: function(cordovaMetadata) {
  8065. var inAppBrowserNames = ["cordova-plugin-inappbrowser", "org.apache.cordova.inappbrowser"];
  8066.  
  8067. return inAppBrowserNames.some(function(name) {
  8068. return cordovaMetadata.hasOwnProperty(name);
  8069. });
  8070. },
  8071.  
  8072. /*
  8073. * Sign an Oauth 1.0 request
  8074. *
  8075. * @param string method
  8076. * @param string endPoint
  8077. * @param object headerParameters
  8078. * @param object bodyParameters
  8079. * @param string secretKey
  8080. * @param string tokenSecret (optional)
  8081. * @return object
  8082. */
  8083. createSignature: function(method, endPoint, headerParameters, bodyParameters, secretKey, tokenSecret) {
  8084. if(typeof jsSHA !== "undefined") {
  8085. var headerAndBodyParameters = angular.copy(headerParameters);
  8086. var bodyParameterKeys = Object.keys(bodyParameters);
  8087. for(var i = 0; i < bodyParameterKeys.length; i++) {
  8088. headerAndBodyParameters[bodyParameterKeys[i]] = encodeURIComponent(bodyParameters[bodyParameterKeys[i]]);
  8089. }
  8090. var signatureBaseString = method + "&" + encodeURIComponent(endPoint) + "&";
  8091. var headerAndBodyParameterKeys = (Object.keys(headerAndBodyParameters)).sort();
  8092. for(i = 0; i < headerAndBodyParameterKeys.length; i++) {
  8093. if(i == headerAndBodyParameterKeys.length - 1) {
  8094. signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]]);
  8095. } else {
  8096. signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]] + "&");
  8097. }
  8098. }
  8099. var oauthSignatureObject = new jsSHA(signatureBaseString, "TEXT");
  8100.  
  8101. var encodedTokenSecret = '';
  8102. if (tokenSecret) {
  8103. encodedTokenSecret = encodeURIComponent(tokenSecret);
  8104. }
  8105.  
  8106. headerParameters.oauth_signature = encodeURIComponent(oauthSignatureObject.getHMAC(encodeURIComponent(secretKey) + "&" + encodedTokenSecret, "TEXT", "SHA-1", "B64"));
  8107. var headerParameterKeys = Object.keys(headerParameters);
  8108. var authorizationHeader = 'OAuth ';
  8109. for(i = 0; i < headerParameterKeys.length; i++) {
  8110. if(i == headerParameterKeys.length - 1) {
  8111. authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '"';
  8112. } else {
  8113. authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '",';
  8114. }
  8115. }
  8116. return { signature_base_string: signatureBaseString, authorization_header: authorizationHeader, signature: headerParameters.oauth_signature };
  8117. } else {
  8118. return "Missing jsSHA JavaScript library";
  8119. }
  8120. },
  8121.  
  8122. /*
  8123. * Create Random String Nonce
  8124. *
  8125. * @param integer length
  8126. * @return string
  8127. */
  8128. createNonce: function(length) {
  8129. var text = "";
  8130. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  8131. for(var i = 0; i < length; i++) {
  8132. text += possible.charAt(Math.floor(Math.random() * possible.length));
  8133. }
  8134. return text;
  8135. },
  8136.  
  8137. generateUrlParameters: function (parameters) {
  8138. var sortedKeys = Object.keys(parameters);
  8139. sortedKeys.sort();
  8140.  
  8141. var params = "";
  8142. var amp = "";
  8143.  
  8144. for (var i = 0 ; i < sortedKeys.length; i++) {
  8145. params += amp + sortedKeys[i] + "=" + parameters[sortedKeys[i]];
  8146. amp = "&";
  8147. }
  8148.  
  8149. return params;
  8150. },
  8151.  
  8152. parseResponseParameters: function (response) {
  8153. if (response.split) {
  8154. var parameters = response.split("&");
  8155. var parameterMap = {};
  8156. for(var i = 0; i < parameters.length; i++) {
  8157. parameterMap[parameters[i].split("=")[0]] = parameters[i].split("=")[1];
  8158. }
  8159. return parameterMap;
  8160. }
  8161. else {
  8162. return {};
  8163. }
  8164. },
  8165.  
  8166. generateOauthParametersInstance: function(consumerKey) {
  8167. var nonceObj = new jsSHA(Math.round((new Date()).getTime() / 1000.0), "TEXT");
  8168. var oauthObject = {
  8169. oauth_consumer_key: consumerKey,
  8170. oauth_nonce: nonceObj.getHash("SHA-1", "HEX"),
  8171. oauth_signature_method: "HMAC-SHA1",
  8172. oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
  8173. oauth_version: "1.0"
  8174. };
  8175. return oauthObject;
  8176. }
  8177.  
  8178. };
  8179.  
  8180. }]);
  8181.  
  8182. })();
Advertisement
Add Comment
Please, Sign In to add comment