'use strict'; var unsupported, isaosp; if (window && window.navigator) { var rxaosp = window.navigator.userAgent.match(/Android.*AppleWebKit\/([\d.]+)/); isaosp = (rxaosp && rxaosp[1] < 537); if (!window.cordova && isaosp) unsupported = true; if (unsupported) { window.location = '#/unsupported'; } } //Setting up route angular.module('copayApp').config(function(historicLogProvider, $provide, $logProvider, $stateProvider, $urlRouterProvider, $compileProvider, $ionicConfigProvider) { $urlRouterProvider.otherwise('/starting'); // NO CACHE //$ionicConfigProvider.views.maxCache(0); // TABS BOTTOM $ionicConfigProvider.tabs.position('bottom'); // NAV TITTLE CENTERED $ionicConfigProvider.navBar.alignTitle('center'); // NAV BUTTONS ALIGMENT $ionicConfigProvider.navBar.positionPrimaryButtons('left'); $ionicConfigProvider.navBar.positionSecondaryButtons('right'); // NAV BACK-BUTTON TEXT/ICON $ionicConfigProvider.backButton.icon('icon ion-ios-arrow-thin-left').text(''); $ionicConfigProvider.backButton.previousTitleText(false); // CHECKBOX CIRCLE $ionicConfigProvider.form.checkbox('circle'); // USE NATIVE SCROLLING $ionicConfigProvider.scrolling.jsScrolling(false); $logProvider.debugEnabled(true); $provide.decorator('$log', ['$delegate', 'platformInfo', function($delegate, platformInfo) { var historicLog = historicLogProvider.$get(); historicLog.getLevels().forEach(function(levelDesc) { var level = levelDesc.level; if (platformInfo.isDevel && level == 'error') return; var orig = $delegate[level]; $delegate[level] = function() { if (level == 'error') console.log(arguments); var args = Array.prototype.slice.call(arguments); args = args.map(function(v) { try { if (typeof v == 'undefined') v = 'undefined'; if (!v) v = 'null'; if (typeof v == 'object') { if (v.message) v = v.message; else v = JSON.stringify(v); } // Trim output in mobile if (platformInfo.isCordova) { v = v.toString(); if (v.length > 3000) { v = v.substr(0, 2997) + '...'; } } } catch (e) { console.log('Error at log decorator:', e); v = 'undefined'; } return v; }); try { if (platformInfo.isCordova) console.log(args.join(' ')); historicLog.add(level, args.join(' ')); orig.apply(null, args); } catch (e) { console.log('ERROR (at log decorator):', e, args[0]); } }; }); return $delegate; } ]); // whitelist 'chrome-extension:' for chromeApp to work with image URLs processed by Angular // link: http://stackoverflow.com/questions/15606751/angular-changes-urls-to-unsafe-in-extension-page?lq=1 $compileProvider.imgSrcSanitizationWhitelist(/^\s*((https?|ftp|file|blob|chrome-extension):|data:image\/)/); $stateProvider /* * * Other pages * */ .state('unsupported', { url: '/unsupported', templateUrl: 'views/unsupported.html' }) .state('starting', { url: '/starting', template: '
' }) /* * * URI * */ .state('uri', { url: '/uri/:url', controller: function($stateParams, $log, openURLService, profileService) { profileService.whenAvailable(function() { $log.info('DEEP LINK from Browser:' + $stateParams.url); openURLService.handleURL({ url: $stateParams.url }); }) } }) /* * * Wallet * */ .state('tabs.wallet', { url: '/wallet/:walletId/:fromOnboarding', views: { 'tab-home@tabs': { controller: 'walletDetailsController', templateUrl: 'views/walletDetails.html' } } }) .state('tabs.activity', { url: '/activity', views: { 'tab-home@tabs': { controller: 'activityController', templateUrl: 'views/activity.html', } } }) .state('tabs.proposals', { url: '/proposals', views: { 'tab-home@tabs': { controller: 'proposalsController', templateUrl: 'views/proposals.html', } } }) .state('tabs.wallet.tx-details', { url: '/tx-details/:txid', views: { 'tab-home@tabs': { controller: 'txDetailsController', templateUrl: 'views/tx-details.html' } } }) .state('tabs.wallet.backupWarning', { url: '/backupWarning/:from/:walletId', views: { 'tab-home@tabs': { controller: 'backupWarningController', templateUrl: 'views/backupWarning.html' } } }) .state('tabs.wallet.backup', { url: '/backup/:walletId', views: { 'tab-home@tabs': { templateUrl: 'views/backup.html', controller: 'backupController' } } }) .state('tabs.wallet.addresses', { url: '/addresses/:walletId/:toAddress', views: { 'tab-home@tabs': { controller: 'addressesController', templateUrl: 'views/addresses.html' } } }) .state('tabs.wallet.allAddresses', { url: '/allAddresses/:walletId', views: { 'tab-home@tabs': { controller: 'addressesController', templateUrl: 'views/allAddresses.html' } } }) /* * * Tabs * */ .state('tabs', { url: '/tabs', abstract: true, controller: 'tabsController', templateUrl: 'views/tabs.html' }) .state('tabs.home', { url: '/home/:fromOnboarding', views: { 'tab-home': { controller: 'tabHomeController', templateUrl: 'views/tab-home.html', } } }) .state('tabs.receive', { url: '/receive/:walletId', views: { 'tab-receive': { controller: 'tabReceiveController', templateUrl: 'views/tab-receive.html', } } }) .state('tabs.scan', { url: '/scan', views: { 'tab-scan': { controller: 'tabScanController', templateUrl: 'views/tab-scan.html', } } }) .state('scanner', { url: '/scanner', params: { passthroughMode: null, }, controller: 'tabScanController', templateUrl: 'views/tab-scan.html' }) .state('tabs.send', { url: '/send', views: { 'tab-send': { controller: 'tabSendController', templateUrl: 'views/tab-send.html', } } }) .state('tabs.settings', { url: '/settings', views: { 'tab-settings': { controller: 'tabSettingsController', templateUrl: 'views/tab-settings.html', } } }) /* * * Send * */ .state('tabs.send.amount', { url: '/amount', views: { 'tab-send@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } } }) .state('tabs.send.wallet-to-wallet', { url: '/wallet-to-wallet', views: { 'tab-send@tabs': { controller: 'walletSelectorController', templateUrl: 'views/walletSelector.html' } } }) .state('tabs.send.origin', { url: '/origin', views: { 'tab-send@tabs': { controller: 'walletSelectorController', templateUrl: 'views/walletSelector.html', } } }) .state('tabs.send.destination', { url: '/destination', views: { 'tab-send@tabs': { controller: 'walletSelectorController', templateUrl: 'views/walletSelector.html', } } }) .state('tabs.send.confirm', { url: '/confirm', views: { 'tab-send@tabs': { controller: 'confirmController', templateUrl: 'views/confirm.html' } }, params: { paypro: null } }) .state('tabs.send.addressbook', { url: '/addressbook/add/:fromSendTab/:addressbookEntry', views: { 'tab-send@tabs': { templateUrl: 'views/addressbook.add.html', controller: 'addressbookAddController' } } }) .state('tabs.send.review', { url: '/review/:thirdParty/:amount/:fromWalletId/:sendMax/:toAddress/:toWalletId', views: { 'tab-send@tabs': { controller: 'reviewController', controllerAs: 'vm', templateUrl: 'views/review.html' } }, params: { paypro: null } }) /* * * Add * */ .state('tabs.add', { url: '/add', views: { 'tab-home@tabs': { templateUrl: 'views/add.html' } }, params: { coin: 'btc' } }) .state('tabs.add.join', { url: '/join/:url', views: { 'tab-home@tabs': { templateUrl: 'views/join.html', controller: 'joinController' }, } }) .state('tabs.add.import', { url: '/import/:code', views: { 'tab-home@tabs': { templateUrl: 'views/import.html', controller: 'importController' }, }, }) .state('tabs.add.create-personal', { url: '/create-personal', views: { 'tab-home@tabs': { templateUrl: 'views/tab-create-personal.html', controller: 'createController' }, } }) .state('tabs.add.create-shared', { url: '/create-shared', views: { 'tab-home@tabs': { templateUrl: 'views/tab-create-shared.html', controller: 'createController' }, } }) /* * * Global Settings * */ .state('tabs.notifications', { url: '/notifications', views: { 'tab-settings@tabs': { controller: 'preferencesNotificationsController', templateUrl: 'views/preferencesNotifications.html' } } }) .state('tabs.language', { url: '/language', views: { 'tab-settings@tabs': { controller: 'preferencesLanguageController', templateUrl: 'views/preferencesLanguage.html' } } }) .state('tabs.fee', { url: '/fee', views: { 'tab-settings@tabs': { controller: 'preferencesFeeController', templateUrl: 'views/preferencesFee.html' } } }) .state('tabs.altCurrency', { url: '/altCurrency', views: { 'tab-settings@tabs': { controller: 'preferencesAltCurrencyController', templateUrl: 'views/preferencesAltCurrency.html' } } }) .state('tabs.priceDisplay', { url: '/priceDisplay', views: { 'tab-settings@tabs': { controller: 'preferencesPriceDisplayController', templateUrl: 'views/preferencesPriceDisplay.html' } } }) .state('tabs.about', { url: '/about', views: { 'tab-settings@tabs': { controller: 'preferencesAbout', templateUrl: 'views/preferencesAbout.html' } } }) .state('tabs.about.logs', { url: '/logs', views: { 'tab-settings@tabs': { controller: 'preferencesLogs', templateUrl: 'views/preferencesLogs.html' } } }) .state('tabs.about.termsOfUse', { url: '/termsOfUse', views: { 'tab-settings@tabs': { templateUrl: 'views/termsOfUse.html' } } }) .state('tabs.advanced', { url: '/advanced', views: { 'tab-settings@tabs': { controller: 'advancedSettingsController', templateUrl: 'views/advancedSettings.html' } } }) .state('tabs.lockSetup', { url: '/lockSetup', views: { 'tab-settings@tabs': { controller: 'lockSetupController', templateUrl: 'views/lockSetup.html', } } }) .state('tabs.pin', { url: '/pin/:action', views: { 'tab-settings@tabs': { controller: 'pinController', templateUrl: 'views/pin.html', cache: false } } }) /* * * Wallet preferences * */ .state('tabs.preferences', { url: '/preferences/:walletId', views: { 'tab-settings@tabs': { controller: 'preferencesController', templateUrl: 'views/preferences.html' } } }) .state('tabs.preferences.preferencesAlias', { url: '/preferencesAlias', views: { 'tab-settings@tabs': { controller: 'preferencesAliasController', templateUrl: 'views/preferencesAlias.html' } } }) .state('tabs.preferences.preferencesColor', { url: '/preferencesColor', views: { 'tab-settings@tabs': { controller: 'preferencesColorController', templateUrl: 'views/preferencesColor.html' } } }) .state('tabs.preferences.backupWarning', { url: '/backupWarning/:from', views: { 'tab-settings@tabs': { controller: 'backupWarningController', templateUrl: 'views/backupWarning.html' } } }) .state('tabs.preferences.backup', { url: '/backup', views: { 'tab-settings@tabs': { controller: 'backupController', templateUrl: 'views/backup.html' } } }) .state('tabs.preferences.preferencesAdvanced', { url: '/preferencesAdvanced', views: { 'tab-settings@tabs': { controller: 'preferencesAdvancedController', templateUrl: 'views/preferencesAdvanced.html' } } }) .state('tabs.preferences.information', { url: '/information', views: { 'tab-settings@tabs': { controller: 'preferencesInformation', templateUrl: 'views/preferencesInformation.html' } } }) .state('tabs.preferences.export', { url: '/export', views: { 'tab-settings@tabs': { controller: 'exportController', templateUrl: 'views/export.html' } } }) .state('tabs.preferences.preferencesBwsUrl', { url: '/preferencesBwsUrl', views: { 'tab-settings@tabs': { controller: 'preferencesBwsUrlController', templateUrl: 'views/preferencesBwsUrl.html' } } }) .state('tabs.preferences.preferencesHistory', { url: '/preferencesHistory', views: { 'tab-settings@tabs': { controller: 'preferencesHistory', templateUrl: 'views/preferencesHistory.html' } } }) .state('tabs.preferences.preferencesExternal', { url: '/preferencesExternal', views: { 'tab-settings@tabs': { controller: 'preferencesExternalController', templateUrl: 'views/preferencesExternal.html' } } }) .state('tabs.preferences.delete', { url: '/delete', views: { 'tab-settings@tabs': { controller: 'preferencesDeleteWalletController', templateUrl: 'views/preferencesDeleteWallet.html' } } }) .state('tabs.preferencesCash.scan', { url: '/cashScan', views: { 'tab-settings@tabs': { controller: 'cashScanController', templateUrl: 'views/cashScan.html' } } }) /* * * Addressbook * */ .state('tabs.addressbook', { url: '/addressbook', views: { 'tab-settings@tabs': { templateUrl: 'views/addressbook.html', controller: 'addressbookListController' } } }) .state('tabs.addressbook.add', { url: '/add', views: { 'tab-settings@tabs': { templateUrl: 'views/addressbook.add.html', controller: 'addressbookAddController' } } }) .state('tabs.addressbook.view', { url: '/view/:address/:email/:name/:coin', views: { 'tab-settings@tabs': { templateUrl: 'views/addressbook.view.html', controller: 'addressbookViewController' } } }) /* * * Copayers * */ .state('tabs.copayers', { url: '/copayers/:walletId', views: { 'tab-home': { templateUrl: 'views/copayers.html', controller: 'copayersController' } } }) /* * * Addresses * */ .state('tabs.settings.addresses', { url: '/addresses/:walletId/:toAddress', views: { 'tab-settings@tabs': { controller: 'addressesController', templateUrl: 'views/addresses.html' } } }) .state('tabs.settings.allAddresses', { url: '/allAddresses/:walletId', views: { 'tab-settings@tabs': { controller: 'addressesController', templateUrl: 'views/allAddresses.html' } } }) /* * * Request Specific amount * */ .state('tabs.paymentRequest', { url: '/payment-request', abstract: true, params: { id: null, nextStep: 'tabs.paymentRequest.confirm', } }) .state('tabs.paymentRequest.amount', { url: '/amount/:toWalletId', views: { 'tab-receive@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } } }) .state('tabs.paymentRequest.confirm', { url: '/confirm/:amount/:toWalletId', views: { 'tab-receive@tabs': { controller: 'customAmountController', templateUrl: 'views/customAmount.html' } } }) /* * * Init backup flow * */ .state('tabs.receive.backupWarning', { url: '/backupWarning/:from/:walletId', views: { 'tab-receive@tabs': { controller: 'backupWarningController', templateUrl: 'views/backupWarning.html' } } }) .state('tabs.receive.backup', { url: '/backup/:walletId', views: { 'tab-receive@tabs': { controller: 'backupController', templateUrl: 'views/backup.html' } } }) /* * * Paper Wallet * */ .state('tabs.home.paperWallet', { url: '/paperWallet/:privateKey', views: { 'tab-home@tabs': { controller: 'paperWalletController', templateUrl: 'views/paperWallet.html' } } }) /* * * Onboarding * */ .state('onboarding', { url: '/onboarding', abstract: true, template: '' }) .state('onboarding.tour', { url: '/tour', views: { 'onboarding': { templateUrl: 'views/onboarding/tour.html', controller: 'tourController' } } }) .state('onboarding.collectEmail', { url: '/collectEmail/:bchWalletId/:btcWalletId', views: { 'onboarding': { templateUrl: 'views/onboarding/collectEmail.html', controller: 'collectEmailController' } } }) .state('onboarding.import', { url: '/import', views: { 'onboarding': { templateUrl: 'views/import.html', controller: 'importController' }, }, params: { code: null, fromOnboarding: null }, }) .state('tabs.shareApp', { url: '/shareApp', views: { 'tab-settings@tabs': { controller: 'shareAppController', templateUrl: 'views/shareApp.html' } } }) /* * * Buy or Sell Bitcoin * */ .state('tabs.buyandsell', { url: '/buyandsell', views: { 'tab-home': { controller: 'buyandsellController', templateUrl: 'views/buyandsell.html' } } }) /* * * Glidera * * */ .state('tabs.buyandsell.glidera', { url: '/glidera/:code', views: { 'tab-home@tabs': { controller: 'glideraController', controllerAs: 'glidera', templateUrl: 'views/glidera.html' } }, params: { coin: 'btc', } }) .state('tabs.buyandsell.glidera.amount', { url: '/amount/:nextStep/:currency', views: { 'tab-home@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } } }) .state('tabs.buyandsell.glidera.buy', { url: '/buy/:amount/:currency', views: { 'tab-home@tabs': { controller: 'buyGlideraController', templateUrl: 'views/buyGlidera.html' } } }) .state('tabs.buyandsell.glidera.sell', { url: '/sell/:amount/:currency', views: { 'tab-home@tabs': { controller: 'sellGlideraController', templateUrl: 'views/sellGlidera.html' } } }) .state('tabs.preferences.glidera', { url: '/glidera', views: { 'tab-settings@tabs': { controller: 'preferencesGlideraController', templateUrl: 'views/preferencesGlidera.html' } } }) /* * * Coinbase * */ .state('tabs.buyandsell.coinbase', { url: '/coinbase/:code', views: { 'tab-home@tabs': { controller: 'coinbaseController', controllerAs: 'coinbase', templateUrl: 'views/coinbase.html' } }, params: { coin: 'btc', } }) .state('tabs.preferences.coinbase', { url: '/coinbase', views: { 'tab-settings@tabs': { controller: 'preferencesCoinbaseController', templateUrl: 'views/preferencesCoinbase.html' } } }) .state('tabs.buyandsell.coinbase.amount', { url: '/amount/:nextStep/:currency', views: { 'tab-home@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } } }) .state('tabs.buyandsell.coinbase.buy', { url: '/buy/:amount/:currency', views: { 'tab-home@tabs': { controller: 'buyCoinbaseController', templateUrl: 'views/buyCoinbase.html' } } }) .state('tabs.buyandsell.coinbase.sell', { url: '/sell/:amount/:currency', views: { 'tab-home@tabs': { controller: 'sellCoinbaseController', templateUrl: 'views/sellCoinbase.html' } } }) /* * * Gift Cards * */ .state('tabs.giftcards', { url: '/giftcards', abstract: true }) /* buy.Bitcoin.com */ .state('tabs.buyandsell.bitcoindotcom', { url: '/buyBitcoindotcom', views: { 'tab-home@tabs': { controller: 'buyBitcoindotcomController', templateUrl: 'views/buyBitcoindotcom.html' } } }) /* Price Chart */ .state('tabs.pricechart', { url: '/pricechart', views: { 'tab-home@tabs': { controller: 'pricechartController', templateUrl: 'views/pricechart.html' } } }) /* Shapeshift */ .state('tabs.shapeshift', { url: '/shapeshift/:fromWalletId/:toWalletId', views: { 'tab-home@tabs': { controller: 'shapeshiftController', templateUrl: 'views/shapeshift.html' } } }) /* Message Signing and Verification */ .state('tabs.signMessage', { url: '/signMessage', views: { 'tab-home@tabs': { controller: 'signMessageController', templateUrl: 'views/signMessage.html' } } }) .state('tabs.verifyMessage', { url: '/verifyMessage', views: { 'tab-home@tabs': { controller: 'verifyMessageController', templateUrl: 'views/verifyMessage.html' } } }) /* * * Mercado Libre Gift Card * */ .state('tabs.giftcards.mercadoLibre', { url: '/mercadoLibre', views: { 'tab-home@tabs': { controller: 'mercadoLibreController', templateUrl: 'views/mercadoLibre.html' } } }) .state('tabs.giftcards.mercadoLibre.cards', { url: '/cards', views: { 'tab-home@tabs': { controller: 'mercadoLibreCardsController', templateUrl: 'views/mercadoLibreCards.html' } }, params: { invoiceId: null } }) .state('tabs.giftcards.mercadoLibre.amount', { url: '/amount', views: { 'tab-home@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } }, params: { nextStep: 'tabs.giftcards.mercadoLibre.buy', currency: 'BRL', coin: 'btc', fixedUnit: 1, } }) .state('tabs.giftcards.mercadoLibre.buy', { url: '/buy/:amount/:currency', views: { 'tab-home@tabs': { controller: 'buyMercadoLibreController', templateUrl: 'views/buyMercadoLibre.html' } } }) /* * * Amazon.com Gift Card * */ .state('tabs.giftcards.amazon', { url: '/amazon', views: { 'tab-home@tabs': { controller: 'amazonController', templateUrl: 'views/amazon.html' } } }) .state('tabs.giftcards.amazon.cards', { url: '/cards', views: { 'tab-home@tabs': { controller: 'amazonCardsController', templateUrl: 'views/amazonCards.html' } }, params: { invoiceId: null } }) .state('tabs.giftcards.amazon.amount', { url: '/amount', views: { 'tab-home@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } }, params: { nextStep: 'tabs.giftcards.amazon.buy', currency: 'USD', coin: 'btc', fixedUnit: true, } }) .state('tabs.giftcards.amazon.buy', { url: '/buy/:amount/:currency', views: { 'tab-home@tabs': { controller: 'buyAmazonController', templateUrl: 'views/buyAmazon.html' } } }) /* * * BitPay Card * */ .state('tabs.bitpayCardIntro', { url: '/bitpay-card-intro/:secret/:email/:otp', views: { 'tab-home@tabs': { controller: 'bitpayCardIntroController', templateUrl: 'views/bitpayCardIntro.html' } } }) .state('tabs.bitpayCard', { url: '/bitpay-card', views: { 'tab-home@tabs': { controller: 'bitpayCardController', controllerAs: 'bitpayCard', templateUrl: 'views/bitpayCard.html' } }, params: { id: null, currency: 'USD', coin: 'btc', useSendMax: null } }) .state('tabs.bitpayCard.amount', { url: '/amount/:nextStep', views: { 'tab-home@tabs': { controller: 'amountController', controllerAs: 'vm', templateUrl: 'views/amount.html' } } }) .state('tabs.bitpayCard.topup', { url: '/topup/:amount', views: { 'tab-home@tabs': { controller: 'topUpController', templateUrl: 'views/topup.html' } } }) .state('tabs.preferences.bitpayServices', { url: '/bitpay-services', views: { 'tab-settings@tabs': { controller: 'preferencesBitpayServicesController', templateUrl: 'views/preferencesBitpayServices.html' } } }); }) .run(function(leanplumConfig, $rootScope, $state, $location, $log, $timeout, startupService, ionicToast, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, emailService, /* plugins START HERE => */ buydotbitcoindotcomService, pushNotificationsService, glideraService, amazonService, bitpayCardService, applicationService, mercadoLibreService, rateService) { $ionicPlatform.ready(function() { // Init BitAnalytics var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop'; window.BitAnalytics.initialize(os, $window.fullVersion, {"firebase": {}, "ga": { "trackingId": "UA-59964190-23", "eventLabels": ["id", "icon-off"] }, "adjust": { "token": "au1onbhgg5q8", "environment" : "production", "eventTypes": { "banner_click": "sc5i8u", "buy_bitcoin_click": "t1vcdz", "transfer_success": "f68evo", "wallet_created": "nd3dg5", "wallet_opened": "4n39l7" } }, leanplum: leanplumConfig }); configService.whenAvailable(function(config) { pushNotificationsService.init(); }); //firebaseEventsService.init(); var channel = "ga"; if (platformInfo.isCordova) { channel = "firebase"; } // Send a log to test var log = new window.BitAnalytics.LogEvent("wallet_opened", [], [channel, "adjust", 'leanplum']); window.BitAnalytics.LogEventHandlers.postEvent(log); var actionBanner = new window.BitAnalytics.ActionFactory.createAction('click', { name: 'banner_click', class: 'track_banner_click', params: ['href-banner', 'id'], channels: [channel, 'adjust', 'leanplum'] }); window.BitAnalytics.ActionHandlers.trackAction(actionBanner); var actionBuyBitcoin = new window.BitAnalytics.ActionFactory.createAction('click', { name: 'buy_bitcoin_click', class: 'track_buy_bitcoin_click', params: ['href', 'id'], channels: [channel, 'adjust', 'leanplum'] }); window.BitAnalytics.ActionHandlers.trackAction(actionBuyBitcoin); var actionLinkClickOut = new window.BitAnalytics.ActionFactory.createAction('click', { name: 'link_click_out', class: 'track_link_click_out', params: ['href', 'id'], channels: [channel, 'leanplum'] }); window.BitAnalytics.ActionHandlers.trackAction(actionLinkClickOut); var actionTabOpen = new window.BitAnalytics.ActionFactory.createAction('click', { name: 'tab_open', class: 'track_tab_open', params: ['href', 'title', 'icon-off'], channels: [channel, 'leanplum'] }); window.BitAnalytics.ActionHandlers.trackAction(actionTabOpen); var actionShapeShiftStart = new window.BitAnalytics.ActionFactory.createAction('click', { name: 'shapeshift_start_click', class: 'track_shapeshift_start_click', channels: [channel, 'leanplum'] }); window.BitAnalytics.ActionHandlers.trackAction(actionShapeShiftStart); // Init language uxLanguage.init(function (lang) { // Try to load the profile profileService.loadAndBindProfile(function(err) { // If err, first time so I define the currency rate by language if (err) { var rateCode = uxLanguage.getRateCode(lang); rateService.whenAvailable(function() { var alternatives = rateService.listAlternatives(true); var newAltCurrency = lodash.find(alternatives, { 'isoCode': rateCode }); configService.whenAvailable(function(config) { var opts = { wallet: { settings: { alternativeName: newAltCurrency.name, alternativeIsoCode: newAltCurrency.isoCode, } } }; configService.set(opts, function(err) { if (err) $log.warn(err); }); }); $log.debug('Setting default currency : ' + newAltCurrency); }); }; }); }); if (screen.width < 768 && platformInfo.isCordova) screen.lockOrientation('portrait'); if (ionic.Platform.isAndroid() && platformInfo.isCordova && StatusBar) { StatusBar.backgroundColorByHexString('#000000'); } if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard && !platformInfo.isWP) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(false); cordova.plugins.Keyboard.disableScroll(true); } window.addEventListener('native.keyboardshow', function() { document.body.classList.add('keyboard-open'); }); $ionicPlatform.registerBackButtonAction(function(e) { //from root tabs view var matchHome = $ionicHistory.currentStateName() == 'tabs.home' ? true : false; var matchReceive = $ionicHistory.currentStateName() == 'tabs.receive' ? true : false; var matchScan = $ionicHistory.currentStateName() == 'tabs.scan' ? true : false; var matchSend = $ionicHistory.currentStateName() == 'tabs.send' ? true : false; var matchSettings = $ionicHistory.currentStateName() == 'tabs.settings' ? true : false; var fromTabs = matchHome | matchReceive | matchScan | matchSend | matchSettings; //onboarding with no back views var matchCollectEmail = $ionicHistory.currentStateName() == 'onboarding.collectEmail' ? true : false; var noBackView = $ionicHistory.backView().stateName == 'starting' ? true : false; var fromOnboarding = matchCollectEmail ; //views with disable backbutton var matchComplete = $ionicHistory.currentStateName() == 'tabs.rate.complete' ? true : false; var matchLockedView = $ionicHistory.currentStateName() == 'lockedView' ? true : false; var matchPin = $ionicHistory.currentStateName() == 'pin' ? true : false; if ($ionicHistory.backView() && !fromTabs && !fromOnboarding && !matchComplete && !matchPin && !matchLockedView) { $ionicHistory.goBack(); } else if ($rootScope.backButtonPressedOnceToExit) { navigator.app.exitApp(); } else { $rootScope.backButtonPressedOnceToExit = true; $rootScope.$apply(function() { ionicToast.show(gettextCatalog.getString('Press again to exit'), 'bottom', false, 1000); }); $timeout(function() { $rootScope.backButtonPressedOnceToExit = false; }, 3000); } e.preventDefault(); }, 101); $ionicPlatform.on('pause', function() { // Nothing to do }); $ionicPlatform.on('resume', function() { applicationService.appLockModal('check'); }); $ionicPlatform.on('menubutton', function() { window.location = '#/preferences'; }); $log.info('Init profile...'); // Try to open local profile profileService.loadAndBindProfile(function(err) { $ionicHistory.nextViewOptions({ disableAnimate: true }); if (err) { if (err.message && err.message.match('NOPROFILE')) { $log.debug('No profile... redirecting'); $state.go('onboarding.tour'); } else if (err.message && err.message.match('NONAGREEDDISCLAIMER')) { $scope.setRateByLanguage(); if (lodash.isEmpty(profileService.getWallets())) { $log.debug('No wallets and no disclaimer... redirecting'); $state.go('onboarding.tour'); } else { $log.debug('Display disclaimer... redirecting'); $state.go('onboarding.disclaimer', { resume: true }); } } else { throw new Error(err); // TODO } } else { profileService.storeProfileIfDirty(); $log.debug('Profile loaded ... Starting UX.'); scannerService.gentleInitialize(); // Reload tab-home if necessary (from root path: starting) $state.go('starting', {}, { 'reload': true, 'notify': $state.current.name == 'starting' ? false : true }).then(function() { $ionicHistory.nextViewOptions({ disableAnimate: true, historyRoot: true }); $state.transitionTo('tabs.home').then(function() { // Clear history $ionicHistory.clearHistory(); }); applicationService.appLockModal('check'); }); }; // After everything have been loaded $timeout(function() { emailService.init(); // Update email subscription if necessary openURLService.init(); }, 1000); }); }); if (platformInfo.isNW) { var gui = require('nw.gui'); var win = gui.Window.get(); var nativeMenuBar = new gui.Menu({ type: "menubar" }); try { nativeMenuBar.createMacBuiltin(appConfigService.nameCase); } catch (e) { $log.debug('This is not OSX'); } win.menu = nativeMenuBar; } $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { if (document.body.classList.contains('keyboard-open')) { document.body.classList.remove('keyboard-open'); $log.debug('Prevented keyboard open bug..'); } $log.debug('Route change from:', fromState.name || '-', ' to:', toState.name); $log.debug(' toParams:' + JSON.stringify(toParams || {})); $log.debug(' fromParams:' + JSON.stringify(fromParams || {})); }); });