diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..674b8feb8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,28 @@ +**I'm submitting a ...** (check one with "x") +[ ] bug report +[ ] feature request +[ ] support request => Please do not submit support requests here, use one of these channels: https://forum.ionicframework.com/ or https://ionicworldwide.herokuapp.com/ + +**Current behavior:** + + +**Expected behavior:** + + +**Steps to reproduce:** + + +**Related code:** + +``` +insert any relevant code here +``` + +**Other information:** + + +**package.json info:** + +```json +insert the content here +``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 3888cd5be..65006e5d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,86 @@ + +## [3.8.1](https://github.com/driftyco/ionic-native/compare/v3.8.0...v3.8.1) (2017-05-16) + + +### Bug Fixes + +* **document-viewer:** fix params and docs for canViewDocument (#1568) ([b35417a](https://github.com/driftyco/ionic-native/commit/b35417a)), closes [#1568](https://github.com/driftyco/ionic-native/issues/1568) +* **file:** add toInternalURL (#1561) ([7c79712](https://github.com/driftyco/ionic-native/commit/7c79712)), closes [#1560](https://github.com/driftyco/ionic-native/issues/1560) +* **file:** fix repo link (#1566) ([adf9c5a](https://github.com/driftyco/ionic-native/commit/adf9c5a)), closes [#1566](https://github.com/driftyco/ionic-native/issues/1566) +* **file:** various fixes ([d0dec7a](https://github.com/driftyco/ionic-native/commit/d0dec7a)), closes [#1564](https://github.com/driftyco/ionic-native/issues/1564) +* **sqlite:** fix implementation and improve typings ([fec19b7](https://github.com/driftyco/ionic-native/commit/fec19b7)) + + +### Features + +* **mix-panel:** add timeEvent (#1536) ([965a90c](https://github.com/driftyco/ionic-native/commit/965a90c)) + + + + +# [3.8.0](https://github.com/driftyco/ionic-native/compare/v3.7.0...v3.8.0) (2017-05-14) + + +### Bug Fixes + +* **app-minimize:** fix pluginRef ([10d61c2](https://github.com/driftyco/ionic-native/commit/10d61c2)) +* **diagnostic:** fix Cordova decorator in camera API (#1527) ([45108c4](https://github.com/driftyco/ionic-native/commit/45108c4)), closes [#1527](https://github.com/driftyco/ionic-native/issues/1527) +* **fcm:** fix method name (#1531) ([ad514bb](https://github.com/driftyco/ionic-native/commit/ad514bb)), closes [#1531](https://github.com/driftyco/ionic-native/issues/1531) +* **file:** fix file reader (#1537) ([efae1be](https://github.com/driftyco/ionic-native/commit/efae1be)), closes [#1537](https://github.com/driftyco/ionic-native/issues/1537) [#1530](https://github.com/driftyco/ionic-native/issues/1530) +* **file:** various fixes (#1553) ([f98f90a](https://github.com/driftyco/ionic-native/commit/f98f90a)), closes [#1553](https://github.com/driftyco/ionic-native/issues/1553) + + +### Features + +* **video-capture-plus:** add Video Capture Plus plugin (#1538) ([385da01](https://github.com/driftyco/ionic-native/commit/385da01)), closes [#709](https://github.com/driftyco/ionic-native/issues/709) + + + + +# [3.7.0](https://github.com/driftyco/ionic-native/compare/v3.6.1...v3.7.0) (2017-05-09) + + +### Bug Fixes + +* **app-preferences:** value can be any type (#1498) ([c7111a3](https://github.com/driftyco/ionic-native/commit/c7111a3)), closes [#1334](https://github.com/driftyco/ionic-native/issues/1334) +* **background-mode:** add missing method (#1486) ([e6a647b](https://github.com/driftyco/ionic-native/commit/e6a647b)), closes [#1393](https://github.com/driftyco/ionic-native/issues/1393) +* **build:** fix build errors (#1472) ([8a445e9](https://github.com/driftyco/ionic-native/commit/8a445e9)), closes [#1472](https://github.com/driftyco/ionic-native/issues/1472) +* **document-viewer:** fix params ([1379f63](https://github.com/driftyco/ionic-native/commit/1379f63)) +* **flurry-analytics:** fix plugin wrapper ([14959c1](https://github.com/driftyco/ionic-native/commit/14959c1)) +* **flurry-analytics:** fix pluginRef (#1485) ([ce72be7](https://github.com/driftyco/ionic-native/commit/ce72be7)), closes [#1485](https://github.com/driftyco/ionic-native/issues/1485) [#1399](https://github.com/driftyco/ionic-native/issues/1399) +* **globalization:** getDatePattern return types (#1451) ([6e2fdf9](https://github.com/driftyco/ionic-native/commit/6e2fdf9)) +* **google-maps:** add args to panBy (#1507) ([ec85792](https://github.com/driftyco/ionic-native/commit/ec85792)) +* **google-maps:** fix fromPointToLatLng params (#1514) ([9583802](https://github.com/driftyco/ionic-native/commit/9583802)), closes [#1514](https://github.com/driftyco/ionic-native/issues/1514) +* **native-storage:** add missing keys method (#1495) ([8311aaf](https://github.com/driftyco/ionic-native/commit/8311aaf)), closes [#1415](https://github.com/driftyco/ionic-native/issues/1415) +* **web-intent:** updated source (#1519) ([252c3e4](https://github.com/driftyco/ionic-native/commit/252c3e4)), closes [#1517](https://github.com/driftyco/ionic-native/issues/1517) + + +### Features + +* **android-fingerprint-auth:** add ERRORS constant (#1470) ([ed6044d](https://github.com/driftyco/ionic-native/commit/ed6044d)) +* **android-premissions:** add Android Permissions plugin (#1508) ([5ee79b4](https://github.com/driftyco/ionic-native/commit/5ee79b4)), closes [#929](https://github.com/driftyco/ionic-native/issues/929) +* **app-minimize:** add AppMinimize plugin (#1501) ([d25b2f1](https://github.com/driftyco/ionic-native/commit/d25b2f1)) +* **camera-preview:** add new focus methods & getFlashMode() (#1442) ([748c6bd](https://github.com/driftyco/ionic-native/commit/748c6bd)) +* **camera-preview:** add tapToFocus method (#1494) ([8330c92](https://github.com/driftyco/ionic-native/commit/8330c92)) +* **diagnostic:** update to support latest signatures (#1458) ([a4151ab](https://github.com/driftyco/ionic-native/commit/a4151ab)) +* **facebook:** add EVENTS constant (#1510) ([aa9826f](https://github.com/driftyco/ionic-native/commit/aa9826f)) +* **fcm:** support Firebase Cloud Messaging plugin (#1449) ([6cc6393](https://github.com/driftyco/ionic-native/commit/6cc6393)) +* **firebase:** add support for firebase ErrorLog (#1440) ([11dbe42](https://github.com/driftyco/ionic-native/commit/11dbe42)) +* **health-kit:** add HealthKit plugin (#1499) ([14f38a0](https://github.com/driftyco/ionic-native/commit/14f38a0)) +* **intercom:** add Intercom plugin (#1504) ([ce2cc1b](https://github.com/driftyco/ionic-native/commit/ce2cc1b)) +* **mobile-accessibility:** add Mobile Accessibility plugin (#1505) ([4e9b2d9](https://github.com/driftyco/ionic-native/commit/4e9b2d9)), closes [#1304](https://github.com/driftyco/ionic-native/issues/1304) +* **native-page-transitions:** add pendingTransition methods (#1344) ([f699c6d](https://github.com/driftyco/ionic-native/commit/f699c6d)) +* **native-ringtones:** add Native Ringtones plugin (#1488) ([21c9cd2](https://github.com/driftyco/ionic-native/commit/21c9cd2)) +* **phonegap-local-notifications:** add Phonegap local notifications plugin (#1474) ([3d747d3](https://github.com/driftyco/ionic-native/commit/3d747d3)) +* **plugin:** add Document Viewer plugin (#1520) ([6855fe8](https://github.com/driftyco/ionic-native/commit/6855fe8)) +* **plugin:** add File encryption plugin (#1509) ([46b4e25](https://github.com/driftyco/ionic-native/commit/46b4e25)), closes [#618](https://github.com/driftyco/ionic-native/issues/618) +* **safari-view-controller:** add missing options (#1490) ([a5b2e98](https://github.com/driftyco/ionic-native/commit/a5b2e98)), closes [#1489](https://github.com/driftyco/ionic-native/issues/1489) +* **social-sharing:** add setIPadPopupCoordinates method (#1497) ([65a8095](https://github.com/driftyco/ionic-native/commit/65a8095)), closes [#1288](https://github.com/driftyco/ionic-native/issues/1288) +* **touch-id:** add didFingerprintDatabaseChange (#1475) ([d9cc959](https://github.com/driftyco/ionic-native/commit/d9cc959)), closes [#1466](https://github.com/driftyco/ionic-native/issues/1466) +* **wheel-selector:** add Native wheel Selector plugin (#1522) ([8fe4eec](https://github.com/driftyco/ionic-native/commit/8fe4eec)) + + + ## [3.6.1](https://github.com/driftyco/ionic-native/compare/v3.6.0...v3.6.1) (2017-04-27) diff --git a/README.md b/README.md index 4f4aebbad..ff2b92835 100644 --- a/README.md +++ b/README.md @@ -3,22 +3,22 @@ # Ionic Native -Ionic Native is a curated set of wrappers for Cordova plugins that make adding any native functionality you need to your [Ionic 2](http://ionicframework.com/) mobile app easy. +Ionic Native is a curated set of wrappers for Cordova plugins that make adding any native functionality you need to your [Ionic](https://ionicframework.com/) mobile app easy. Ionic Native wraps plugin callbacks in a Promise or Observable, providing a common interface for all plugins and making it easy to use plugins with Angular change detection. ## Installation Run following command to install Ionic Native in your project. -``` +```bash npm install @ionic-native/core --save ``` -You also need to install the Ionic Native package for each plugin you want to add. Please see the [Ionic Native documentation](http://ionicframework.com/docs/native/) for complete instructions on how to add and use the plugins. +You also need to install the Ionic Native package for each plugin you want to add. Please see the [Ionic Native documentation](https://ionicframework.com/docs/native/) for complete instructions on how to add and use the plugins. ## Documentation -For the full Ionic Native documentation, please visit [http://ionicframework.com/docs/native/](http://ionicframework.com/docs/native/). +For the full Ionic Native documentation, please visit [https://ionicframework.com/docs/native/](https://ionicframework.com/docs/native/). ### Basic Usage @@ -95,13 +95,13 @@ To do this, you need to provide a mock implementation of the plugins you wish to First import the `Camera` class in your `src/app/app.module.ts` file: -```ts +```typescript import { Camera } from '@ionic-native/camera'; ``` Then create a new class that extends the `Camera` class with a mock implementation: -```ts +```typescript class CameraMock extends Camera { getPicture(options) { return new Promise((resolve, reject) => { @@ -113,7 +113,7 @@ class CameraMock extends Camera { Finally, override the previous `Camera` class in your `providers` for this module: -```ts +```typescript providers: [ { provide: Camera, useClass: CameraMock } ] @@ -121,8 +121,9 @@ providers: [ Here's the full example: -```ts +```typescript import { NgModule, ErrorHandler } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular'; import { MyApp } from './app.component'; import { HomePage } from '../pages/home/home'; @@ -143,6 +144,7 @@ class CameraMock extends Camera { HomePage ], imports: [ + BrowserModule, IonicModule.forRoot(MyApp) ], bootstrap: [IonicApp], @@ -163,24 +165,24 @@ export class AppModule {} Spent way too long diagnosing an issue only to realize a plugin wasn't firing or installed? Ionic Native lets you know what the issue is and how you can resolve it. -![img](http://ionic-io-assets.s3.amazonaws.com/ionic-native-console.png) +![img](https://ionic-io-assets.s3.amazonaws.com/ionic-native-console.png) ## Plugin Missing? Let us know or submit a PR! Take a look at [the Developer Guide](https://github.com/driftyco/ionic-native/blob/master/DEVELOPER.md) for more on how to contribute. :heart: -## Ionic 1/Angular 1 support +## Ionic V1/Angular 1 support -Ionic Native 3.x supports Ionic 2.x and above. For Ionic/Angular 1 support, please use version 2 of Ionic Native. See the [2.x README](https://github.com/driftyco/ionic-native/blob/8cd648db5cddd7bdbe2bd78839b19c620cc8c04c/README.md) for usage information. +For Ionic V1/Angular 1 support, please use version 2 of Ionic Native. See the [2.x README](https://github.com/driftyco/ionic-native/blob/8cd648db5cddd7bdbe2bd78839b19c620cc8c04c/README.md) for usage information. # Credits -Ibby Hadeed - [@ihadeed](http://github.com/ihadeed) +Ibby Hadeed - [@ihadeed](https://github.com/ihadeed) -Tim Lancina - [@timlancina](http://twitter.com/timlancina) +Tim Lancina - [@timlancina](https://twitter.com/timlancina) Mike Hartington - [@mhartington](https://twitter.com/mhartington) -Max Lynch - [@maxlynch](http://twitter.com/maxlynch) +Max Lynch - [@maxlynch](https://twitter.com/maxlynch) Rob Wormald - [@robwormald](https://twitter.com/robwormald) diff --git a/circle.yml b/circle.yml index 9c84bee8d..bbeb054a2 100644 --- a/circle.yml +++ b/circle.yml @@ -7,12 +7,15 @@ jobs: steps: - checkout - restore_cache: - key: ionic-site + key: ionic-site-{{ .Branch }} - run: name: Prepare ionic-site repo - command: ./scripts/docs/prepare.sh + command: | + if [ "${CIRCLE_BRANCH}" == "master" ]; then + ./scripts/docs/prepare.sh + fi - save_cache: - key: ionic-site + key: ionic-site-{{ .Branch }} paths: - ~/ionic-site/ - restore_cache: @@ -27,6 +30,12 @@ jobs: - run: name: Run tslint command: npm run lint + - run: + name: Build changed plugins + command: node scripts/ci-tests.js + - run: + name: Run tests + command: npm test - add_ssh_keys - deploy: name: Update docs diff --git a/gulpfile.js b/gulpfile.js index c2e6c1168..1bf2f98a2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -34,14 +34,16 @@ gulp.task('plugin:create', () => { const src = flags.m ? './scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl', pluginName = flags.n, - pluginNameSpaced = pluginName.replace(/(?!^)([A-Z])/g, ' $1'); + spaced = pluginName.replace(/(?!^)([A-Z])/g, ' $1'), + kebabCase = _.kebabCase(pluginName); return gulp.src(src) - .pipe(replace('$PluginName', pluginName)) - .pipe(replace('$Plugin_Name', pluginNameSpaced)) - .pipe(replace('$pluginName', _.lowerFirst(pluginName))) + .pipe(replace('{{ PluginName }}', pluginName)) + .pipe(replace('{{ Plugin_Name }}', spaced)) + .pipe(replace('{{ pluginName }}', _.lowerFirst(pluginName))) + .pipe(replace('{{ plugin-name }}', kebabCase)) .pipe(rename('index.ts')) - .pipe(gulp.dest('./src/@ionic-native/plugins/' + _.kebabCase(pluginName))); + .pipe(gulp.dest('./src/@ionic-native/plugins/' + kebabCase)); } else { console.log("Usage is: gulp plugin:create -n PluginName"); diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 000000000..eb10d4d9c --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,55 @@ +"use strict"; + +module.exports = config => { + + const conf = { + frameworks: [ + 'jasmine', + 'karma-typescript' + ], + + plugins: [ + 'karma-typescript', + 'karma-jasmine', + 'karma-phantomjs-launcher' + ], + + preprocessors: { + 'src/**/*.ts': ['karma-typescript'] + }, + + karmaTypescriptConfig: { + bundlerOptions: { + entrypoints: /\.spec\.ts$/, + transforms: [ + require("karma-typescript-es6-transform")() + ] + }, + compilerOptions: { + lib: ['es2015', 'dom'], + paths: { + "@ionic-native/core": ["./src/@ionic-native/core"] + }, + baseUrl: '.' + } + }, + + files: [ + { pattern: 'src/**/*.ts', included: true, watched: true } + ], + + reporters: ['progress'], + + port: 9876, + colors: true, + logLevel: config.INFO, + autoWatch: true, + browsers: [ + 'PhantomJS' + ], + singleRun: false + }; + + config.set(conf); + +}; diff --git a/package.json b/package.json index 15f9a1edd..76e2b528e 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,15 @@ { "name": "ionic-native", - "version": "3.6.1", + "version": "3.8.1", "description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support", "license": "MIT", "devDependencies": { - "@angular/compiler": "4.0.0", - "@angular/compiler-cli": "4.0.0", - "@angular/core": "4.0.0", + "@angular/compiler": "4.1.2", + "@angular/compiler-cli": "4.1.2", + "@angular/core": "4.1.2", + "@types/cordova": "0.0.34", + "@types/jasmine": "^2.5.47", + "@types/node": "^7.0.18", "canonical-path": "0.0.2", "child-process-promise": "2.2.0", "conventional-changelog-cli": "1.2.0", @@ -21,6 +24,13 @@ "gulp-rename": "1.2.2", "gulp-replace": "0.5.4", "gulp-tslint": "6.1.2", + "jasmine-core": "^2.6.1", + "karma": "^1.7.0", + "karma-cli": "^1.0.1", + "karma-jasmine": "^1.1.0", + "karma-phantomjs-launcher": "^1.0.4", + "karma-typescript": "^3.0.1", + "karma-typescript-es6-transform": "^1.0.0", "lodash": "4.17.4", "minimist": "1.1.3", "node-html-encoder": "0.0.2", @@ -30,9 +40,9 @@ "rxjs": "5.1.1", "semver": "5.3.0", "tslint": "3.15.1", - "tslint-ionic-rules": "0.0.7", - "typescript": "2.2.1", - "zone.js": "^0.8.4" + "tslint-ionic-rules": "0.0.8", + "typescript": "2.3.2", + "zone.js": "^0.8.10" }, "scripts": { "start": "npm run test:watch", @@ -44,7 +54,9 @@ "shipit": "npm run build && gulp readmes && npm run npmpub", "npmpub": "node scripts/build/publish.js", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0", - "postchangelog": "git commit -am \"chore(): update changelog\"" + "postchangelog": "git commit -am \"chore(): update changelog\"", + "test": "karma start karma.conf.js --single-run", + "test:watch": "karma start karma.conf.js" }, "config": { "commitizen": { diff --git a/scripts/build/build.js b/scripts/build/build.js index a54ca9174..dd8353427 100644 --- a/scripts/build/build.js +++ b/scripts/build/build.js @@ -52,6 +52,16 @@ const PLUGINS = fs.readdirSync(PLUGINS_PATH); // Build specific list of plugins to build from arguments, if any let pluginsToBuild = process.argv.slice(2); +let ignoreErrors = false; +let errors = []; + +const index = pluginsToBuild.indexOf('ignore-errors'); +if (index > -1) { + ignoreErrors = true; + pluginsToBuild.splice(index, 1); + console.log('Build will continue even if errors were thrown. Errors will be printed when build finishes.'); +} + if (!pluginsToBuild.length) { pluginsToBuild = PLUGINS; } @@ -102,10 +112,16 @@ const addPluginToQueue = pluginName => { exec(`${ROOT}/node_modules/.bin/ngc -p ${tsConfigPath}`, (err, stdout, stderr) => { if (err) { - // oops! something went wrong. - callback(`\n\nBuilding ${pluginName} failed.`); - console.log(err); - return; + + if (!ignoreErrors) { + // oops! something went wrong. + console.log(err); + callback(`\n\nBuilding ${pluginName} failed.`); + return; + } else { + errors.push(err); + } + } // we're done with this plugin! @@ -125,7 +141,17 @@ pluginsToBuild.forEach(addPluginToQueue); QUEUE.start((err) => { if (err) { - console.log('Error building plugins. ', err); + console.log('Error building plugins.'); + console.log(err); + process.stderr.write(err); + process.exit(1); + } else if (errors.length) { + errors.forEach(e => { + console.log(e.message) && console.log('\n'); + process.stderr.write(err); + }); + console.log('Build complete with errors'); + process.exit(1); } else { console.log('Done processing plugins!'); } diff --git a/scripts/build/tsconfig-core.json b/scripts/build/tsconfig-core.json index 44b50a3db..88250a7b8 100644 --- a/scripts/build/tsconfig-core.json +++ b/scripts/build/tsconfig-core.json @@ -13,7 +13,8 @@ "skipLibCheck": true, "lib": ["es2015", "dom"], "sourceMap": true, - "inlineSources": true + "inlineSources": true, + "noImplicitAny": true }, "files": [ "../../src/@ionic-native/core/index.ts" diff --git a/scripts/build/tsconfig-plugin.json b/scripts/build/tsconfig-plugin.json index 3cfd5dca3..3e4a6d6f8 100644 --- a/scripts/build/tsconfig-plugin.json +++ b/scripts/build/tsconfig-plugin.json @@ -16,7 +16,8 @@ "skipLibCheck": true, "lib": ["es2015", "dom"], "sourceMap": true, - "inlineSources": true + "inlineSources": true, + "noImplicitAny": true }, "files": [] } diff --git a/scripts/ci-tests.js b/scripts/ci-tests.js new file mode 100644 index 000000000..d4ff8eea9 --- /dev/null +++ b/scripts/ci-tests.js @@ -0,0 +1,65 @@ +const exec = require('child-process-promise').exec; +let diff; +exec(`git branch | grep \\* | cut -d ' ' -f2`) + .then(output => { + if (output.stderr) { + return Promise.reject(output.stderr); + } + + const branch = output.stdout.trim(); + + if (branch !== 'master') { + + console.log('Merging master branch in ...'); + // not on master branch + // let's test the changes that were made + return exec(`git merge origin master`); + } + }) + .then((output) => { + if (output && output.stderr) { + return Promise.reject(output.stderr); + } + console.log('Checking for differences ...'); + return exec(`git diff --name-status origin master`) + }) + .then((output) => { + if (output && output.stderr) { + return Promise.reject(output.stderr); + } + + diff = output.stdout; + diff = diff.replace(/A\s+/g, ''); + diff = diff.match(/src\/@ionic-native\/plugins\/([a-zA-Z0-9\-]+)\/index\.ts/g); + + if (!diff) process.exit(); + + console.log(`${ diff.length } plugins were modified. We will now build them to verify they still work.`); + + return exec('npm run build:core --silent'); + }) + .then((output) => { + + if (output && output.stderr) { + return Promise.reject(output.stderr); + } + + console.log('Built core library successfully ...'); + console.log('Building plugins ...'); + + diff = diff.map(text => text.replace('src/@ionic-native/plugins/', '').replace('/index.ts', '')); + + return exec(`npm run build:modules ${diff.join(' ')} --silent`); + }) + .then((output) => { + if (output && output.stderr) { + console.log(output.stderr); + process.exit(1); + } + console.log(output.stdout); + process.exit(); + }) + .catch(e => { + console.log(e.message || e); + process.exit(1); + }); diff --git a/scripts/docs/templates/readme.template.md b/scripts/docs/templates/readme.template.md index 69fd10d5e..be66fad9c 100644 --- a/scripts/docs/templates/readme.template.md +++ b/scripts/docs/templates/readme.template.md @@ -16,7 +16,7 @@ <@ for prop in doc.decorators[0].argumentInfo @> ``` -$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif @> +$ <@ if prop.install @><$ prop.install $><@ else @>ionic cordova plugin add <$ prop.plugin $><@ endif @> $ npm install --save @ionic-native/<$ doc.npmId $> ``` diff --git a/scripts/templates/wrap-min.tmpl b/scripts/templates/wrap-min.tmpl index 83aa48ff2..68a6bba1d 100644 --- a/scripts/templates/wrap-min.tmpl +++ b/scripts/templates/wrap-min.tmpl @@ -2,15 +2,15 @@ import { Plugin, IonicNativePlugin } from '@ionic-native/core'; import { Injectable } from '@angular/core'; /** - * @name $Plugin_Name + * @name {{ Plugin_Name }} * @description * * @usage * ``` - * import { $PluginName } from 'ionic-native'; + * import { {{ PluginName }} } from '@ionic-native/{{ plugin-name }}'; * * - * constructor(private $pluginName: $PluginName) { } + * constructor(private {{ pluginName }}: {{ PluginName }}) { } * * ... * @@ -18,13 +18,13 @@ import { Injectable } from '@angular/core'; * ``` */ @Plugin({ - pluginName: '$PluginName', + pluginName: '{{ PluginName }}', plugin: '', pluginRef: '', repo: '', platforms: [] }) @Injectable() -export class $PluginName extends IonicNativePlugin { +export class {{ PluginName }} extends IonicNativePlugin { } diff --git a/scripts/templates/wrap.tmpl b/scripts/templates/wrap.tmpl index 596d3442f..8f5228e1a 100644 --- a/scripts/templates/wrap.tmpl +++ b/scripts/templates/wrap.tmpl @@ -10,33 +10,33 @@ * - Remove this note * */ -import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty, IonicNativePlugin } from '@ionic-native/core'; import { Injectable } from '@angular/core'; +import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty, IonicNativePlugin } from '@ionic-native/core'; import { Observable } from 'rxjs/Observable'; /** - * @name $Plugin_Name + * @name {{ Plugin_Name }} * @description * This plugin does something * * @usage * ``` - * import { $PluginName } from 'ionic-native'; + * import { {{ PluginName }} } from '@ionic-native/{{ plugin-name }}'; * * - * constructor(private $pluginName: $PluginName) { } + * constructor(private {{ pluginName }}: {{ PluginName }}) { } * * ... * * - * this.$pluginName.functionName('Hello', 123) + * this.{{ pluginName }}.functionName('Hello', 123) * .then((res: any) => console.log(res)) * .catch((error: any) => console.error(error)); * * ``` */ @Plugin({ - pluginName: '$PluginName', + pluginName: '{{ PluginName }}', plugin: '', // npm package name, example: cordova-plugin-camera pluginRef: '', // the variable reference to call the plugin, example: navigator.geolocation repo: '', // the github repository URL for the plugin @@ -44,7 +44,7 @@ import { Observable } from 'rxjs/Observable'; install: '', // OPTIONAL install command, in case the plugin requires variables }) @Injectable() -export class $PluginName extends IonicNativePlugin { +export class {{ PluginName }} extends IonicNativePlugin { /** * This function does something diff --git a/src/@ionic-native/core/bootstrap.ts b/src/@ionic-native/core/bootstrap.ts index a8557a182..09ac37f15 100644 --- a/src/@ionic-native/core/bootstrap.ts +++ b/src/@ionic-native/core/bootstrap.ts @@ -1,5 +1,3 @@ -declare var window; - export function checkReady() { const DEVICE_READY_TIMEOUT = 5000; @@ -16,7 +14,7 @@ export function checkReady() { }); setTimeout(() => { - if (!didFireReady && window.cordova) { + if (!didFireReady && !!window.cordova) { console.warn(`Ionic Native: deviceready did not fire within ${DEVICE_READY_TIMEOUT}ms. This can happen when plugins are in an inconsistent state. Try removing plugins from plugins/ and reinstalling them.`); } }, DEVICE_READY_TIMEOUT); diff --git a/src/@ionic-native/core/decorators.spec.ts b/src/@ionic-native/core/decorators.spec.ts new file mode 100644 index 000000000..6f47476f8 --- /dev/null +++ b/src/@ionic-native/core/decorators.spec.ts @@ -0,0 +1,234 @@ +import 'core-js'; +import { Plugin, Cordova, CordovaProperty, CordovaCheck, CordovaInstance, InstanceProperty } from './decorators'; +import { IonicNativePlugin } from './ionic-native-plugin'; +import { ERR_CORDOVA_NOT_AVAILABLE, ERR_PLUGIN_NOT_INSTALLED } from './plugin'; + +declare const window: any; + +class TestObject { + + constructor(public _objectInstance: any) {} + + @InstanceProperty + name: string; + + @CordovaInstance({ sync: true }) + pingSync(): string { return; } + + @CordovaInstance() + ping(): Promise { return; } + +} + +@Plugin({ + pluginName: 'TestPlugin', + pluginRef: 'testPlugin', + repo: '', + plugin: 'cordova-plugin-my-plugin' +}) +class TestPlugin extends IonicNativePlugin { + + @CordovaProperty + name: string; + + @Cordova({ sync: true }) + pingSync(): string { return; } + + @Cordova() + ping(): Promise { return; } + + @CordovaCheck() + customPing(): Promise { + return Promise.resolve('pong'); + } + + create(): TestObject { + return new TestObject(TestPlugin.getPlugin().create()); + } + +} + +function definePlugin() { + (window as any).testPlugin = { + name: 'John Smith', + ping: (success: Function, error: Function) => success('pong'), + pingSync: () => 'pong', + create: function TestObject() { + this.pingSync = () => 'pong'; + this.ping = (success: Function, error: Function) => success('pong'); + this.name = 'John Smith'; + return this; + } + }; +} + +describe('Regular Decorators', () => { + + let plugin: TestPlugin; + + beforeEach(() => { + plugin = new TestPlugin(); + definePlugin(); + }); + + describe('Plugin', () => { + + it('should set pluginName', () => { + expect(TestPlugin.getPluginName()).toEqual('TestPlugin'); + }); + + it('should set pluginRef', () => { + expect(TestPlugin.getPluginRef()).toEqual('testPlugin'); + }); + + it('should return original plugin object', () => { + expect(TestPlugin.getPlugin()).toEqual(window.testPlugin); + }); + + }); + + describe('Cordova', () => { + + it('should do a sync function', () => { + expect(plugin.pingSync()).toEqual('pong'); + }); + + it('should do an async function', (done: Function) => { + plugin.ping() + .then(res => { + expect(res).toEqual('pong'); + done(); + }) + .catch(e => { + expect(e).toBeUndefined(); + done('Method should have resolved'); + }); + }); + + it('should throw plugin_not_installed error', (done: Function) => { + + delete window.testPlugin; + window.cordova = true; + + expect(plugin.pingSync()).toEqual(ERR_PLUGIN_NOT_INSTALLED); + + plugin.ping() + .catch(e => { + expect(e).toEqual(ERR_PLUGIN_NOT_INSTALLED.error); + delete window.cordova; + done(); + }); + + }); + + it('should throw cordova_not_available error', (done: Function) => { + + delete window.testPlugin; + + expect(plugin.pingSync()).toEqual(ERR_CORDOVA_NOT_AVAILABLE); + + plugin.ping() + .catch(e => { + expect(e).toEqual(ERR_CORDOVA_NOT_AVAILABLE.error); + done(); + }); + + }); + + }); + + describe('CordovaProperty', () => { + + it('should return property value', () => { + expect(plugin.name).toEqual('John Smith'); + }); + + it('should set property value', () => { + plugin.name = 'value2'; + expect(plugin.name).toEqual('value2'); + }); + + }); + + describe('CordovaCheck', () => { + + it('should run the method when plugin exists', (done) => { + plugin.customPing() + .then(res => { + expect(res).toEqual('pong'); + done(); + }); + }); + + it('shouldnt run the method when plugin doesnt exist', (done) => { + delete window.testPlugin; + window.cordova = true; + plugin.customPing() + .catch(e => { + expect(e).toEqual(ERR_PLUGIN_NOT_INSTALLED.error); + done(); + }); + }); + + }); + +}); + +describe('Instance Decorators', () => { + + let instance: TestObject, + plugin: TestPlugin; + + beforeEach(() => { + definePlugin(); + plugin = new TestPlugin(); + instance = plugin.create(); + }); + + describe('Instance plugin', () => { + + + + }); + + describe('CordovaInstance', () => { + + it('should call instance async method', (done) => { + instance.ping() + .then(r => { + expect(r).toEqual('pong'); + done(); + }); + }); + + it('should call instance sync method', () => { + expect(instance.pingSync()).toEqual('pong'); + }); + + it('shouldnt call instance method when _objectInstance is undefined', () => { + + delete instance._objectInstance; + instance.ping() + .then(r => { + expect(r).toBeUndefined(); + }) + .catch(e => { + expect(e).toBeUndefined(); + }); + + }); + + }); + + describe('InstanceProperty', () => { + it('should return property value', () => { + expect(instance.name).toEqual('John Smith'); + }); + + it('should set property value', () => { + instance.name = 'John Cena'; + expect(instance.name).toEqual('John Cena'); + }); + }); + +}); diff --git a/src/@ionic-native/core/decorators.ts b/src/@ionic-native/core/decorators.ts index 00d665eb3..3429c74c0 100644 --- a/src/@ionic-native/core/decorators.ts +++ b/src/@ionic-native/core/decorators.ts @@ -32,6 +32,8 @@ export interface PluginConfig { * Supported platforms */ platforms?: string[]; + + [key: string]: any; } export interface CordovaOptions { @@ -127,10 +129,10 @@ export function InstanceCheck(opts: CordovaCheckOptions = {}) { if (opts.sync) { return; } else if (opts.observable) { - return new Observable(() => {}); + return new Observable(() => { }); } - return getPromise(() => {}); + return getPromise(() => { }); } } @@ -182,12 +184,12 @@ export function CordovaCheck(opts: CordovaCheckOptions = {}) { * } * ``` */ -export function Plugin(config: PluginConfig) { - return function(cls) { +export function Plugin(config: PluginConfig): ClassDecorator { + return function(cls: any) { // Add these fields to the class - for (let k in config) { - cls[k] = config[k]; + for (let prop in config) { + cls[prop] = config[prop]; } cls['installed'] = function(printWarning?: boolean) { @@ -290,10 +292,10 @@ export function CordovaProperty(target: any, key: string) { export function InstanceProperty(target: any, key: string) { Object.defineProperty(target, key, { enumerable: true, - get: function(){ + get: function() { return this._objectInstance[key]; }, - set: function(value){ + set: function(value) { this._objectInstance[key] = value; } }); diff --git a/src/@ionic-native/core/ionic-native-plugin.ts b/src/@ionic-native/core/ionic-native-plugin.ts index 2fdedc5a9..dc5c30025 100644 --- a/src/@ionic-native/core/ionic-native-plugin.ts +++ b/src/@ionic-native/core/ionic-native-plugin.ts @@ -21,7 +21,7 @@ export class IonicNativePlugin { /** * Returns the original plugin object */ - static getPlugin(): any {} + static getPlugin(): any { } /** * Returns the plugin's name diff --git a/src/@ionic-native/core/plugin.ts b/src/@ionic-native/core/plugin.ts index f92f55141..90d8876b0 100644 --- a/src/@ionic-native/core/plugin.ts +++ b/src/@ionic-native/core/plugin.ts @@ -7,8 +7,11 @@ import 'rxjs/add/observable/fromEvent'; checkReady(); -declare var window; -declare var Promise; +// declare const window; +// declare var Promise; + +export const ERR_CORDOVA_NOT_AVAILABLE = { error: 'cordova_not_available' }; +export const ERR_PLUGIN_NOT_INSTALLED = { error: 'plugin_not_installed' }; /** @@ -16,8 +19,8 @@ declare var Promise; * @return {boolean | { error: string } } * @private */ -export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string); -export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string); +export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string): boolean | { error: string }; +export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string): boolean | { error: string }; export function checkAvailability(plugin: any, methodName?: string, pluginName?: string): boolean | { error: string } { let pluginRef, pluginInstance, pluginPackage; @@ -35,15 +38,11 @@ export function checkAvailability(plugin: any, methodName?: string, pluginName?: if (!pluginInstance || (!!methodName && typeof pluginInstance[methodName] === 'undefined')) { if (!window.cordova) { cordovaWarn(pluginName, methodName); - return { - error: 'cordova_not_available' - }; + return ERR_CORDOVA_NOT_AVAILABLE; } pluginWarn(pluginName, pluginPackage, methodName); - return { - error: 'plugin_not_installed' - }; + return ERR_PLUGIN_NOT_INSTALLED; } return true; @@ -69,7 +68,7 @@ function setIndex(args: any[], opts: any = {}, resolve?: Function, reject?: Func args.unshift(reject); args.unshift(resolve); } else if (opts.callbackStyle === 'node') { - args.push((err, result) => { + args.push((err: any, result: any) => { if (err) { reject(err); } else { @@ -135,8 +134,8 @@ function callCordovaPlugin(pluginObj: any, methodName: string, args: any[], opts } function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) { - let pluginResult, rej; - const p = getPromise((resolve, reject) => { + let pluginResult: any, rej: Function; + const p = getPromise((resolve: Function, reject: Function) => { pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject); rej = reject; }); @@ -145,13 +144,13 @@ function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: any // to error if (pluginResult && pluginResult.error) { p.catch(() => { }); - rej(pluginResult.error); + typeof rej === 'function' && rej(pluginResult.error); } return p; } -function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any= {}) { - return getPromise((resolve, reject) => { +function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) { + return getPromise((resolve: Function, reject: Function) => { const pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts); if (pluginResult) { if (pluginResult.error) { @@ -225,7 +224,7 @@ export function overrideFunction(pluginObj: any, methodName: string, args: any[] if (availabilityCheck === true) { const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef()); pluginInstance[methodName] = observer.next.bind(observer); - return () => pluginInstance[methodName] = () => {}; + return () => pluginInstance[methodName] = () => { }; } else { observer.error(availabilityCheck); observer.complete(); @@ -239,7 +238,7 @@ export function overrideFunction(pluginObj: any, methodName: string, args: any[] * @private */ export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOptions = {}) { - return (...args) => { + return (...args: any[]) => { if (opts.sync) { // Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is return callCordovaPlugin(pluginObj, methodName, args, opts); @@ -259,7 +258,7 @@ export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOp * @private */ export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) { - return (...args) => { + return (...args: any[]) => { if (opts.sync) { return callInstance(pluginObj, methodName, args, opts); @@ -289,7 +288,7 @@ export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) } else if (opts.otherPromise) { - return getPromise((resolve, reject) => { + return getPromise((resolve: Function, reject: Function) => { let result = callInstance(pluginObj, methodName, args, opts, resolve, reject); if (result && !result.error) { result.then(resolve, reject); @@ -298,14 +297,14 @@ export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) } else { - let pluginResult, rej; - const p = getPromise((resolve, reject) => { + let pluginResult: any, rej: Function; + const p = getPromise((resolve: Function, reject: Function) => { pluginResult = callInstance(pluginObj, methodName, args, opts, resolve, reject); rej = reject; }); if (pluginResult && pluginResult.error) { p.catch(() => { }); - rej(pluginResult.error); + typeof rej === 'function' && rej(pluginResult.error); } return p; diff --git a/src/@ionic-native/core/util.ts b/src/@ionic-native/core/util.ts index cfc43e5f1..31d0a4533 100644 --- a/src/@ionic-native/core/util.ts +++ b/src/@ionic-native/core/util.ts @@ -1,27 +1,28 @@ -declare var window: any; +declare const window: any; /** * @private */ -export function get(obj, path) { - path = path.split('.'); - for (let i = 0; i < path.length; i++) { +export const get = (element: Element | Window, path: string): any => { + const paths: string[] = path.split('.'); + let obj: any = element; + for (let i: number = 0; i < paths.length; i++) { if (!obj) { return null; } - obj = obj[path[i]]; + obj = obj[paths[i]]; } return obj; -} +}; /** * @private */ -export function getPromise(cb) { +export const getPromise = (callback: Function): Promise => { const tryNativePromise = () => { if (window.Promise) { return new Promise((resolve, reject) => { - cb(resolve, reject); + callback(resolve, reject); }); } else { console.error('No Promise support or polyfill found. To enable Ionic Native support, please add the es6-promise polyfill before this script, or run with a library like Angular 2 or on a recent browser.'); @@ -29,21 +30,21 @@ export function getPromise(cb) { }; return tryNativePromise(); -} +}; /** * @private * @param pluginRef * @returns {null|*} */ -export function getPlugin(pluginRef: string): any { +export const getPlugin = (pluginRef: string): any => { return get(window, pluginRef); }; /** * @private */ -export const pluginWarn = function(pluginName: string, plugin?: string, method?: string) { +export const pluginWarn = (pluginName: string, plugin?: string, method?: string): void => { if (method) { console.warn('Native: tried calling ' + pluginName + '.' + method + ', but the ' + pluginName + ' plugin is not installed.'); } else { @@ -59,7 +60,7 @@ export const pluginWarn = function(pluginName: string, plugin?: string, method?: * @param pluginName * @param method */ -export const cordovaWarn = function(pluginName: string, method?: string) { +export const cordovaWarn = (pluginName: string, method?: string): void => { if (method) { console.warn('Native: tried calling ' + pluginName + '.' + method + ', but Cordova is not available. Make sure to include cordova.js or run in a device/simulator'); } else { diff --git a/src/@ionic-native/plugins/admob-free/index.ts b/src/@ionic-native/plugins/admob-free/index.ts index f70dc65f1..a83166473 100644 --- a/src/@ionic-native/plugins/admob-free/index.ts +++ b/src/@ionic-native/plugins/admob-free/index.ts @@ -69,7 +69,7 @@ export interface AdMobFreeRewardVideoConfig { * @description * * @usage - * ``` + * ```typescript * import { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free'; * * diff --git a/src/@ionic-native/plugins/admob/index.ts b/src/@ionic-native/plugins/admob/index.ts index 428e199ba..531a48314 100644 --- a/src/@ionic-native/plugins/admob/index.ts +++ b/src/@ionic-native/plugins/admob/index.ts @@ -95,9 +95,10 @@ export interface AdExtras { * Plugin for Google Ads, including AdMob / DFP (doubleclick for publisher) and mediations to other Ad networks. * @usage * ```typescript - * import { AdMob, AdMobOptions, AdSize, AdExtras } from '@ionic-native/admob'; + * import { AdMob } from '@ionic-native/admob'; + * import { Platform } from 'ionic-angular'; * - * constructor(private admob: AdMob){} + * constructor(private admob: AdMob, private platform: Platform ) { } * * ionViewDidLoad() { * this.admob.onAdDismiss() @@ -105,7 +106,13 @@ export interface AdExtras { * } * * onClick() { - * this.admob.prepareInterstitial('YOUR_ADID') + * let adId; + * if(this.platform.is('android')) { + * adId = 'YOUR_ADID_ANDROID'; + * } else if (this.platform.is('ios')) { + * adId = 'YOUR_ADID_IOS'; + * } + * this.admob.prepareInterstitial({adId: adId}) * .then(() => { this.admob.showInterstitial(); }); * } * diff --git a/src/@ionic-native/plugins/alipay/index.ts b/src/@ionic-native/plugins/alipay/index.ts index f2eb5ffe4..51cc6337e 100644 --- a/src/@ionic-native/plugins/alipay/index.ts +++ b/src/@ionic-native/plugins/alipay/index.ts @@ -1,6 +1,8 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; import { Injectable } from '@angular/core'; + + export interface AlipayOrder { /** * appId assigned by Alipay @@ -67,7 +69,7 @@ export interface AlipayOrder { * Requires Cordova plugin: `cordova-alipay-base`. For more info, please see the [Alipay plugin docs](https://github.com/xueron/cordova-alipay-base). * * @usage - * ``` + * ```typescript * import { Alipay, AlipayOrder } from '@ionic-native/alipay'; * * constructor(private alipay: Alipay) { @@ -112,4 +114,3 @@ export class Alipay extends IonicNativePlugin { @Cordova() pay(order: AlipayOrder): Promise { return; } } - diff --git a/src/@ionic-native/plugins/android-fingerprint-auth/index.ts b/src/@ionic-native/plugins/android-fingerprint-auth/index.ts index b48b19ae0..2d14f6bcc 100644 --- a/src/@ionic-native/plugins/android-fingerprint-auth/index.ts +++ b/src/@ionic-native/plugins/android-fingerprint-auth/index.ts @@ -102,7 +102,7 @@ export interface AFAEncryptResponse { * This plugin will open a native dialog fragment prompting the user to authenticate using their fingerprint. If the device has a secure lockscreen (pattern, PIN, or password), the user may opt to authenticate using that method as a backup. * @usage * ```typescript - * import { AndroidFingerprintAuth, AFAAuthOptions } from '@ionic-native/android-fingerprint-auth'; + * import { AndroidFingerprintAuth } from '@ionic-native/android-fingerprint-auth'; * * constructor(private androidFingerprintAuth: AndroidFingerprintAuth) { } * @@ -114,18 +114,18 @@ export interface AFAEncryptResponse { * if(result.isAvailable){ * // it is available * - * this.androidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" }) + * this.androidFingerprintAuth.encrypt({ clientId: 'myAppName', username: 'myUsername', password: 'myPassword' }) * .then(result => { * if (result.withFingerprint) { - * console.log("Successfully encrypted credentials."); - * console.log("Encrypted credentials: " + result.token); + * console.log('Successfully encrypted credentials.'); + * console.log('Encrypted credentials: ' + result.token); * } else if (result.withBackup) { * console.log('Successfully authenticated with backup password!'); * } else console.log('Didn\'t authenticate!'); * }) * .catch(error => { - * if (error === "Cancelled") { - * console.log("Fingerprint authentication cancelled"); + * if (error === this.androidFingerprintAuth.ERRORS.FINGERPRINT_CANCELLED) { + * console.log('Fingerprint authentication cancelled'); * } else console.error(error) * }); * @@ -150,13 +150,26 @@ export interface AFAEncryptResponse { @Injectable() export class AndroidFingerprintAuth extends IonicNativePlugin { - /** - * Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device. - * @param options {AFAAuthOptions} Options - * @returns {Promise} - */ - @Cordova() - encrypt(options: AFAAuthOptions): Promise {return; } + ERRORS: { + BAD_PADDING_EXCEPTION: 'BAD_PADDING_EXCEPTION', + CERTIFICATE_EXCEPTION: 'CERTIFICATE_EXCEPTION', + FINGERPRINT_CANCELLED: 'FINGERPRINT_CANCELLED', + FINGERPRINT_DATA_NOT_DELETED: 'FINGERPRINT_DATA_NOT_DELETED', + FINGERPRINT_ERROR: 'FINGERPRINT_ERROR', + FINGERPRINT_NOT_AVAILABLE: 'FINGERPRINT_NOT_AVAILABLE', + FINGERPRINT_PERMISSION_DENIED: 'FINGERPRINT_PERMISSION_DENIED', + FINGERPRINT_PERMISSION_DENIED_SHOW_REQUEST: 'FINGERPRINT_PERMISSION_DENIED_SHOW_REQUEST', + ILLEGAL_BLOCK_SIZE_EXCEPTION: 'ILLEGAL_BLOCK_SIZE_EXCEPTION', + INIT_CIPHER_FAILED: 'INIT_CIPHER_FAILED', + INVALID_ALGORITHM_PARAMETER_EXCEPTION: 'INVALID_ALGORITHM_PARAMETER_EXCEPTION', + IO_EXCEPTION: 'IO_EXCEPTION', + JSON_EXCEPTION: 'JSON_EXCEPTION', + MINIMUM_SDK: 'MINIMUM_SDK', + MISSING_ACTION_PARAMETERS: 'MISSING_ACTION_PARAMETERS', + MISSING_PARAMETERS: 'MISSING_PARAMETERS', + NO_SUCH_ALGORITHM_EXCEPTION: 'NO_SUCH_ALGORITHM_EXCEPTION', + SECURITY_EXCEPTION: 'SECURITY_EXCEPTION' + }; /** * Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device. @@ -164,19 +177,27 @@ export class AndroidFingerprintAuth extends IonicNativePlugin { * @returns {Promise} */ @Cordova() - decrypt(options: AFAAuthOptions): Promise {return; } + encrypt(options: AFAAuthOptions): Promise { return; } + + /** + * Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device. + * @param options {AFAAuthOptions} Options + * @returns {Promise} + */ + @Cordova() + decrypt(options: AFAAuthOptions): Promise { return; } /** * Check if service is available * @returns {Promise} Returns a Promise that resolves if fingerprint auth is available on the device */ @Cordova() - isAvailable(): Promise<{isAvailable: boolean}> { return; } + isAvailable(): Promise<{ isAvailable: boolean }> { return; } /** * Delete the cipher used for encryption and decryption by username * @returns {Promise} Returns a Promise that resolves if the cipher was successfully deleted */ @Cordova() - delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; } + delete(options: { clientId: string; username: string; }): Promise<{ deleted: boolean }> { return; } } diff --git a/src/@ionic-native/plugins/android-permissions/index.ts b/src/@ionic-native/plugins/android-permissions/index.ts new file mode 100644 index 000000000..589ed504c --- /dev/null +++ b/src/@ionic-native/plugins/android-permissions/index.ts @@ -0,0 +1,226 @@ +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; + +/** + * @name Android Permissions + * @description + * This plugin is designed to support Android new permissions checking mechanism. + * + * You can find all permissions here: https://developer.android.com/reference/android/Manifest.permission.html + * + * @usage + * ``` + * import { AndroidPermissions } from '@ionic-native/android-permissions'; + * + * + * constructor(private androidPermissions: AndroidPermissions) { } + * + * ... + * + * this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.CAMERA).then( + * success => console.log('Permission granted'), + * err => this.androidPermissions.requestPermissions(this.androidPermissions.PERMISSION.CAMERA) + * ); + * + * this.androidPermissions.requestPermissions([this.androidPermissions.PERMISSION.CAMERA, this.androidPermissions.PERMISSION.GET_ACCOUNTS]); + * + * ``` + */ +@Plugin({ + pluginName: 'AndroidPermissions', + plugin: 'cordova-plugin-android-permissions', + pluginRef: 'cordova.plugins.permissions', + repo: 'https://github.com/NeoLSN/cordova-plugin-android-permissions', + platforms: ['Android'] +}) +@Injectable() +export class AndroidPermissions extends IonicNativePlugin { + + PERMISSION: any = { + ACCESS_CHECKIN_PROPERTIES: 'android.permission.ACCESS_CHECKIN_PROPERTIES', + ACCESS_COARSE_LOCATION: 'android.permission.ACCESS_COARSE_LOCATION', + ACCESS_FINE_LOCATION: 'android.permission.ACCESS_FINE_LOCATION', + ACCESS_LOCATION_EXTRA_COMMANDS: 'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS', + ACCESS_MOCK_LOCATION: 'android.permission.ACCESS_MOCK_LOCATION', + ACCESS_NETWORK_STATE: 'android.permission.ACCESS_NETWORK_STATE', + ACCESS_SURFACE_FLINGER: 'android.permission.ACCESS_SURFACE_FLINGER', + ACCESS_WIFI_STATE: 'android.permission.ACCESS_WIFI_STATE', + ACCOUNT_MANAGER: 'android.permission.ACCOUNT_MANAGER', + ADD_VOICEMAIL: 'com.android.voicemail.permission.ADD_VOICEMAIL', + AUTHENTICATE_ACCOUNTS: 'android.permission.AUTHENTICATE_ACCOUNTS', + BATTERY_STATS: 'android.permission.BATTERY_STATS', + BIND_ACCESSIBILITY_SERVICE: 'android.permission.BIND_ACCESSIBILITY_SERVICE', + BIND_APPWIDGET: 'android.permission.BIND_APPWIDGET', + BIND_CARRIER_MESSAGING_SERVICE: 'android.permission.BIND_CARRIER_MESSAGING_SERVICE', + BIND_DEVICE_ADMIN: 'android.permission.BIND_DEVICE_ADMIN', + BIND_DREAM_SERVICE: 'android.permission.BIND_DREAM_SERVICE', + BIND_INPUT_METHOD: 'android.permission.BIND_INPUT_METHOD', + BIND_NFC_SERVICE: 'android.permission.BIND_NFC_SERVICE', + BIND_NOTIFICATION_LISTENER_SERVICE: 'android.permission.BIND_NOTIFICATION_LISTENER_SERVICE', + BIND_PRINT_SERVICE: 'android.permission.BIND_PRINT_SERVICE', + BIND_REMOTEVIEWS: 'android.permission.BIND_REMOTEVIEWS', + BIND_TEXT_SERVICE: 'android.permission.BIND_TEXT_SERVICE', + BIND_TV_INPUT: 'android.permission.BIND_TV_INPUT', + BIND_VOICE_INTERACTION: 'android.permission.BIND_VOICE_INTERACTION', + BIND_VPN_SERVICE: 'android.permission.BIND_VPN_SERVICE', + BIND_WALLPAPER: 'android.permission.BIND_WALLPAPER', + BLUETOOTH: 'android.permission.BLUETOOTH', + BLUETOOTH_ADMIN: 'android.permission.BLUETOOTH_ADMIN', + BLUETOOTH_PRIVILEGED: 'android.permission.BLUETOOTH_PRIVILEGED', + BODY_SENSORS: 'android.permission.BODY_SENSORS', + BRICK: 'android.permission.BRICK', + BROADCAST_PACKAGE_REMOVED: 'android.permission.BROADCAST_PACKAGE_REMOVED', + BROADCAST_SMS: 'android.permission.BROADCAST_SMS', + BROADCAST_STICKY: 'android.permission.BROADCAST_STICKY', + BROADCAST_WAP_PUSH: 'android.permission.BROADCAST_WAP_PUSH', + CALL_PHONE: 'android.permission.CALL_PHONE', + CALL_PRIVILEGED: 'android.permission.CALL_PRIVILEGED', + CAMERA: 'android.permission.CAMERA', + CAPTURE_AUDIO_OUTPUT: 'android.permission.CAPTURE_AUDIO_OUTPUT', + CAPTURE_SECURE_VIDEO_OUTPUT: 'android.permission.CAPTURE_SECURE_VIDEO_OUTPUT', + CAPTURE_VIDEO_OUTPUT: 'android.permission.CAPTURE_VIDEO_OUTPUT', + CHANGE_COMPONENT_ENABLED_STATE: 'android.permission.CHANGE_COMPONENT_ENABLED_STATE', + CHANGE_CONFIGURATION: 'android.permission.CHANGE_CONFIGURATION', + CHANGE_NETWORK_STATE: 'android.permission.CHANGE_NETWORK_STATE', + CHANGE_WIFI_MULTICAST_STATE: 'android.permission.CHANGE_WIFI_MULTICAST_STATE', + CHANGE_WIFI_STATE: 'android.permission.CHANGE_WIFI_STATE', + CLEAR_APP_CACHE: 'android.permission.CLEAR_APP_CACHE', + CLEAR_APP_USER_DATA: 'android.permission.CLEAR_APP_USER_DATA', + CONTROL_LOCATION_UPDATES: 'android.permission.CONTROL_LOCATION_UPDATES', + DELETE_CACHE_FILES: 'android.permission.DELETE_CACHE_FILES', + DELETE_PACKAGES: 'android.permission.DELETE_PACKAGES', + DEVICE_POWER: 'android.permission.DEVICE_POWER', + DIAGNOSTIC: 'android.permission.DIAGNOSTIC', + DISABLE_KEYGUARD: 'android.permission.DISABLE_KEYGUARD', + DUMP: 'android.permission.DUMP', + EXPAND_STATUS_BAR: 'android.permission.EXPAND_STATUS_BAR', + FACTORY_TEST: 'android.permission.FACTORY_TEST', + FLASHLIGHT: 'android.permission.FLASHLIGHT', + FORCE_BACK: 'android.permission.FORCE_BACK', + GET_ACCOUNTS: 'android.permission.GET_ACCOUNTS', + GET_PACKAGE_SIZE: 'android.permission.GET_PACKAGE_SIZE', + GET_TASKS: 'android.permission.GET_TASKS', + GET_TOP_ACTIVITY_INFO: 'android.permission.GET_TOP_ACTIVITY_INFO', + GLOBAL_SEARCH: 'android.permission.GLOBAL_SEARCH', + HARDWARE_TEST: 'android.permission.HARDWARE_TEST', + INJECT_EVENTS: 'android.permission.INJECT_EVENTS', + INSTALL_LOCATION_PROVIDER: 'android.permission.INSTALL_LOCATION_PROVIDER', + INSTALL_PACKAGES: 'android.permission.INSTALL_PACKAGES', + INSTALL_SHORTCUT: 'com.android.launcher.permission.INSTALL_SHORTCUT', + INTERNAL_SYSTEM_WINDOW: 'android.permission.INTERNAL_SYSTEM_WINDOW', + INTERNET: 'android.permission.INTERNET', + KILL_BACKGROUND_PROCESSES: 'android.permission.KILL_BACKGROUND_PROCESSES', + LOCATION_HARDWARE: 'android.permission.LOCATION_HARDWARE', + MANAGE_ACCOUNTS: 'android.permission.MANAGE_ACCOUNTS', + MANAGE_APP_TOKENS: 'android.permission.MANAGE_APP_TOKENS', + MANAGE_DOCUMENTS: 'android.permission.MANAGE_DOCUMENTS', + MASTER_CLEAR: 'android.permission.MASTER_CLEAR', + MEDIA_CONTENT_CONTROL: 'android.permission.MEDIA_CONTENT_CONTROL', + MODIFY_AUDIO_SETTINGS: 'android.permission.MODIFY_AUDIO_SETTINGS', + MODIFY_PHONE_STATE: 'android.permission.MODIFY_PHONE_STATE', + MOUNT_FORMAT_FILESYSTEMS: 'android.permission.MOUNT_FORMAT_FILESYSTEMS', + MOUNT_UNMOUNT_FILESYSTEMS: 'android.permission.MOUNT_UNMOUNT_FILESYSTEMS', + NFC: 'android.permission.NFC', + PERSISTENT_ACTIVITY: 'android.permission.PERSISTENT_ACTIVITY', + PROCESS_OUTGOING_CALLS: 'android.permission.PROCESS_OUTGOING_CALLS', + READ_CALENDAR: 'android.permission.READ_CALENDAR', + READ_CALL_LOG: 'android.permission.READ_CALL_LOG', + READ_CONTACTS: 'android.permission.READ_CONTACTS', + READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE', + READ_FRAME_BUFFER: 'android.permission.READ_FRAME_BUFFER', + READ_HISTORY_BOOKMARKS: 'com.android.browser.permission.READ_HISTORY_BOOKMARKS', + READ_INPUT_STATE: 'android.permission.READ_INPUT_STATE', + READ_LOGS: 'android.permission.READ_LOGS', + READ_PHONE_STATE: 'android.permission.READ_PHONE_STATE', + READ_PROFILE: 'android.permission.READ_PROFILE', + READ_SMS: 'android.permission.READ_SMS', + READ_SOCIAL_STREAM: 'android.permission.READ_SOCIAL_STREAM', + READ_SYNC_SETTINGS: 'android.permission.READ_SYNC_SETTINGS', + READ_SYNC_STATS: 'android.permission.READ_SYNC_STATS', + READ_USER_DICTIONARY: 'android.permission.READ_USER_DICTIONARY', + READ_VOICEMAIL: 'com.android.voicemail.permission.READ_VOICEMAIL', + REBOOT: 'android.permission.REBOOT', + RECEIVE_BOOT_COMPLETED: 'android.permission.RECEIVE_BOOT_COMPLETED', + RECEIVE_MMS: 'android.permission.RECEIVE_MMS', + RECEIVE_SMS: 'android.permission.RECEIVE_SMS', + RECEIVE_WAP_PUSH: 'android.permission.RECEIVE_WAP_PUSH', + RECORD_AUDIO: 'android.permission.RECORD_AUDIO', + REORDER_TASKS: 'android.permission.REORDER_TASKS', + RESTART_PACKAGES: 'android.permission.RESTART_PACKAGES', + SEND_RESPOND_VIA_MESSAGE: 'android.permission.SEND_RESPOND_VIA_MESSAGE', + SEND_SMS: 'android.permission.SEND_SMS', + SET_ACTIVITY_WATCHER: 'android.permission.SET_ACTIVITY_WATCHER', + SET_ALARM: 'com.android.alarm.permission.SET_ALARM', + SET_ALWAYS_FINISH: 'android.permission.SET_ALWAYS_FINISH', + SET_ANIMATION_SCALE: 'android.permission.SET_ANIMATION_SCALE', + SET_DEBUG_APP: 'android.permission.SET_DEBUG_APP', + SET_ORIENTATION: 'android.permission.SET_ORIENTATION', + SET_POINTER_SPEED: 'android.permission.SET_POINTER_SPEED', + SET_PREFERRED_APPLICATIONS: 'android.permission.SET_PREFERRED_APPLICATIONS', + SET_PROCESS_LIMIT: 'android.permission.SET_PROCESS_LIMIT', + SET_TIME: 'android.permission.SET_TIME', + SET_TIME_ZONE: 'android.permission.SET_TIME_ZONE', + SET_WALLPAPER: 'android.permission.SET_WALLPAPER', + SET_WALLPAPER_HINTS: 'android.permission.SET_WALLPAPER_HINTS', + SIGNAL_PERSISTENT_PROCESSES: 'android.permission.SIGNAL_PERSISTENT_PROCESSES', + STATUS_BAR: 'android.permission.STATUS_BAR', + SUBSCRIBED_FEEDS_READ: 'android.permission.SUBSCRIBED_FEEDS_READ', + SUBSCRIBED_FEEDS_WRITE: 'android.permission.SUBSCRIBED_FEEDS_WRITE', + SYSTEM_ALERT_WINDOW: 'android.permission.SYSTEM_ALERT_WINDOW', + TRANSMIT_IR: 'android.permission.TRANSMIT_IR', + UNINSTALL_SHORTCUT: 'com.android.launcher.permission.UNINSTALL_SHORTCUT', + UPDATE_DEVICE_STATS: 'android.permission.UPDATE_DEVICE_STATS', + USE_CREDENTIALS: 'android.permission.USE_CREDENTIALS', + USE_SIP: 'android.permission.USE_SIP', + VIBRATE: 'android.permission.VIBRATE', + WAKE_LOCK: 'android.permission.WAKE_LOCK', + WRITE_APN_SETTINGS: 'android.permission.WRITE_APN_SETTINGS', + WRITE_CALENDAR: 'android.permission.WRITE_CALENDAR', + WRITE_CALL_LOG: 'android.permission.WRITE_CALL_LOG', + WRITE_CONTACTS: 'android.permission.WRITE_CONTACTS', + WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE', + WRITE_GSERVICES: 'android.permission.WRITE_GSERVICES', + WRITE_HISTORY_BOOKMARKS: 'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS', + WRITE_PROFILE: 'android.permission.WRITE_PROFILE', + WRITE_SECURE_SETTINGS: 'android.permission.WRITE_SECURE_SETTINGS', + WRITE_SETTINGS: 'android.permission.WRITE_SETTINGS', + WRITE_SMS: 'android.permission.WRITE_SMS', + WRITE_SOCIAL_STREAM: 'android.permission.WRITE_SOCIAL_STREAM', + WRITE_SYNC_SETTINGS: 'android.permission.WRITE_SYNC_SETTINGS', + WRITE_USER_DICTIONARY: 'android.permission.WRITE_USER_DICTIONARY', + WRITE_VOICEMAIL: 'com.android.voicemail.permission.WRITE_VOICEMAIL', + }; + + /** + * Check permission + * @param permission {string} The name of the permission + * @return {Promise} Returns a promise + */ + @Cordova() + checkPermission(permission: string): Promise { return; } + + /** + * Request permission + * @param permission {string} The name of the permission to request + * @return {Promise} + */ + @Cordova() + requestPermission(permission: string): Promise { return; } + + /** + * Request permissions + * @param permissions {Array} An array with permissions + * @return {Promise} Returns a promise + */ + @Cordova() + requestPermissions(permissions: string[]): Promise { return; } + + /** + * This function still works now, will not support in the future. + * @param permission {string} The name of the permission + * @return {Promise} Returns a promise + */ + @Cordova() + hasPermission(permission: string): Promise { return; } + +} diff --git a/src/@ionic-native/plugins/app-minimize/index.ts b/src/@ionic-native/plugins/app-minimize/index.ts new file mode 100644 index 000000000..06879444e --- /dev/null +++ b/src/@ionic-native/plugins/app-minimize/index.ts @@ -0,0 +1,42 @@ +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; + +/** + * @name App Minimize + * @description + * AppMinimize is a plugin to minimize the application on android devices + * + * @usage + * ```typescript + * import { AppMinimize } from '@ionic-native/app-minimize'; + * + * + * constructor(private appMinimize: AppMinimize) { } + * + * ... + * + * this.plugin.minimize().then( + * success => console.log('Closed'), + * err => console.log('Something went wrong') + * ); + * + * ``` + */ +@Plugin({ + pluginName: 'AppMinimize', + plugin: 'https://github.com/tomloprod/cordova-plugin-appminimize.git', + pluginRef: 'plugins.appMinimize', + repo: 'https://github.com/tomloprod/cordova-plugin-appminimize', + platforms: ['Android'] +}) +@Injectable() +export class AppMinimize extends IonicNativePlugin { + + /** + * Minimizes the application + * @return {Promise} + */ + @Cordova() + minimize(): Promise { return; } + +} diff --git a/src/@ionic-native/plugins/app-preferences/index.ts b/src/@ionic-native/plugins/app-preferences/index.ts index 95019a69e..0d86ce7e2 100644 --- a/src/@ionic-native/plugins/app-preferences/index.ts +++ b/src/@ionic-native/plugins/app-preferences/index.ts @@ -11,11 +11,12 @@ import { Injectable } from '@angular/core'; * ```typescript * import { AppPreferences } from '@ionic-native/app-preferences'; * - * constructor(private appPreferences: AppPreferences) { + * constructor(private appPreferences: AppPreferences) { } * - * this.appPreferences.fetch('key').then((res) => { console.log(res); }); + * ... + * + * this.appPreferences.fetch('key').then((res) => { console.log(res); }); * - * } * ``` * */ @@ -46,13 +47,13 @@ export class AppPreferences extends IonicNativePlugin { * * @param {string} dict Dictionary for key (OPTIONAL) * @param {string} key Key - * @param {string} value Value + * @param {any} value Value * @return {Promise} Returns a promise */ @Cordova({ callbackOrder: 'reverse' }) - store(dict: string, key: string, value?: string): Promise { + store(dict: string, key: string, value?: any): Promise { return; } diff --git a/src/@ionic-native/plugins/app-rate/index.ts b/src/@ionic-native/plugins/app-rate/index.ts index 992b37888..99317a02a 100644 --- a/src/@ionic-native/plugins/app-rate/index.ts +++ b/src/@ionic-native/plugins/app-rate/index.ts @@ -1,9 +1,6 @@ import { Injectable } from '@angular/core'; import { Cordova, CordovaProperty, Plugin, IonicNativePlugin } from '@ionic-native/core'; - -declare var window; - export interface AppRatePreferences { /** @@ -110,12 +107,24 @@ export interface AppUrls { * constructor(private appRate: AppRate) { } * * ... + * // set certain preferences + * this.appRate.preferences.storeAppURL = { + * ios: '', + * android: 'market://details?id=', + * windows: 'ms-windows-store://review/?ProductId=' + * }; * - * this.appRate.preferences.storeAppURL = { - * ios: '', + * this.appRate.promptForRating(true); + * + * // or, override the whole preferences object + * this.appRate.preferences = { + * usesUntilPrompt: 3, + * storeAppURL: { + * ios: '', * android: 'market://details?id=', - * windows: 'ms-windows-store://review/?ProductId=' - * }; + * windows: 'ms-windows-store://review/?ProductId=' + * } + * }; * * this.appRate.promptForRating(false); * ``` diff --git a/src/@ionic-native/plugins/app-update/index.ts b/src/@ionic-native/plugins/app-update/index.ts index 4ef0c92fa..3b2158ac6 100644 --- a/src/@ionic-native/plugins/app-update/index.ts +++ b/src/@ionic-native/plugins/app-update/index.ts @@ -19,7 +19,7 @@ import { Injectable } from '@angular/core'; * * Then use the following code: * - * ``` + * ```typescript * import { AppUpdate } from '@ionic-native/app-update'; * * constructor(private appUpdate: AppUpdate) { @@ -28,8 +28,6 @@ import { Injectable } from '@angular/core'; * this.appUpdate.checkAppUpdate(updateUrl); * * } - * - * * ``` * * The plugin will compare the app version and update it automatically if the API has a newer version to install. @@ -53,4 +51,3 @@ export class AppUpdate extends IonicNativePlugin { }) checkAppUpdate(updateUrl: string): Promise { return; } } - diff --git a/src/@ionic-native/plugins/appodeal/index.ts b/src/@ionic-native/plugins/appodeal/index.ts index f6ac8046b..5821ce7ce 100644 --- a/src/@ionic-native/plugins/appodeal/index.ts +++ b/src/@ionic-native/plugins/appodeal/index.ts @@ -8,7 +8,7 @@ import { Injectable } from '@angular/core'; * Plugin to serve ads through native Appodeal SDKs * * @usage - * ``` + * ```typescript * import { Appodeal } from '@ionic-native/appodeal'; * * constructor(private appodeal: Appodeal) { @@ -18,9 +18,6 @@ import { Injectable } from '@angular/core'; * appodeal.show(appodeal.AD_TYPES.REWARDED_VIDEO); * * } - * - * - * * ``` */ @Plugin({ @@ -28,7 +25,7 @@ import { Injectable } from '@angular/core'; plugin: 'https://github.com/appodeal/appodeal-cordova-plugin', pluginRef: 'Appodeal', repo: 'https://github.com/appodeal/appodeal-cordova-plugin.git', - platforms: [ 'iOS', 'Android' ] + platforms: ['iOS', 'Android'] }) @Injectable() export class Appodeal extends IonicNativePlugin { @@ -49,7 +46,7 @@ export class Appodeal extends IonicNativePlugin { * @param {number} adType */ @Cordova() - initialize(appKey: string, adType: number): void {}; + initialize(appKey: string, adType: number): void { }; /** * check if SDK has been initialized @@ -76,21 +73,21 @@ export class Appodeal extends IonicNativePlugin { showWithPlacement( adType: number, placement: any - ): Promise { return; }; + ): Promise { return; }; /** * hide ad of specified type * @param {number} adType */ @Cordova() - hide(adType: number): void {}; + hide(adType: number): void { }; /** * confirm use of ads of specified type * @param {number} adType */ @Cordova() - confirm(adType: number): void {}; + confirm(adType: number): void { }; /** * check if ad of specified type has been loaded @@ -114,69 +111,69 @@ export class Appodeal extends IonicNativePlugin { * @param autoCache */ @Cordova() - setAutoCache(adType: number, autoCache: any): void {}; + setAutoCache(adType: number, autoCache: any): void { }; /** * forcefully cache an ad by type * @param {number} adType */ @Cordova() - cache(adType: number): void {}; + cache(adType: number): void { }; /** * * @param {boolean} set */ @Cordova() - setOnLoadedTriggerBoth(set: boolean): void {}; + setOnLoadedTriggerBoth(set: boolean): void { }; /** * enable or disable Smart Banners * @param {boolean} enabled */ @Cordova() - setSmartBanners(enabled: boolean): void {}; + setSmartBanners(enabled: boolean): void { }; /** * enable or disable banner backgrounds * @param {boolean} enabled */ @Cordova() - setBannerBackground(enabled: boolean): void {}; + setBannerBackground(enabled: boolean): void { }; /** * enable or disable banner animations * @param {boolean} enabled */ @Cordova() - setBannerAnimation(enabled: boolean): void {}; + setBannerAnimation(enabled: boolean): void { }; /** * * @param value */ @Cordova() - set728x90Banners(value: any): void {}; + set728x90Banners(value: any): void { }; /** * enable or disable logging * @param {boolean} logging */ @Cordova() - setLogging(logging: boolean): void {}; + setLogging(logging: boolean): void { }; /** * enable or disable testing mode * @param {boolean} testing */ @Cordova() - setTesting(testing: boolean): void {}; + setTesting(testing: boolean): void { }; /** * reset device ID */ @Cordova() - resetUUID(): void {}; + resetUUID(): void { }; /** * get version of Appdeal SDK @@ -190,7 +187,7 @@ export class Appodeal extends IonicNativePlugin { * @param {number} adType */ @Cordova() - disableNetwork(network?: string, adType?: number): void {}; + disableNetwork(network?: string, adType?: number): void { }; /** * @@ -198,54 +195,54 @@ export class Appodeal extends IonicNativePlugin { * @param {number} adType */ @Cordova() - disableNetworkType(network?: string, adType?: number): void {}; + disableNetworkType(network?: string, adType?: number): void { }; /** * disable Location permissions for Appodeal SDK */ @Cordova() - disableLocationPermissionCheck(): void {}; + disableLocationPermissionCheck(): void { }; /** * disable Storage permissions for Appodeal SDK */ @Cordova() - disableWriteExternalStoragePermissionCheck(): void {}; + disableWriteExternalStoragePermissionCheck(): void { }; /** * enable event listeners * @param {boolean} enabled */ @Cordova() - enableInterstitialCallbacks(enabled: boolean): void {}; + enableInterstitialCallbacks(enabled: boolean): void { }; /** * enable event listeners * @param {boolean} enabled */ @Cordova() - enableSkippableVideoCallbacks(enabled: boolean): void {}; + enableSkippableVideoCallbacks(enabled: boolean): void { }; /** * enable event listeners * @param {boolean} enabled */ @Cordova() - enableNonSkippableVideoCallbacks(enabled: boolean): void {}; + enableNonSkippableVideoCallbacks(enabled: boolean): void { }; /** * enable event listeners * @param {boolean} enabled */ @Cordova() - enableBannerCallbacks(enabled: boolean): void {}; + enableBannerCallbacks(enabled: boolean): void { }; /** * enable event listeners * @param {boolean} enabled */ @Cordova() - enableRewardedVideoCallbacks(enabled: boolean): void {}; + enableRewardedVideoCallbacks(enabled: boolean): void { }; /** * @@ -253,7 +250,7 @@ export class Appodeal extends IonicNativePlugin { * @param {boolean} value */ @Cordova() - setCustomBooleanRule(name: string, value: boolean): void {}; + setCustomBooleanRule(name: string, value: boolean): void { }; /** * @@ -261,7 +258,7 @@ export class Appodeal extends IonicNativePlugin { * @param {number} value */ @Cordova() - setCustomIntegerRule(name: string, value: number): void {}; + setCustomIntegerRule(name: string, value: number): void { }; /** * set rule with float value @@ -269,7 +266,7 @@ export class Appodeal extends IonicNativePlugin { * @param {number} value */ @Cordova() - setCustomDoubleRule(name: string, value: number): void {}; + setCustomDoubleRule(name: string, value: number): void { }; /** * set rule with string value @@ -277,77 +274,77 @@ export class Appodeal extends IonicNativePlugin { * @param {string} value */ @Cordova() - setCustomStringRule(name: string, value: string): void {}; + setCustomStringRule(name: string, value: string): void { }; /** * set ID preference in Appodeal for current user * @param id */ @Cordova() - setUserId(id: any): void {}; + setUserId(id: any): void { }; /** * set Email preference in Appodeal for current user * @param email */ @Cordova() - setEmail(email: any): void {}; + setEmail(email: any): void { }; /** * set Birthday preference in Appodeal for current user * @param birthday */ @Cordova() - setBirthday(birthday: any): void {}; + setBirthday(birthday: any): void { }; /** * et Age preference in Appodeal for current user * @param age */ @Cordova() - setAge(age: any): void {}; + setAge(age: any): void { }; /** * set Gender preference in Appodeal for current user * @param gender */ @Cordova() - setGender(gender: any): void {}; + setGender(gender: any): void { }; /** * set Occupation preference in Appodeal for current user * @param occupation */ @Cordova() - setOccupation(occupation: any): void {}; + setOccupation(occupation: any): void { }; /** * set Relation preference in Appodeal for current user * @param relation */ @Cordova() - setRelation(relation: any): void {}; + setRelation(relation: any): void { }; /** * set Smoking preference in Appodeal for current user * @param smoking */ @Cordova() - setSmoking(smoking: any): void {}; + setSmoking(smoking: any): void { }; /** * set Alcohol preference in Appodeal for current user * @param alcohol */ @Cordova() - setAlcohol(alcohol: any): void {}; + setAlcohol(alcohol: any): void { }; /** * set Interests preference in Appodeal for current user * @param interests */ @Cordova() - setInterests(interests: any): void {}; + setInterests(interests: any): void { }; @Cordova({ eventObservable: true, diff --git a/src/@ionic-native/plugins/autostart/index.ts b/src/@ionic-native/plugins/autostart/index.ts new file mode 100644 index 000000000..e57c0d829 --- /dev/null +++ b/src/@ionic-native/plugins/autostart/index.ts @@ -0,0 +1,47 @@ +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; + +/** + * @name Autostart + * @description + * This plugin will start automatically your Android app after the every boot or the auto-update of your application. + * You can enable or disable the autostart function in your app. + * + * @usage + * ```typescript + * import { Autostart } from '@ionic-native/autostart'; + * + * + * constructor(private autostart: Autostart) { } + * + * ... + * + * this.autostart.enable(); + * + * this.autostart.disable(); + * + * ``` + */ +@Plugin({ + pluginName: 'Autostart', + plugin: 'cordova-plugin-autostart', + pluginRef: 'cordova.plugins.autoStart', + repo: 'https://github.com/ToniKorin/cordova-plugin-autostart', + platforms: ['Android'] +}) +@Injectable() +export class Autostart extends IonicNativePlugin { + + /** + * Enable the automatic startup after the boot + */ + @Cordova({ sync: true }) + enable(): void { } + + /** + * Disable the automatic startup after the boot + */ + @Cordova({ sync: true }) + disable(): void { } + +} diff --git a/src/@ionic-native/plugins/background-fetch/index.ts b/src/@ionic-native/plugins/background-fetch/index.ts index 2812ab1dd..67bcae52a 100644 --- a/src/@ionic-native/plugins/background-fetch/index.ts +++ b/src/@ionic-native/plugins/background-fetch/index.ts @@ -1,9 +1,6 @@ import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; import { Injectable } from '@angular/core'; -declare var window; - - export interface BackgroundFetchConfig { /** diff --git a/src/@ionic-native/plugins/background-geolocation/index.ts b/src/@ionic-native/plugins/background-geolocation/index.ts index b48b9c806..fc7e94e4f 100644 --- a/src/@ionic-native/plugins/background-geolocation/index.ts +++ b/src/@ionic-native/plugins/background-geolocation/index.ts @@ -2,8 +2,6 @@ import { Injectable } from '@angular/core'; import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; import { Observable } from 'rxjs/Observable'; -declare var window; - export interface BackgroundGeolocationResponse { /** @@ -448,13 +446,13 @@ export class BackgroundGeolocation extends IonicNativePlugin { /** * Display app settings to change permissions */ - @Cordova({sync: true}) + @Cordova({ sync: true }) showAppSettings(): void { } /** * Display device location settings */ - @Cordova({sync: true}) + @Cordova({ sync: true }) showLocationSettings(): void { } /** diff --git a/src/@ionic-native/plugins/background-mode/index.ts b/src/@ionic-native/plugins/background-mode/index.ts index 37c90164b..9455d13c6 100644 --- a/src/@ionic-native/plugins/background-mode/index.ts +++ b/src/@ionic-native/plugins/background-mode/index.ts @@ -148,7 +148,16 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - moveToBackground(): void {} + moveToBackground(): void { } + + /** + * Enable GPS-tracking in background (Android). + */ + @Cordova({ + platforms: ['Android'], + sync: true + }) + disableWebViewOptimizations (): void { } /** * Android allows to programmatically move from background to foreground. @@ -157,7 +166,7 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - moveToForeground(): void {} + moveToForeground(): void { } /** * Override the back button on Android to go to background instead of closing the app. @@ -166,7 +175,7 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - overrideBackButton(): void {} + overrideBackButton(): void { } /** * Exclude the app from the recent task list works on Android 5.0+. @@ -175,7 +184,7 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - excludeFromTaskList(): void {} + excludeFromTaskList(): void { } /** * The method works async instead of isActive() or isEnabled(). @@ -192,7 +201,7 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - wakeUp(): void {} + wakeUp(): void { } /** * Turn screen on and show app even locked @@ -201,6 +210,6 @@ export class BackgroundMode extends IonicNativePlugin { platforms: ['Android'], sync: true }) - unlock(): void {} + unlock(): void { } } diff --git a/src/@ionic-native/plugins/backlight/index.ts b/src/@ionic-native/plugins/backlight/index.ts index a9dd268fc..ab9c638da 100644 --- a/src/@ionic-native/plugins/backlight/index.ts +++ b/src/@ionic-native/plugins/backlight/index.ts @@ -9,7 +9,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; * This plugin adds turning on/off the device backlight. * * @usage - * ``` + * ```typescript * import { Backlight } from '@ionic-native/backlight'; * * constructor(private backlight: Backlight) { } diff --git a/src/@ionic-native/plugins/barcode-scanner/index.ts b/src/@ionic-native/plugins/barcode-scanner/index.ts index 1d4eb4b94..388fdf2d0 100644 --- a/src/@ionic-native/plugins/barcode-scanner/index.ts +++ b/src/@ionic-native/plugins/barcode-scanner/index.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; - export interface BarcodeScannerOptions { /** @@ -56,6 +55,12 @@ export interface BarcodeScannerOptions { } +export interface BarcodeScanResult { + format: 'QR_CODE' | 'DATA_MATRIX' | 'UPC_E' | 'UPC_A' | 'EAN_8' | 'EAN_13' | 'CODE_128' | 'CODE_39' | 'CODE_93' | 'CODABAR' | 'ITF' | 'RSS14' | 'RSS_EXPANDED' | 'PDF417' | 'AZTEC' | 'MSI'; + cancelled: boolean; + text: string; +} + /** * @name Barcode Scanner * @description @@ -80,6 +85,7 @@ export interface BarcodeScannerOptions { * ``` * @interfaces * BarcodeScannerOptions + * BarcodeScanResult */ @Plugin({ pluginName: 'BarcodeScanner', @@ -111,7 +117,7 @@ export class BarcodeScanner extends IonicNativePlugin { @Cordova({ callbackOrder: 'reverse' }) - scan(options?: BarcodeScannerOptions): Promise { return; } + scan(options?: BarcodeScannerOptions): Promise { return; } /** * Encodes data into a barcode. diff --git a/src/@ionic-native/plugins/base64-to-gallery/index.ts b/src/@ionic-native/plugins/base64-to-gallery/index.ts index 7c0b51fa1..0acc4da06 100644 --- a/src/@ionic-native/plugins/base64-to-gallery/index.ts +++ b/src/@ionic-native/plugins/base64-to-gallery/index.ts @@ -40,7 +40,7 @@ export class Base64ToGallery extends IonicNativePlugin { successIndex: 2, errorIndex: 3 }) - base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise { + base64ToGallery(data: string, options?: { prefix?: string; mediaScanner?: boolean }): Promise { return; } diff --git a/src/@ionic-native/plugins/ble/index.ts b/src/@ionic-native/plugins/ble/index.ts index 409947c5e..eb35c4789 100644 --- a/src/@ionic-native/plugins/ble/index.ts +++ b/src/@ionic-native/plugins/ble/index.ts @@ -35,59 +35,59 @@ import { Observable } from 'rxjs/Observable'; * * ```typescript * { - * "name": "Battery Demo", - * "id": "20:FF:D0:FF:D1:C0", - * "advertising": [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121], - * "rssi": -55 + * 'name': 'Battery Demo', + * 'id': '20:FF:D0:FF:D1:C0', + * 'advertising': [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121], + * 'rssi': -55 * } * ``` * After connecting, the peripheral object also includes service, characteristic and descriptor information. * * ```typescript * { - * "name": "Battery Demo", - * "id": "20:FF:D0:FF:D1:C0", - * "advertising": [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121], - * "rssi": -55, - * "services": [ - * "1800", - * "1801", - * "180f" + * 'name': 'Battery Demo', + * 'id': '20:FF:D0:FF:D1:C0', + * 'advertising': [2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121], + * 'rssi': -55, + * 'services': [ + * '1800', + * '1801', + * '180f' * ], - * "characteristics": [ + * 'characteristics': [ * { - * "service": "1800", - * "characteristic": "2a00", - * "properties": [ - * "Read" + * 'service': '1800', + * 'characteristic': '2a00', + * 'properties': [ + * 'Read' * ] * }, * { - * "service": "1800", - * "characteristic": "2a01", - * "properties": [ - * "Read" + * 'service': '1800', + * 'characteristic': '2a01', + * 'properties': [ + * 'Read' * ] * }, * { - * "service": "1801", - * "characteristic": "2a05", - * "properties": [ - * "Read" + * 'service': '1801', + * 'characteristic': '2a05', + * 'properties': [ + * 'Read' * ] * }, * { - * "service": "180f", - * "characteristic": "2a19", - * "properties": [ - * "Read" + * 'service': '180f', + * 'characteristic': '2a19', + * 'properties': [ + * 'Read' * ], - * "descriptors": [ + * 'descriptors': [ * { - * "uuid": "2901" + * 'uuid': '2901' * }, * { - * "uuid": "2904" + * 'uuid': '2904' * } * ] * } @@ -104,10 +104,10 @@ import { Observable } from 'rxjs/Observable'; * * ```typescript * { - * "name": "demo", - * "id": "00:1A:7D:DA:71:13", - * "advertising": ArrayBuffer, - * "rssi": -37 + * 'name': 'demo', + * 'id': '00:1A:7D:DA:71:13', + * 'advertising': ArrayBuffer, + * 'rssi': -37 * } * ``` * @@ -119,24 +119,24 @@ import { Observable } from 'rxjs/Observable'; * * ```typescript * { - * "name": "demo", - * "id": "D8479A4F-7517-BCD3-91B5-3302B2F81802", - * "advertising": { - * "kCBAdvDataChannel": 37, - * "kCBAdvDataServiceData": { - * "FED8": { - * "byteLength": 7 // data not shown + * 'name': 'demo', + * 'id': 'D8479A4F-7517-BCD3-91B5-3302B2F81802', + * 'advertising': { + * 'kCBAdvDataChannel': 37, + * 'kCBAdvDataServiceData': { + * 'FED8': { + * 'byteLength': 7 // data not shown * } * }, - * "kCBAdvDataLocalName": "demo", - * "kCBAdvDataServiceUUIDs": ["FED8"], - * "kCBAdvDataManufacturerData": { - * "byteLength": 7 // data not shown + * 'kCBAdvDataLocalName': 'demo', + * 'kCBAdvDataServiceUUIDs': ['FED8'], + * 'kCBAdvDataManufacturerData': { + * 'byteLength': 7 // data not shown * }, - * "kCBAdvDataTxPowerLevel": 32, - * "kCBAdvDataIsConnectable": true + * 'kCBAdvDataTxPowerLevel': 32, + * 'kCBAdvDataIsConnectable': true * }, - * "rssi": -53 + * 'rssi': -53 * } * ``` * @@ -230,7 +230,7 @@ export class BLE extends IonicNativePlugin { clearFunction: 'stopScan', clearWithArgs: false }) - startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable { return; } + startScanWithOptions(services: string[], options: { reportDuplicates?: boolean } | any): Observable { return; } /** * Stop a scan started by `startScan`. @@ -306,14 +306,14 @@ export class BLE extends IonicNativePlugin { * // send 1 byte to switch a light on * var data = new Uint8Array(1); * data[0] = 1; - * BLE.write(device_id, "FF10", "FF11", data.buffer); + * BLE.write(device_id, 'FF10', 'FF11', data.buffer); * * // send a 3 byte value with RGB color * var data = new Uint8Array(3); * data[0] = 0xFF; // red * data[0] = 0x00; // green * data[0] = 0xFF; // blue - * BLE.write(device_id, "ccc0", "ccc1", data.buffer); + * BLE.write(device_id, 'ccc0', 'ccc1', data.buffer); * * // send a 32 bit integer * var data = new Uint32Array(1); @@ -357,7 +357,7 @@ export class BLE extends IonicNativePlugin { * * @usage * ``` - * BLE.startNotification(device_id, "FF10", "FF11").subscribe(buffer => { + * BLE.startNotification(device_id, 'FF10', 'FF11').subscribe(buffer => { * console.log(String.fromCharCode.apply(null, new Uint8Array(buffer)); * }); * ``` diff --git a/src/@ionic-native/plugins/bluetooth-serial/index.ts b/src/@ionic-native/plugins/bluetooth-serial/index.ts index 2ecc59983..ec5e3f336 100644 --- a/src/@ionic-native/plugins/bluetooth-serial/index.ts +++ b/src/@ionic-native/plugins/bluetooth-serial/index.ts @@ -13,7 +13,7 @@ import { Observable } from 'rxjs/Observable'; * * * // Write a string - * this.bluetoothSerial.write("hello world").then(success, failure); + * this.bluetoothSerial.write('hello world').then(success, failure); * * // Array of int or bytes * this.bluetoothSerial.write([186, 220, 222]).then(success, failure); diff --git a/src/@ionic-native/plugins/brightness/index.ts b/src/@ionic-native/plugins/brightness/index.ts index e7a2b4b37..d6a4aa677 100644 --- a/src/@ionic-native/plugins/brightness/index.ts +++ b/src/@ionic-native/plugins/brightness/index.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; + /** * @name Brightness * @description diff --git a/src/@ionic-native/plugins/broadcaster/index.ts b/src/@ionic-native/plugins/broadcaster/index.ts index b7fe65520..8aabbb902 100644 --- a/src/@ionic-native/plugins/broadcaster/index.ts +++ b/src/@ionic-native/plugins/broadcaster/index.ts @@ -8,7 +8,7 @@ import { Observable } from 'rxjs/Observable'; * This plugin adds exchanging events between native code and your app. * * @usage - * ``` + * ```typescript * import { Broadcaster } from '@ionic-native/broadcaster'; * * constructor(private broadcaster: Broadcaster) { } @@ -16,7 +16,7 @@ import { Observable } from 'rxjs/Observable'; * ... * * // Listen to events from Native - * this.broadcaster.addEventListener('eventName').then((event) => console.log(event)); + * this.broadcaster.addEventListener('eventName').subscribe((event) => console.log(event)); * * // Send event to Native * this.broadcaster.fireNativeEvent('eventName', {}).then(() => console.log('success')); diff --git a/src/@ionic-native/plugins/browser-tab/index.ts b/src/@ionic-native/plugins/browser-tab/index.ts index 03e8dd763..d41848c07 100644 --- a/src/@ionic-native/plugins/browser-tab/index.ts +++ b/src/@ionic-native/plugins/browser-tab/index.ts @@ -7,7 +7,7 @@ import { Injectable } from '@angular/core'; * This plugin provides an interface to in-app browser tabs that exist on some mobile platforms, specifically [Custom Tabs](http://developer.android.com/tools/support-library/features.html#custom-tabs) on Android (including the [Chrome Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) implementation), and [SFSafariViewController](https://developer.apple.com/library/ios/documentation/SafariServices/Reference/SFSafariViewController_Ref/) on iOS. * * @usage - * ``` + * ```typescript * import { BrowserTab } from '@ionic-native/browser-tab'; * * constructor(private browserTab: BrowserTab) { diff --git a/src/@ionic-native/plugins/calendar/index.ts b/src/@ionic-native/plugins/calendar/index.ts index 8094b267f..329df3666 100644 --- a/src/@ionic-native/plugins/calendar/index.ts +++ b/src/@ionic-native/plugins/calendar/index.ts @@ -59,7 +59,7 @@ export interface CalendarOptions { * * * @usage - * ``` + * ```typescript * import { Calendar } from '@ionic-native/calendar'; * * constructor(private calendar: Calendar) { } diff --git a/src/@ionic-native/plugins/call-number/index.ts b/src/@ionic-native/plugins/call-number/index.ts index 4d4d06e29..b7be20acf 100644 --- a/src/@ionic-native/plugins/call-number/index.ts +++ b/src/@ionic-native/plugins/call-number/index.ts @@ -6,7 +6,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; * Call a number directly from your Cordova/Ionic application. * * @usage - * ``` + * ```typescript * import { CallNumber } from '@ionic-native/call-number'; * * constructor(private callNumber: CallNumber) { } diff --git a/src/@ionic-native/plugins/camera-preview/index.ts b/src/@ionic-native/plugins/camera-preview/index.ts index b8f29a8bb..0700fbe94 100644 --- a/src/@ionic-native/plugins/camera-preview/index.ts +++ b/src/@ionic-native/plugins/camera-preview/index.ts @@ -39,12 +39,12 @@ export interface CameraPreviewOptions { } export interface CameraPreviewPictureOptions { - /** The width in pixels, default 0 */ - width?: number; - /** The height in pixels, default 0 */ - height?: number; - /** The picture quality, 0 - 100, default 85 */ - quality?: number; + /** The width in pixels, default 0 */ + width?: number; + /** The height in pixels, default 0 */ + height?: number; + /** The picture quality, 0 - 100, default 85 */ + quality?: number; } /** @@ -57,7 +57,7 @@ export interface CameraPreviewPictureOptions { * * @usage * ```typescript - * import { CameraPreview, PictureOptions, CameraPreviewOptions, CameraPreviewDimensions } from '@ionic-native/camera-preview'; + * import { CameraPreview, CameraPreviewPictureOptions, CameraPreviewOptions, CameraPreviewDimensions } from '@ionic-native/camera-preview'; * * constructor(private cameraPreview: CameraPreview) { } * @@ -93,7 +93,7 @@ export interface CameraPreviewPictureOptions { * * * // picture options - * const pictureOpts: PictureOptions = { + * const pictureOpts: CameraPreviewPictureOptions = { * width: 1280, * height: 1280, * quality: 85 @@ -134,7 +134,18 @@ export interface CameraPreviewPictureOptions { @Injectable() export class CameraPreview extends IonicNativePlugin { - EXPOSURE_MODES = { + FOCUS_MODE = { + FIXED: 'fixed', + AUTO: 'auto', + CONTINUOUS: 'continuous', // IOS Only + CONTINUOUS_PICTURE: 'continuous-picture', // Android Only + CONTINUOUS_VIDEO: 'continuous-video', // Android Only + EDOF: 'edof', // Android Only + INFINITY: 'infinity', // Android Only + MACRO: 'macro' // Android Only + }; + + EXPOSURE_MODE = { LOCK: 'lock', // IOS Only AUTO: 'auto', // IOS Only CONTINUOUS: 'continuous', @@ -240,10 +251,10 @@ export class CameraPreview extends IonicNativePlugin { }) setZoom(zoom?: number): Promise { return; } -/** - * Get the maximum zoom (Android) - * @return {Promise} - */ + /** + * Get the maximum zoom (Android) + * @return {Promise} + */ @Cordova() getMaxZoom(): Promise { return; } @@ -265,6 +276,38 @@ export class CameraPreview extends IonicNativePlugin { }) setPreviewSize(dimensions?: CameraPreviewDimensions): Promise { return; } + /** + * Get focus mode + * @return {Promise} + */ + @Cordova() + getFocusMode(): Promise { return; } + + /** + * Set the focus mode + * @param [focusMode] {string} 'fixed', 'auto', 'continuous-picture', 'continuous-video' (iOS & Android), 'edof', 'infinity', 'macro' (Android Only) + * @return {Promise} + */ + @Cordova({ + successIndex: 1, + errorIndex: 2 + }) + setFocusMode(focusMode?: string): Promise { return; } + + /** + * Get supported focus modes + * @return {Promise} + */ + @Cordova() + getSupportedFocusModes(): Promise { return; } + + /** + * Get the current flash mode + * @return {Promise} + */ + @Cordova() + getFlashMode(): Promise { return; } + /** * Set the flashmode * @param [flashMode] {string} 'off' (iOS & Android), 'on' (iOS & Android), 'auto' (iOS & Android), 'torch' (Android) @@ -276,13 +319,6 @@ export class CameraPreview extends IonicNativePlugin { }) setFlashMode(flashMode?: string): Promise { return; } - /** - * Get supported picture sizes - * @return {Promise} - */ - @Cordova() - getSupportedPictureSizes(): Promise { return; } - /** * Get supported flash modes * @return {Promise} @@ -290,6 +326,13 @@ export class CameraPreview extends IonicNativePlugin { @Cordova() getSupportedFlashModes(): Promise { return; } + /** + * Get supported picture sizes + * @return {Promise} + */ + @Cordova() + getSupportedPictureSizes(): Promise { return; } + /** * Get exposure mode * @return {Promise} @@ -340,4 +383,13 @@ export class CameraPreview extends IonicNativePlugin { @Cordova() getExposureCompensationRange(): Promise { return; } + /** + * Set specific focus point. Note, this assumes the camera is full-screen. + * @param xPoint {number} + * @param yPoint {number} + * @return {Promise} + */ + @Cordova() + tapToFocus(xPoint: number, yPoint: number): Promise { return; } + } diff --git a/src/@ionic-native/plugins/card-io/index.ts b/src/@ionic-native/plugins/card-io/index.ts index ab54349ec..8163be018 100644 --- a/src/@ionic-native/plugins/card-io/index.ts +++ b/src/@ionic-native/plugins/card-io/index.ts @@ -133,7 +133,7 @@ export interface CardIOResponse { * @name Card IO * @description * @usage - * ``` + * ```typescript * import { CardIO } from '@ionic-native/card-io'; * * constructor(private cardIO: CardIO) { } diff --git a/src/@ionic-native/plugins/code-push/index.ts b/src/@ionic-native/plugins/code-push/index.ts index b12908925..59b5591cf 100644 --- a/src/@ionic-native/plugins/code-push/index.ts +++ b/src/@ionic-native/plugins/code-push/index.ts @@ -109,8 +109,8 @@ interface LocalPackage_Static { } /* tslint:enable */ -declare var RemotePackage: RemotePackage_Static; -declare var LocalPackage: LocalPackage_Static; +declare const RemotePackage: RemotePackage_Static; +declare const LocalPackage: LocalPackage_Static; /** * Defines the JSON format of the current package information file. diff --git a/src/@ionic-native/plugins/contacts/index.ts b/src/@ionic-native/plugins/contacts/index.ts index 586c98f7e..4e17d4a00 100644 --- a/src/@ionic-native/plugins/contacts/index.ts +++ b/src/@ionic-native/plugins/contacts/index.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { CordovaInstance, InstanceProperty, Plugin, getPromise, InstanceCheck, checkAvailability, CordovaCheck, IonicNativePlugin } from '@ionic-native/core'; -declare var window: any, +declare const window: any, navigator: any; export type ContactFieldType = '*' | 'addresses' | 'birthday' | 'categories' | 'country' | 'department' | 'displayName' | 'emails' | 'familyName' | 'formatted' | 'givenName' | 'honorificPrefix' | 'honorificSuffix' | 'id' | 'ims' | 'locality' | 'middleName' | 'name' | 'nickname' | 'note' | 'organizations' | 'phoneNumbers' | 'photos' | 'postalCode' | 'region' | 'streetAddress' | 'title' | 'urls'; @@ -49,6 +49,7 @@ export interface IContactProperties { /** An array of web pages associated with the contact. */ urls?: IContactField[]; + } /** @@ -71,6 +72,8 @@ export class Contact implements IContactProperties { @InstanceProperty categories: IContactField[]; @InstanceProperty urls: IContactField[]; + [key: string]: any; + constructor() { if (checkAvailability('navigator.contacts', 'create', 'Contacts') === true) { this._objectInstance = navigator.contacts.create(); @@ -79,7 +82,7 @@ export class Contact implements IContactProperties { @InstanceCheck() clone(): Contact { - let newContact = new Contact(); + let newContact: any = new Contact(); for (let prop in this) { if (prop === 'id') return; newContact[prop] = this[prop]; @@ -92,8 +95,8 @@ export class Contact implements IContactProperties { @InstanceCheck() save(): Promise { - return getPromise((resolve, reject) => { - this._objectInstance.save((contact) => { + return getPromise((resolve: Function, reject: Function) => { + this._objectInstance.save((contact: any) => { this._objectInstance = contact; resolve(this); }, reject); @@ -114,7 +117,7 @@ export interface IContactError { /** * @hidden */ -export declare var ContactError: { +export declare const ContactError: { new (code: number): IContactError; UNKNOWN_ERROR: number; INVALID_ARGUMENT_ERROR: number; @@ -145,16 +148,16 @@ export interface IContactName { */ export class ContactName implements IContactName { constructor(public formatted?: string, - public familyName?: string, - public givenName?: string, - public middleName?: string, - public honorificPrefix?: string, - public honorificSuffix?: string) {} + public familyName?: string, + public givenName?: string, + public middleName?: string, + public honorificPrefix?: string, + public honorificSuffix?: string) { } } export interface IContactField { /** A string that indicates what type of field this is, home for example. */ - type?: string; + type?: string; /** The value of the field, such as a phone number or email address. */ value?: string; /** Set to true if this ContactField contains the user's preferred value. */ @@ -166,15 +169,15 @@ export interface IContactField { */ export class ContactField implements IContactField { constructor(public type?: string, - public value?: string, - public pref?: boolean) {} + public value?: string, + public pref?: boolean) { } } export interface IContactAddress { /** Set to true if this ContactAddress contains the user's preferred value. */ pref?: boolean; /** A string indicating what type of field this is, home for example. */ - type?: string; + type?: string; /** The full address formatted for display. */ formatted?: string; /** The full street address. */ @@ -194,20 +197,20 @@ export interface IContactAddress { */ export class ContactAddress implements IContactAddress { constructor(public pref?: boolean, - public type?: string, - public formatted?: string, - public streetAddress?: string, - public locality?: string, - public region?: string, - public postalCode?: string, - public country?: string) {} + public type?: string, + public formatted?: string, + public streetAddress?: string, + public locality?: string, + public region?: string, + public postalCode?: string, + public country?: string) { } } export interface IContactOrganization { /** Set to true if this ContactOrganization contains the user's preferred value. */ pref?: boolean; /** A string that indicates what type of field this is, home for example. */ - type?: string; + type?: string; /** The name of the organization. */ name?: string; /** The department the contract works for. */ @@ -226,7 +229,7 @@ export class ContactOrganization implements IContactOrganization { public department?: string, public title?: string, public pref?: boolean - ) {} + ) { } } /** Search options to filter navigator.contacts. */ @@ -248,9 +251,9 @@ export interface IContactFindOptions { */ export class ContactFindOptions implements IContactFindOptions { constructor(public filter?: string, - public multiple?: boolean, - public desiredFields?: string[], - public hasPhoneNumber?: boolean) {} + public multiple?: boolean, + public desiredFields?: string[], + public hasPhoneNumber?: boolean) { } } /** @@ -312,8 +315,8 @@ export class Contacts extends IonicNativePlugin { */ @CordovaCheck() find(fields: ContactFieldType[], options?: IContactFindOptions): Promise { - return getPromise((resolve, reject) => { - navigator.contacts.find(fields, (contacts) => { + return getPromise((resolve: Function, reject: Function) => { + navigator.contacts.find(fields, (contacts: any[]) => { resolve(contacts.map(processContact)); }, reject, options); }); @@ -325,8 +328,8 @@ export class Contacts extends IonicNativePlugin { */ @CordovaCheck() pickContact(): Promise { - return getPromise((resolve, reject) => { - navigator.contacts.pickContact((contact) => resolve(processContact(contact)), reject); + return getPromise((resolve: Function, reject: Function) => { + navigator.contacts.pickContact((contact: any) => resolve(processContact(contact)), reject); }); } @@ -335,7 +338,7 @@ export class Contacts extends IonicNativePlugin { /** * @hidden */ -function processContact(contact) { +function processContact(contact: any) { let newContact = new Contact(); for (let prop in contact) { if (typeof contact[prop] === 'function') continue; diff --git a/src/@ionic-native/plugins/couchbase-lite/index.ts b/src/@ionic-native/plugins/couchbase-lite/index.ts index cd48254a6..8d843e208 100644 --- a/src/@ionic-native/plugins/couchbase-lite/index.ts +++ b/src/@ionic-native/plugins/couchbase-lite/index.ts @@ -8,7 +8,7 @@ import { Injectable } from '@angular/core'; * Plugin to install Couchbase Lite in your PhoneGap app on iOS or Android * * @usage - * ``` + * ```typescript * import { CouchbaseLite } from '@ionic-native/couchbase-lite'; * * constructor(private couchbase: CouchbaseLite) { @@ -38,6 +38,6 @@ export class CouchbaseLite extends IonicNativePlugin { @Cordova({ callbackStyle: 'node' }) - getURL(): Promise { return; } + getURL(): Promise { return; } } diff --git a/src/@ionic-native/plugins/crop/index.ts b/src/@ionic-native/plugins/crop/index.ts index f411de3fc..52c5c041e 100644 --- a/src/@ionic-native/plugins/crop/index.ts +++ b/src/@ionic-native/plugins/crop/index.ts @@ -5,7 +5,7 @@ import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; * @name Crop * @description Crops images * @usage - * ``` + * ```typescript * import { Crop } from '@ionic-native/crop'; * * constructor(private crop: Crop) { } @@ -14,8 +14,8 @@ import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core'; * * this.crop.crop('path/to/image.jpg', {quality: 75}) * .then( - * newImage => console.log("new image path is: " + newImage), - * error => console.error("Error cropping image", error) + * newImage => console.log('new image path is: ' + newImage), + * error => console.error('Error cropping image', error) * ); * ``` */ @@ -38,6 +38,6 @@ export class Crop extends IonicNativePlugin { @Cordova({ callbackOrder: 'reverse' }) - crop(pathToImage: string, options?: {quality: number}): Promise { return; } + crop(pathToImage: string, options?: { quality: number }): Promise { return; } } diff --git a/src/@ionic-native/plugins/deeplinks/index.ts b/src/@ionic-native/plugins/deeplinks/index.ts index cea92ba02..f48dcf0ab 100644 --- a/src/@ionic-native/plugins/deeplinks/index.ts +++ b/src/@ionic-native/plugins/deeplinks/index.ts @@ -98,7 +98,7 @@ export class Deeplinks extends IonicNativePlugin { @Cordova({ observable: true }) - route(paths): Observable { return; } + route(paths: any): Observable { return; } /** * @@ -121,6 +121,6 @@ export class Deeplinks extends IonicNativePlugin { @Cordova({ observable: true }) - routeWithNavController(navController, paths): Observable { return; } + routeWithNavController(navController: any, paths: any): Observable { return; } } diff --git a/src/@ionic-native/plugins/device-feedback/index.ts b/src/@ionic-native/plugins/device-feedback/index.ts index 066d18ab1..5246e4e6d 100644 --- a/src/@ionic-native/plugins/device-feedback/index.ts +++ b/src/@ionic-native/plugins/device-feedback/index.ts @@ -7,7 +7,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; * Plugin that lets you provide haptic or acoustic feedback on Android devices. * * @usage - * ``` + * ```typescript * import { DeviceFeedback } from '@ionic-native/device-feedback'; * * constructor(private deviceFeedback: DeviceFeedback) { } diff --git a/src/@ionic-native/plugins/device/index.ts b/src/@ionic-native/plugins/device/index.ts index 92a8cb57b..e2efd7e92 100644 --- a/src/@ionic-native/plugins/device/index.ts +++ b/src/@ionic-native/plugins/device/index.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { CordovaProperty, Plugin, IonicNativePlugin } from '@ionic-native/core'; -declare var window: any; +declare const window: any; /** * @name Device diff --git a/src/@ionic-native/plugins/diagnostic/index.ts b/src/@ionic-native/plugins/diagnostic/index.ts index fb9b0119f..4937ff72c 100644 --- a/src/@ionic-native/plugins/diagnostic/index.ts +++ b/src/@ionic-native/plugins/diagnostic/index.ts @@ -144,10 +144,12 @@ export class Diagnostic extends IonicNativePlugin { /** * Checks if the device has a camera. On Android this returns true if the device has a camera. On iOS this returns true if both the device has a camera AND the application is authorized to use it. On Windows 10 Mobile this returns true if both the device has a rear-facing camera AND the * application is authorized to use it. + * @param {boolean} [externalStorage] Android only: If true, checks permission for READ_EXTERNAL_STORAGE in addition to CAMERA run-time permission. + * cordova-plugin-camera@2.2+ requires both of these permissions. Defaults to true. * @returns {Promise} */ - @Cordova() - isCameraAvailable(): Promise { return; } + @Cordova({ callbackOrder: 'reverse' }) + isCameraAvailable( externalStorage?: boolean ): Promise { return; } /** * Checks if the device has Bluetooth capabilities and if so that Bluetooth is switched on (same on Android, iOS and Windows 10 Mobile) @@ -251,24 +253,30 @@ export class Diagnostic extends IonicNativePlugin { /** * Checks if the application is authorized to use the camera. * Note for Android: this is intended for Android 6 / API 23 and above. Calling on Android 5 / API 22 and below will always return TRUE as permissions are already granted at installation time. + * @param {boolean} [externalStorage] Android only: If true, checks permission for READ_EXTERNAL_STORAGE in addition to CAMERA run-time permission. + * cordova-plugin-camera@2.2+ requires both of these permissions. Defaults to true. * @returns {Promise} */ - @Cordova({ platforms: ['Android', 'iOS'] }) - isCameraAuthorized(): Promise { return; } + @Cordova({ platforms: ['Android', 'iOS'], callbackOrder: 'reverse' }) + isCameraAuthorized( externalStorage?: boolean ): Promise { return; } /** * Returns the camera authorization status for the application. + * @param {boolean} [externalStorage] Android only: If true, checks permission for READ_EXTERNAL_STORAGE in addition to CAMERA run-time permission. + * cordova-plugin-camera@2.2+ requires both of these permissions. Defaults to true. * @returns {Promise} */ - @Cordova({ platforms: ['Android', 'iOS'] }) - getCameraAuthorizationStatus(): Promise { return; } + @Cordova({ platforms: ['Android', 'iOS'], callbackOrder: 'reverse' }) + getCameraAuthorizationStatus( externalStorage?: boolean ): Promise { return; } /** * Requests camera authorization for the application. + * @param {boolean} [externalStorage] Android only: If true, requests permission for READ_EXTERNAL_STORAGE in addition to CAMERA run-time permission. + * cordova-plugin-camera@2.2+ requires both of these permissions. Defaults to true. * @returns {Promise} */ - @Cordova({ platforms: ['Android', 'iOS'] }) - requestCameraAuthorization(): Promise { return; } + @Cordova({ platforms: ['Android', 'iOS'], callbackOrder: 'reverse' }) + requestCameraAuthorization( externalStorage?: boolean ): Promise { return; } /** * Checks if the application is authorized to use the microphone. @@ -614,10 +622,10 @@ export class Diagnostic extends IonicNativePlugin { /** * Returns the authorization status for the application to use the Camera Roll in Photos app. - * @returns {Promise} + * @returns {Promise} */ @Cordova({ platforms: ['iOS'] }) - getCameraRollAuthorizationStatus(): Promise { return; } + getCameraRollAuthorizationStatus(): Promise { return; } /** * Requests camera roll authorization for the application. diff --git a/src/@ionic-native/plugins/dialogs/index.ts b/src/@ionic-native/plugins/dialogs/index.ts index 72fc98d3e..04ae9166a 100644 --- a/src/@ionic-native/plugins/dialogs/index.ts +++ b/src/@ionic-native/plugins/dialogs/index.ts @@ -75,7 +75,7 @@ export class Dialogs extends IonicNativePlugin { successIndex: 1, errorIndex: 4 }) - confirm(message, title?: string, buttonLabels?: string[]): Promise { return; } + confirm(message: string, title?: string, buttonLabels?: string[]): Promise { return; } /** * Displays a native dialog box that is more customizable than the browser's prompt function. diff --git a/src/@ionic-native/plugins/document-viewer/index.ts b/src/@ionic-native/plugins/document-viewer/index.ts new file mode 100644 index 000000000..aec4abb64 --- /dev/null +++ b/src/@ionic-native/plugins/document-viewer/index.ts @@ -0,0 +1,102 @@ +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; + +export interface DocumentViewerOptions { + title: string; + documentView: { + closeLabel: string; + }; + navigationView: { + closeLabel: string; + }; + email: { + enabled: boolean; + }; + print: { + enabled: boolean; + }; + openWith: { + enabled: boolean; + }; + bookmarks: { + enabled: boolean; + }; + search: { + enabled: boolean; + }; + autoClose: { + onPause: boolean; + }; +} + +/** + * @name Document Viewer + * @description + * This plugin offers a slim API to view PDF files which are either stored in the apps assets folder (/www/*) or in any other file system directory available via the cordova file plugin. + * + * @usage + * ```typescript + * import { DocumentViewer } from '@ionic-native/document-viewer'; + * + * + * constructor(private document: DocumentViewer) { } + * + * ... + * const options: DocumentViewerOptions = { + * title: 'My PDF' + * } + * + * this.document.viewDocument('assets/myFile.pdf', 'application/pdf', options) + * + * ``` + * + * @interfaces + * DocumentViewerOptions + */ +@Plugin({ + pluginName: 'Document Viewer', + plugin: 'cordova-plugin-document-viewer', + pluginRef: 'SitewaertsDocumentViewer', + repo: 'https://github.com/sitewaerts/cordova-plugin-document-viewer', + platforms: ['Android', 'iOS', 'Windows'] +}) +@Injectable() +export class DocumentViewer extends IonicNativePlugin { + + /** + * Displays the email composer pre-filled with data. + * + * @returns {Promise} Resolves promise when the EmailComposer has been opened + */ + @Cordova() + getSupportInfo(): Promise { return; } + + /** + * Check if the document can be shown + * + * @param url {string} Url to the file + * @param contentType {string} Content type of the file + * @param options {Array} options + * @param [onPossible] {Function} + * @param [onMissingApp] {Function} + * @param [onImpossible] {Function} + * @param [onError] {Function} + */ + @Cordova({ sync: true }) + canViewDocument(url: string, contentType: string, options: DocumentViewerOptions, onPossible?: Function, onMissingApp?: Function, onImpossible?: Function, onError?: Function): void { } + + /** + * Opens the file + * + * @param url {string} Url to the file + * @param contentType {string} Content type of the file + * @param options {Array} options + * @param [onShow] {Function} + * @param [onClose] {Function} + * @param [onMissingApp] {Function} + * @param [onError] {Function} + */ + @Cordova({ sync: true }) + viewDocument(url: string, contentType: string, options: Array, onShow?: Function, onClose?: Function, onMissingApp?: Function, onError?: Function): void { } + +} diff --git a/src/@ionic-native/plugins/email-composer/index.ts b/src/@ionic-native/plugins/email-composer/index.ts index dc9612653..fb21df3d7 100644 --- a/src/@ionic-native/plugins/email-composer/index.ts +++ b/src/@ionic-native/plugins/email-composer/index.ts @@ -1,7 +1,11 @@ import { Injectable } from '@angular/core'; import { Cordova, Plugin, CordovaCheck, IonicNativePlugin } from '@ionic-native/core'; -declare var cordova: any; +interface Cordova { + plugins: CordovaPlugins & { email: any }; +} + +declare const cordova: Cordova; export interface EmailComposerOptions { @@ -25,14 +29,11 @@ export interface EmailComposerOptions { /** - * @beta * @name Email Composer * @description * * Requires Cordova plugin: cordova-plugin-email-composer. For more info, please see the [Email Composer plugin docs](https://github.com/hypery2k/cordova-email-plugin). * - * DISCLAIMER: This plugin is experiencing issues with the latest versions of Cordova. Use at your own risk. Functionality is not guaranteed. Please stay tuned for a more stable version. - * A good alternative to this plugin is the social sharing plugin. * * @usage * ```typescript @@ -91,7 +92,7 @@ export class EmailComposer extends IonicNativePlugin { isAvailable(app?: string): Promise { return new Promise((resolve, reject) => { if (app) { - cordova.plugins.email.isAvailable(app, (isAvailable) => { + cordova.plugins.email.isAvailable(app, (isAvailable: boolean) => { if (isAvailable) { resolve(); } else { @@ -99,7 +100,7 @@ export class EmailComposer extends IonicNativePlugin { } }); } else { - cordova.plugins.email.isAvailable((isAvailable) => { + cordova.plugins.email.isAvailable((isAvailable: boolean) => { if (isAvailable) { resolve(); } else { diff --git a/src/@ionic-native/plugins/facebook/index.ts b/src/@ionic-native/plugins/facebook/index.ts index 174fb0389..f5dc71f06 100644 --- a/src/@ionic-native/plugins/facebook/index.ts +++ b/src/@ionic-native/plugins/facebook/index.ts @@ -104,6 +104,8 @@ export interface FacebookLoginResponse { * .catch(e => console.log('Error logging into Facebook', e)); * * + * this.fb.logEvent(this.fb.EVENTS.EVENT_NAME_ADDED_TO_CART); + * * ``` * */ @@ -119,6 +121,41 @@ export interface FacebookLoginResponse { @Injectable() export class Facebook extends IonicNativePlugin { + EVENTS: { + EVENT_NAME_ACTIVATED_APP: 'fb_mobile_activate_app', + EVENT_NAME_DEACTIVATED_APP: 'fb_mobile_deactivate_app', + EVENT_NAME_SESSION_INTERRUPTIONS: 'fb_mobile_app_interruptions', + EVENT_NAME_TIME_BETWEEN_SESSIONS: 'fb_mobile_time_between_sessions', + EVENT_NAME_COMPLETED_REGISTRATION: 'fb_mobile_complete_registration', + EVENT_NAME_VIEWED_CONTENT: 'fb_mobile_content_view', + EVENT_NAME_SEARCHED: 'fb_mobile_search', + EVENT_NAME_RATED: 'fb_mobile_rate', + EVENT_NAME_COMPLETED_TUTORIAL: 'fb_mobile_tutorial_completion', + EVENT_NAME_PUSH_TOKEN_OBTAINED: 'fb_mobile_obtain_push_token', + EVENT_NAME_ADDED_TO_CART: 'fb_mobile_add_to_cart', + EVENT_NAME_ADDED_TO_WISHLIST: 'fb_mobile_add_to_wishlist', + EVENT_NAME_INITIATED_CHECKOUT: 'fb_mobile_initiated_checkout', + EVENT_NAME_ADDED_PAYMENT_INFO: 'fb_mobile_add_payment_info', + EVENT_NAME_PURCHASED: 'fb_mobile_purchase', + EVENT_NAME_ACHIEVED_LEVEL: 'fb_mobile_level_achieved', + EVENT_NAME_UNLOCKED_ACHIEVEMENT: 'fb_mobile_achievement_unlocked', + EVENT_NAME_SPENT_CREDITS: 'fb_mobile_spent_credits', + EVENT_PARAM_CURRENCY: 'fb_currency', + EVENT_PARAM_REGISTRATION_METHOD: 'fb_registration_method', + EVENT_PARAM_CONTENT_TYPE: 'fb_content_type', + EVENT_PARAM_CONTENT_ID: 'fb_content_id', + EVENT_PARAM_SEARCH_STRING: 'fb_search_string', + EVENT_PARAM_SUCCESS: 'fb_success', + EVENT_PARAM_MAX_RATING_VALUE: 'fb_max_rating_value', + EVENT_PARAM_PAYMENT_INFO_AVAILABLE: 'fb_payment_info_available', + EVENT_PARAM_NUM_ITEMS: 'fb_num_items', + EVENT_PARAM_LEVEL: 'fb_level', + EVENT_PARAM_DESCRIPTION: 'fb_description', + EVENT_PARAM_SOURCE_APPLICATION: 'fb_mobile_launch_source', + EVENT_PARAM_VALUE_YES: '1', + EVENT_PARAM_VALUE_NO: '0' + }; + /** * Browser wrapper * @param {number} appId Your Facebook AppID from their dashboard @@ -135,16 +172,17 @@ export class Facebook extends IonicNativePlugin { * * ```typescript * { - * status: "connected", + * status: 'connected', * authResponse: { * session_key: true, - * accessToken: "kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn", + * accessToken: 'kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn', * expiresIn: 5183979, - * sig: "...", - * secret: "...", - * userID: "634565435" + * sig: '...', + * secret: '...', + * userID: '634565435' * } * } + * * ``` * * @param {string[]} permissions List of [permissions](https://developers.facebook.com/docs/facebook-login/permissions) this app has upon logging in. @@ -174,13 +212,13 @@ export class Facebook extends IonicNativePlugin { * ``` * { * authResponse: { - * userID: "12345678912345", - * accessToken: "kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn", + * userID: '12345678912345', + * accessToken: 'kgkh3g42kh4g23kh4g2kh34g2kg4k2h4gkh3g4k2h4gk23h4gk2h34gk234gk2h34AndSoOn', * session_Key: true, - * expiresIn: "5183738", - * sig: "..." + * expiresIn: '5183738', + * sig: '...' * }, - * status: "connected" + * status: 'connected' * } * ``` * @@ -204,10 +242,10 @@ export class Facebook extends IonicNativePlugin { * * ``` * { - * method: "share", - * href: "http://example.com", - * caption: "Such caption, very feed.", - * description: "Much description", + * method: 'share', + * href: 'http://example.com', + * caption: 'Such caption, very feed.', + * description: 'Much description', * picture: 'http://example.com/image.png' * } * ``` diff --git a/src/@ionic-native/plugins/fcm/index.ts b/src/@ionic-native/plugins/fcm/index.ts new file mode 100644 index 000000000..4b0a52c0f --- /dev/null +++ b/src/@ionic-native/plugins/fcm/index.ts @@ -0,0 +1,118 @@ +import { Plugin, IonicNativePlugin, Cordova } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; + +export interface NotificationData { + + /** + * Determines whether the notification was pressed or not + */ + + wasTapped: boolean; + + /** + * Notification data hash item + */ + + [name: string]: any; + +} + +/** + * @name FCM + * @description + * Provides basic functionality for Firebase Cloud Messaging + * + * @usage + * ```typescript + * import { FCM } from 'ionic-native'; + * + * constructor(private fcm: FCM) {} + * + * ... + * + * fcm.subscribeToTopic('marketing'); + * + * fcm.getToken().then(token=>{ + * backend.registerToken(token); + * }) + * + * fcm.onNotification().subscribe(data=>{ + * if(data.wasPressed){ + * console.log("Received in background"); + * } else { + * console.log("Received in foreground"); + * }; + * }) + * + * fcm.onTokenRefresh().subscribe(token=>{ + * backend.registerToken(token); + * }) + * + * fcm.unsubscribeFromTopic('marketing'); + * + * ``` + * @interfaces + * NotificationData + */ +@Plugin({ + pluginName: 'FCM', + plugin: 'cordova-plugin-fcm', + pluginRef: 'FCMPlugin', + repo: 'https://github.com/fechanique/cordova-plugin-fcm', + platforms: ['iOS', 'Android'] +}) +@Injectable() +export class FCM extends IonicNativePlugin { + + /** + * Get's device's current registration id + * + * @returns {Promise} Returns a Promise that resolves with the registration id token + */ + @Cordova() + getToken(): Promise { return; } + + /** + * Event firing on the token refresh + * + * @returns {Observable} Returns an Observable that notifies with the change of device's registration id + */ + @Cordova({ + observable: true + }) + onTokenRefresh(): Observable { return; } + + /** + * Subscribes you to a [topic](https://firebase.google.com/docs/notifications/android/console-topics) + * + * @param {string} topic Topic to be subscribed to + * + * @returns {Promise} Returns a promise resolving in result of subscribing to a topic + */ + @Cordova() + subscribeToTopic(topic: string): Promise { return; } + + /** + * Unubscribes you from a [topic](https://firebase.google.com/docs/notifications/android/console-topics) + * + * @param {string} topic Topic to be unsubscribed from + * + * @returns {Promise} Returns a promise resolving in result of unsubscribing from a topic + */ + @Cordova() + unsubscribeFromTopic(topic: string): Promise { return; } + + /** + * Watch for incoming notifications + * + * @returns {Observable} returns an object with data from the notification + */ + @Cordova({ + observable: true, + successIndex: 0, + errorIndex: 2 + }) + onNotification(): Observable { return; } + +} diff --git a/src/@ionic-native/plugins/file-chooser/index.ts b/src/@ionic-native/plugins/file-chooser/index.ts index ae35b0197..15b2a347a 100644 --- a/src/@ionic-native/plugins/file-chooser/index.ts +++ b/src/@ionic-native/plugins/file-chooser/index.ts @@ -8,7 +8,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; * Opens the file picker on Android for the user to select a file, returns a file URI. * * @usage - * ``` + * ```typescript * import { FileChooser } from '@ionic-native/file-chooser'; * * constructor(private fileChooser: FileChooser) { } @@ -23,7 +23,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; */ @Plugin({ pluginName: 'FileChooser', - plugin: 'http://github.com/don/cordova-filechooser.git', + plugin: 'https://github.com/don/cordova-filechooser.git', pluginRef: 'fileChooser', repo: 'https://github.com/don/cordova-filechooser', platforms: ['Android'] diff --git a/src/@ionic-native/plugins/file-encryption/index.ts b/src/@ionic-native/plugins/file-encryption/index.ts new file mode 100644 index 000000000..345cdb2e3 --- /dev/null +++ b/src/@ionic-native/plugins/file-encryption/index.ts @@ -0,0 +1,52 @@ +import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; +import { Injectable } from '@angular/core'; + +/** + * @name File Encryption + * @description + * Simple file encryption for Cordova. + * + * @usage + * ```typescript + * import { FileEncryption } from '@ionic-native/file-encryption'; + * + * + * constructor(private fileEncryption: FileEncryption) { } + * + * ... + * + * this.fileEncryption.decrypt('assets/json/topSecret.json', 'secretKey'); + * + * this.fileEncryption.encrypt('assets/json/topSecret.json', 'secretKey'); + * + * ``` + */ +@Plugin({ + pluginName: 'FileEncryption', + plugin: 'cordova-safe', + pluginRef: 'cordova.plugins.disusered', + repo: 'https://github.com/disusered/cordova-safe', + platforms: ['Android', 'iOS'] +}) +@Injectable() +export class FileEncryption extends IonicNativePlugin { + + /** + * Enrcypt a file + * @param file {string} A string representing a local URI + * @param key {string} A key for the crypto operations + * @return {Promise} Returns a promise that resolves when something happens + */ + @Cordova() + encrypt(file: string, key: string): Promise { return; } + + /** + * Decrypt a file + * @param file {string} A string representing a local URI + * @param key {string} A key for the crypto operations + * @return {Promise} Returns a promise that resolves when something happens + */ + @Cordova() + decrypt(file: string, key: string): Promise { return; } + +} diff --git a/src/@ionic-native/plugins/file-opener/index.ts b/src/@ionic-native/plugins/file-opener/index.ts index d1f5917dc..1250e1c7d 100644 --- a/src/@ionic-native/plugins/file-opener/index.ts +++ b/src/@ionic-native/plugins/file-opener/index.ts @@ -7,7 +7,7 @@ import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; * This plugin will open a file on your device file system with its default application. * * @usage - * ``` + * ```typescript * import { FileOpener } from '@ionic-native/file-opener'; * * constructor(private fileOpener: FileOpener) { } @@ -41,7 +41,7 @@ export class FileOpener extends IonicNativePlugin { successName: 'success', errorName: 'error' }) - open(filePath: string, fileMIMEType: string): Promise {return; } + open(filePath: string, fileMIMEType: string): Promise { return; } /** * Uninstalls a package @@ -53,7 +53,7 @@ export class FileOpener extends IonicNativePlugin { successName: 'success', errorName: 'error' }) - uninstall(packageId: string): Promise {return; } + uninstall(packageId: string): Promise { return; } /** * Check if an app is already installed @@ -65,6 +65,6 @@ export class FileOpener extends IonicNativePlugin { successName: 'success', errorName: 'error' }) - appIsInstalled(packageId: string): Promise {return; } + appIsInstalled(packageId: string): Promise { return; } } diff --git a/src/@ionic-native/plugins/file-path/index.ts b/src/@ionic-native/plugins/file-path/index.ts index 2154eaa83..29dc9b719 100644 --- a/src/@ionic-native/plugins/file-path/index.ts +++ b/src/@ionic-native/plugins/file-path/index.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core'; -declare var window: any; +declare const window: any; /** * @name File Path @@ -10,7 +10,7 @@ declare var window: any; * This plugin allows you to resolve the native filesystem path for Android content URIs and is based on code in the aFileChooser library. * * @usage - * ``` + * ```typescript * import { FilePath } from '@ionic-native/file-path'; * * constructor(private filePath: FilePath) { } @@ -39,6 +39,6 @@ export class FilePath extends IonicNativePlugin { * @returns {Promise} */ @Cordova() - resolveNativePath(path: string): Promise {return; } + resolveNativePath(path: string): Promise { return; } } diff --git a/src/@ionic-native/plugins/file/index.ts b/src/@ionic-native/plugins/file/index.ts index ef18ab0c7..12d06a550 100644 --- a/src/@ionic-native/plugins/file/index.ts +++ b/src/@ionic-native/plugins/file/index.ts @@ -1,158 +1,398 @@ import { Injectable } from '@angular/core'; import { CordovaProperty, Plugin, CordovaCheck, IonicNativePlugin } from '@ionic-native/core'; -declare var window: any; -declare var cordova: any; - -/** This interface represents a file system. */ -export interface FileSystem { - /* The name of the file system, unique across the list of exposed file systems. */ +export interface IFile extends Blob { + /** + * Name of the file, without path information + */ name: string; - /** The root directory of the file system. */ - root: DirectoryEntry; + /** + * Last modified date + */ + lastModified: number; + /** + * Last modified date + */ + lastModifiedDate: number; + /** + * Size in bytes + */ + size: number; + /** + * File mime type + */ + type: string; + localURL: string; + start: number; + end: number; + /** + * Returns a "slice" of the file. Since Cordova Files don't contain the actual + * content, this really returns a File with adjusted start and end. + * Slices of slices are supported. + * @param start {Number} The index at which to start the slice (inclusive). + * @param end {Number} The index at which to end the slice (exclusive). + */ + slice(start: number, end: number): Blob; +} + +export interface LocalFileSystem { + + /** + * Used for storage with no guarantee of persistence. + */ + TEMPORARY: number; + + /** + * Used for storage that should not be removed by the user agent without application or user permission. + */ + PERSISTENT: number; + + /** + * Requests a filesystem in which to store application data. + * @param type Whether the filesystem requested should be persistent, as defined above. Use one of TEMPORARY or PERSISTENT. + * @param size This is an indicator of how much storage space, in bytes, the application expects to need. + * @param successCallback The callback that is called when the user agent provides a filesystem. + * @param errorCallback A callback that is called when errors happen, or when the request to obtain the filesystem is denied. + */ + requestFileSystem(type: number, size: number, successCallback: FileSystemCallback, errorCallback?: ErrorCallback): void; + + /** + * Allows the user to look up the Entry for a file or directory referred to by a local URL. + * @param url A URL referring to a local file in a filesystem accessable via this API. + * @param successCallback A callback that is called to report the Entry to which the supplied URL refers. + * @param errorCallback A callback that is called when errors happen, or when the request to obtain the Entry is denied. + */ + resolveLocalFileSystemURL(url: string, successCallback: EntryCallback, errorCallback?: ErrorCallback): void; + + /** + * see requestFileSystem. + */ + webkitRequestFileSystem(type: number, size: number, successCallback: FileSystemCallback, errorCallback?: ErrorCallback): void; +} + +export interface Metadata { + /** + * This is the time at which the file or directory was last modified. + * @readonly + */ + modificationTime: Date; + + /** + * The size of the file, in bytes. This must return 0 for directories. + * @readonly + */ + size: number; +} + +export interface Flags { + /** + * Used to indicate that the user wants to create a file or directory if it was not previously there. + */ + create?: boolean; + + /** + * By itself, exclusive must have no effect. Used with create, it must cause getFile and getDirectory to fail if the target path already exists. + */ + exclusive?: boolean; } /** - * An abstract interface representing entries in a file system, - * each of which may be a File or DirectoryEntry. + * This export interface represents a file system. */ -export interface Entry { - /** Entry is a file. */ - isFile: boolean; - /** Entry is a directory. */ - isDirectory: boolean; - /** The name of the entry, excluding the path leading to it. */ +export interface FileSystem { + /** + * This is the name of the file system. The specifics of naming filesystems is unspecified, but a name must be unique across the list of exposed file systems. + * @readonly + */ name: string; - /** The full absolute path from the root to the entry. */ - fullPath: string; - /** The file system on which the entry resides. */ - filesystem: FileSystem; - nativeURL: string; + + /** + * The root directory of the file system. + * @readonly + */ + root: DirectoryEntry; + + toJSON(): string; + + encodeURIPath(path: string): string; + +} + +export interface Entry { + + /** + * Entry is a file. + */ + isFile: boolean; + + /** + * Entry is a directory. + */ + isDirectory: boolean; + /** * Look up metadata about this entry. * @param successCallback A callback that is called with the time of the last modification. - * @param errorCallback A callback that is called when errors happen. + * @param errorCallback ErrorCallback A callback that is called when errors happen. */ - getMetadata(successCallback: (metadata: Metadata) => void, - errorCallback?: (error: FileError) => void): void; + getMetadata(successCallback: MetadataCallback, errorCallback?: ErrorCallback): void; + + /** + * Set the metadata of the entry. + * @param successCallback {Function} is called with a Metadata object + * @param errorCallback {Function} is called with a FileError + * @param metadataObject {Metadata} keys and values to set + */ + setMetadata(successCallback: MetadataCallback, errorCallback: ErrorCallback, metadataObject: Metadata): void; + + /** + * The name of the entry, excluding the path leading to it. + */ + name: string; + + /** + * The full absolute path from the root to the entry. + */ + fullPath: string; + + /** + * The file system on which the entry resides. + */ + filesystem: FileSystem; + + /** + * an alternate URL which can be used by native webview controls, for example media players. + */ + nativeURL: string; + /** * Move an entry to a different location on the file system. It is an error to try to: - * move a directory inside itself or to any child at any depth;move an entry into its parent if a name different from its current one isn't provided; - * move a file to a path occupied by a directory; - * move a directory to a path occupied by a file; - * move any element to a path occupied by a directory which is not empty. + * + * + *
  • move a directory inside itself or to any child at any depth;
  • + *
  • move an entry into its parent if a name different from its current one isn't provided;
  • + *
  • move a file to a path occupied by a directory;
  • + *
  • move a directory to a path occupied by a file;
  • + *
  • move any element to a path occupied by a directory which is not empty.
  • + *
      + * * A move of a file on top of an existing file must attempt to delete and replace that file. * A move of a directory on top of an existing empty directory must attempt to delete and replace that directory. - * @param parent The directory to which to move the entry. - * @param newName The new name of the entry. Defaults to the Entry's current name if unspecified. - * @param successCallback A callback that is called with the Entry for the new location. - * @param errorCallback A callback that is called when errors happen. */ - moveTo(parent: DirectoryEntry, - newName?: string, - successCallback?: (entry: Entry) => void, - errorCallback?: (error: FileError) => void): void; + moveTo(parent: DirectoryEntry, newName?: string, successCallback?: EntryCallback, errorCallback?: ErrorCallback): void; + /** * Copy an entry to a different location on the file system. It is an error to try to: - * copy a directory inside itself or to any child at any depth; - * copy an entry into its parent if a name different from its current one isn't provided; - * copy a file to a path occupied by a directory; - * copy a directory to a path occupied by a file; - * copy any element to a path occupied by a directory which is not empty. - * A copy of a file on top of an existing file must attempt to delete and replace that file. - * A copy of a directory on top of an existing empty directory must attempt to delete and replace that directory. + * + *
        + *
      • copy a directory inside itself or to any child at any depth;
      • + *
      • copy an entry into its parent if a name different from its current one isn't provided;
      • + *
      • copy a file to a path occupied by a directory;
      • + *
      • copy a directory to a path occupied by a file;
      • + *
      • copy any element to a path occupied by a directory which is not empty.
      • + *
      • A copy of a file on top of an existing file must attempt to delete and replace that file.
      • + *
      • A copy of a directory on top of an existing empty directory must attempt to delete and replace that directory.
      • + *
      + * * Directory copies are always recursive--that is, they copy all contents of the directory. - * @param parent The directory to which to move the entry. - * @param newName The new name of the entry. Defaults to the Entry's current name if unspecified. - * @param successCallback A callback that is called with the Entry for the new object. - * @param errorCallback A callback that is called when errors happen. */ - copyTo(parent: DirectoryEntry, - newName?: string, - successCallback?: (entry: Entry) => void, - errorCallback?: (error: FileError) => void): void; + copyTo(parent: DirectoryEntry, newName?: string, successCallback?: EntryCallback, errorCallback?: ErrorCallback): void; + /** - * Returns a URL that can be used as the src attribute of a