From 43be0b3d0a4efcdde60fb6ff98f3b67c3507d36f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 11 May 2018 11:15:53 +0200 Subject: [PATCH] MOBILE-2403 core: Install webintent and implement openOnlineFile --- config.xml | 1 + package-lock.json | 5 ++++ package.json | 1 + src/core/emulator/emulator.module.ts | 2 ++ src/providers/utils/utils.ts | 45 +++++++++++++++++++--------- 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/config.xml b/config.xml index a89e51c60..49ab9744e 100644 --- a/config.xml +++ b/config.xml @@ -117,4 +117,5 @@ + diff --git a/package-lock.json b/package-lock.json index c394eda7a..e74f74fee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -210,6 +210,11 @@ "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-4.3.0.tgz", "integrity": "sha512-gjS0U2uT6XYshysvzNu98Pf6b5SZ7SGSYkZW1mft19geFn6/MKunX1CJkjpXmiTn14nAD1+FBxF43Oi2OfoM4g==" }, + "@ionic-native/web-intent": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@ionic-native/web-intent/-/web-intent-4.7.0.tgz", + "integrity": "sha512-G8fcZA7W6gp1GO4HmcpQm9G8QfJiLsl6SYG5OmeYaqn8au6Ggif7Aqv2RWX7o/17BEYRnyCXh5MYMfJFbOWLQw==" + }, "@ionic-native/zip": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/@ionic-native/zip/-/zip-4.5.2.tgz", diff --git a/package.json b/package.json index f8b294a40..bf0690d09 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@ionic-native/splash-screen": "4.3.0", "@ionic-native/sqlite": "^4.3.2", "@ionic-native/status-bar": "4.3.0", + "@ionic-native/web-intent": "^4.7.0", "@ionic-native/zip": "^4.3.3", "@ngx-translate/core": "^8.0.0", "@ngx-translate/http-loader": "^2.0.0", diff --git a/src/core/emulator/emulator.module.ts b/src/core/emulator/emulator.module.ts index 3bdc51088..93a7fdb5e 100644 --- a/src/core/emulator/emulator.module.ts +++ b/src/core/emulator/emulator.module.ts @@ -33,6 +33,7 @@ import { Push } from '@ionic-native/push'; import { SplashScreen } from '@ionic-native/splash-screen'; import { StatusBar } from '@ionic-native/status-bar'; import { SQLite } from '@ionic-native/sqlite'; +import { WebIntent } from '@ionic-native/web-intent'; import { Zip } from '@ionic-native/zip'; // Services that Mock Ionic Native in browser an desktop. @@ -190,6 +191,7 @@ export const IONIC_NATIVE_PROVIDERS = [ SplashScreen, StatusBar, SQLite, + WebIntent, { provide: Zip, deps: [CoreAppProvider, File, CoreTextUtilsProvider], diff --git a/src/providers/utils/utils.ts b/src/providers/utils/utils.ts index 73a4b825f..e135f4465 100644 --- a/src/providers/utils/utils.ts +++ b/src/providers/utils/utils.ts @@ -17,6 +17,7 @@ import { Platform } from 'ionic-angular'; import { InAppBrowser, InAppBrowserObject } from '@ionic-native/in-app-browser'; import { Clipboard } from '@ionic-native/clipboard'; import { FileOpener } from '@ionic-native/file-opener'; +import { WebIntent } from '@ionic-native/web-intent'; import { CoreAppProvider } from '../app'; import { CoreDomUtilsProvider } from './dom'; import { CoreMimetypeUtilsProvider } from './mimetype'; @@ -62,7 +63,7 @@ export class CoreUtilsProvider { constructor(private iab: InAppBrowser, private appProvider: CoreAppProvider, private clipboard: Clipboard, private domUtils: CoreDomUtilsProvider, logger: CoreLoggerProvider, private translate: TranslateService, private platform: Platform, private langProvider: CoreLangProvider, private eventsProvider: CoreEventsProvider, - private fileOpener: FileOpener, private mimetypeUtils: CoreMimetypeUtilsProvider) { + private fileOpener: FileOpener, private mimetypeUtils: CoreMimetypeUtilsProvider, private webIntent: WebIntent) { this.logger = logger.getInstance('CoreUtilsProvider'); } @@ -680,10 +681,6 @@ export class CoreUtilsProvider { /** * Open a file using platform specific method. * - * node-webkit: Using the default application configured. - * Android: Using the WebIntent plugin. - * iOs: Using handleDocumentWithURL. - * * @param {string} path The local path of the file to be open. * @return {Promise} Promise resolved when done. */ @@ -778,19 +775,39 @@ export class CoreUtilsProvider { * Open an online file using platform specific method. * Specially useful for audio and video since they can be streamed. * - * node-webkit: Using the default application configured. - * Android: Using the WebIntent plugin. - * iOS: Using the window.open method (InAppBrowser) - * We don't use iOS quickview framework because it doesn't support streaming. - * * @param {string} url The URL of the file. * @return {Promise} Promise resolved when opened. */ openOnlineFile(url: string): Promise { - return new Promise((resolve, reject): void => { - // @todo - reject('TODO'); - }); + if (this.platform.is('android')) { + // In Android we need the mimetype to open it. + return this.mimetypeUtils.getMimeTypeFromUrl(url).catch(() => { + // Error getting mimetype, return undefined. + }).then((mimetype) => { + if (!mimetype) { + // Couldn't retrieve mimetype. Return error. + return Promise.reject(this.translate.instant('core.erroropenfilenoextension')); + } + + const options = { + action: this.webIntent.ACTION_VIEW, + url: url, + type: mimetype + }; + + return this.webIntent.startActivity(options).catch((error) => { + this.logger.error('Error opening online file ' + url + ' with mimetype ' + mimetype); + this.logger.error('Error: ', JSON.stringify(error)); + + return Promise.reject(this.translate.instant('core.erroropenfilenoapp')); + }); + }); + } + + // In the rest of platforms we need to open them in InAppBrowser. + window.open(url, '_blank'); + + return Promise.resolve(); } /**