commit
a93667c9f9
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, OnInit, NgZone } from '@angular/core';
|
import { Component, OnInit, NgZone } from '@angular/core';
|
||||||
import { Platform, IonicApp } from 'ionic-angular';
|
import { Config, Platform, IonicApp } from 'ionic-angular';
|
||||||
import { Network } from '@ionic-native/network';
|
import { Network } from '@ionic-native/network';
|
||||||
import { CoreApp, CoreAppProvider } from '@providers/app';
|
import { CoreApp, CoreAppProvider } from '@providers/app';
|
||||||
import { CoreEventsProvider } from '@providers/events';
|
import { CoreEventsProvider } from '@providers/events';
|
||||||
|
@ -28,6 +28,7 @@ import { Keyboard } from '@ionic-native/keyboard';
|
||||||
import { ScreenOrientation } from '@ionic-native/screen-orientation';
|
import { ScreenOrientation } from '@ionic-native/screen-orientation';
|
||||||
import { CoreLoginSitesPage } from '@core/login/pages/sites/sites';
|
import { CoreLoginSitesPage } from '@core/login/pages/sites/sites';
|
||||||
import { CoreWindow } from '@singletons/window';
|
import { CoreWindow } from '@singletons/window';
|
||||||
|
import { Device } from '@ionic-native/device';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: 'app.html'
|
templateUrl: 'app.html'
|
||||||
|
@ -40,13 +41,62 @@ export class MoodleMobileApp implements OnInit {
|
||||||
protected lastUrls = {};
|
protected lastUrls = {};
|
||||||
protected lastInAppUrl: string;
|
protected lastInAppUrl: string;
|
||||||
|
|
||||||
constructor(private platform: Platform, logger: CoreLoggerProvider, keyboard: Keyboard, private app: IonicApp,
|
constructor(
|
||||||
private eventsProvider: CoreEventsProvider, private loginHelper: CoreLoginHelperProvider, private zone: NgZone,
|
private platform: Platform,
|
||||||
private appProvider: CoreAppProvider, private langProvider: CoreLangProvider, private sitesProvider: CoreSitesProvider,
|
logger: CoreLoggerProvider,
|
||||||
private screenOrientation: ScreenOrientation, private urlSchemesProvider: CoreCustomURLSchemesProvider,
|
keyboard: Keyboard,
|
||||||
private utils: CoreUtilsProvider, private urlUtils: CoreUrlUtilsProvider, private network: Network) {
|
config: Config,
|
||||||
|
device: Device,
|
||||||
|
private app: IonicApp,
|
||||||
|
private eventsProvider: CoreEventsProvider,
|
||||||
|
private loginHelper: CoreLoginHelperProvider,
|
||||||
|
private zone: NgZone,
|
||||||
|
private appProvider: CoreAppProvider,
|
||||||
|
private langProvider: CoreLangProvider,
|
||||||
|
private sitesProvider: CoreSitesProvider,
|
||||||
|
private screenOrientation: ScreenOrientation,
|
||||||
|
private urlSchemesProvider: CoreCustomURLSchemesProvider,
|
||||||
|
private utils: CoreUtilsProvider,
|
||||||
|
private urlUtils: CoreUrlUtilsProvider,
|
||||||
|
private network: Network
|
||||||
|
) {
|
||||||
this.logger = logger.getInstance('AppComponent');
|
this.logger = logger.getInstance('AppComponent');
|
||||||
|
|
||||||
|
if (this.appProvider.isIOS() && !platform.is('ios')) {
|
||||||
|
// Solve problem with wrong detected iPadOS.
|
||||||
|
const platforms = platform.platforms();
|
||||||
|
const index = platforms.indexOf('core');
|
||||||
|
if (index > -1) {
|
||||||
|
platforms.splice(index, 1);
|
||||||
|
}
|
||||||
|
platforms.push('mobile');
|
||||||
|
platforms.push('ios');
|
||||||
|
platforms.push('ipad');
|
||||||
|
platforms.push('tablet');
|
||||||
|
|
||||||
|
app.setElementClass('app-root-ios', true);
|
||||||
|
platform.ready().then(() => {
|
||||||
|
if (device.version) {
|
||||||
|
const [major, minor]: string[] = device.version.split('.', 2);
|
||||||
|
app.setElementClass('platform-ios' + major, true);
|
||||||
|
app.setElementClass('platform-ios' + major + '_' + minor, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app._elementRef.nativeElement.classList.remove('app-root-md');
|
||||||
|
|
||||||
|
const iosConfig = config.getModeConfig('ios');
|
||||||
|
|
||||||
|
config.set('mode', 'ios');
|
||||||
|
|
||||||
|
Object.keys(iosConfig).forEach((key) => {
|
||||||
|
// Already overriden: pageTransition, do not change.
|
||||||
|
if (key != 'pageTransition') {
|
||||||
|
config.set('ios', key, iosConfig[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
platform.ready().then(() => {
|
platform.ready().then(() => {
|
||||||
// Okay, so the platform is ready and our plugins are available.
|
// Okay, so the platform is ready and our plugins are available.
|
||||||
// Here you can do any higher level native things you might need.
|
// Here you can do any higher level native things you might need.
|
||||||
|
|
|
@ -49,33 +49,31 @@ export class CoreSharedFilesModule {
|
||||||
// Register the handler.
|
// Register the handler.
|
||||||
delegate.registerHandler(handler);
|
delegate.registerHandler(handler);
|
||||||
|
|
||||||
platform.ready().then(() => {
|
if (appsProvider.isIOS()) {
|
||||||
if (appsProvider.isIOS()) {
|
let lastCheck = 0;
|
||||||
let lastCheck = 0;
|
|
||||||
|
|
||||||
// Check if there are new files at app start and when the app is resumed.
|
// Check if there are new files at app start and when the app is resumed.
|
||||||
helper.searchIOSNewSharedFiles();
|
helper.searchIOSNewSharedFiles();
|
||||||
platform.resume.subscribe(() => {
|
platform.resume.subscribe(() => {
|
||||||
// Wait a bit to make sure that APP_LAUNCHED_URL is treated before this callback.
|
// Wait a bit to make sure that APP_LAUNCHED_URL is treated before this callback.
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (Date.now() - lastCheck < 1000) {
|
if (Date.now() - lastCheck < 1000) {
|
||||||
// Last check less than 1s ago, don't do anything.
|
// Last check less than 1s ago, don't do anything.
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
lastCheck = Date.now();
|
|
||||||
helper.searchIOSNewSharedFiles();
|
|
||||||
}, 200);
|
|
||||||
});
|
|
||||||
|
|
||||||
eventsProvider.on(CoreEventsProvider.APP_LAUNCHED_URL, (url) => {
|
|
||||||
if (url && url.indexOf('file://') === 0) {
|
|
||||||
// We received a file in iOS, it's probably a shared file. Treat it.
|
|
||||||
lastCheck = Date.now();
|
|
||||||
helper.searchIOSNewSharedFiles(url);
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
lastCheck = Date.now();
|
||||||
});
|
helper.searchIOSNewSharedFiles();
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
eventsProvider.on(CoreEventsProvider.APP_LAUNCHED_URL, (url) => {
|
||||||
|
if (url && url.indexOf('file://') === 0) {
|
||||||
|
// We received a file in iOS, it's probably a shared file. Treat it.
|
||||||
|
lastCheck = Date.now();
|
||||||
|
helper.searchIOSNewSharedFiles(url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import { Platform, App, NavController, MenuController } from 'ionic-angular';
|
||||||
import { Keyboard } from '@ionic-native/keyboard';
|
import { Keyboard } from '@ionic-native/keyboard';
|
||||||
import { Network } from '@ionic-native/network';
|
import { Network } from '@ionic-native/network';
|
||||||
import { StatusBar } from '@ionic-native/status-bar';
|
import { StatusBar } from '@ionic-native/status-bar';
|
||||||
import { Device } from '@ionic-native/device';
|
|
||||||
|
|
||||||
import { CoreDbProvider } from './db';
|
import { CoreDbProvider } from './db';
|
||||||
import { CoreLoggerProvider } from './logger';
|
import { CoreLoggerProvider } from './logger';
|
||||||
|
@ -179,7 +178,6 @@ export class CoreAppProvider {
|
||||||
zone: NgZone,
|
zone: NgZone,
|
||||||
private menuCtrl: MenuController,
|
private menuCtrl: MenuController,
|
||||||
private statusBar: StatusBar,
|
private statusBar: StatusBar,
|
||||||
private device: Device,
|
|
||||||
appRef: ApplicationRef) {
|
appRef: ApplicationRef) {
|
||||||
|
|
||||||
this.logger = logger.getInstance('CoreAppProvider');
|
this.logger = logger.getInstance('CoreAppProvider');
|
||||||
|
@ -392,8 +390,7 @@ export class CoreAppProvider {
|
||||||
* @return Whether the app is running in an Android mobile or tablet device.
|
* @return Whether the app is running in an Android mobile or tablet device.
|
||||||
*/
|
*/
|
||||||
isAndroid(): boolean {
|
isAndroid(): boolean {
|
||||||
return this.isMobile() &&
|
return this.isMobile() && this.platform.is('android');
|
||||||
((this.device.platform && this.device.platform.toLowerCase() == 'android') || this.platform.is('android'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -413,8 +410,7 @@ export class CoreAppProvider {
|
||||||
* @return Whether the app is running in an iOS mobile or tablet device.
|
* @return Whether the app is running in an iOS mobile or tablet device.
|
||||||
*/
|
*/
|
||||||
isIOS(): boolean {
|
isIOS(): boolean {
|
||||||
return this.isMobile() &&
|
return this.isMobile() && !this.platform.is('android');
|
||||||
((this.device.platform && this.device.platform.toLowerCase() == 'ios') || this.platform.is('ios'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -572,7 +568,7 @@ export class CoreAppProvider {
|
||||||
*/
|
*/
|
||||||
openKeyboard(): void {
|
openKeyboard(): void {
|
||||||
// Open keyboard is not supported in desktop and in iOS.
|
// Open keyboard is not supported in desktop and in iOS.
|
||||||
if (this.isMobile() && !this.isIOS()) {
|
if (this.isAndroid()) {
|
||||||
this.keyboard.show();
|
this.keyboard.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,31 +81,28 @@ export class CoreFileProvider {
|
||||||
|
|
||||||
this.logger = logger.getInstance('CoreFileProvider');
|
this.logger = logger.getInstance('CoreFileProvider');
|
||||||
|
|
||||||
platform.ready().then(() => {
|
if (appProvider.isAndroid() && !Object.getOwnPropertyDescriptor(FileReader.prototype, 'onloadend')) {
|
||||||
if (appProvider.isAndroid() && !Object.getOwnPropertyDescriptor(FileReader.prototype, 'onloadend')) {
|
// Cordova File plugin creates some getters and setter for FileReader, but Ionic's polyfills override them in Android.
|
||||||
// Cordova File plugin creates some getters and setter for FileReader, but
|
// Create the getters and setters again. This code comes from FileReader.js in cordova-plugin-file.
|
||||||
// Ionic's polyfills override them in Android.
|
this.defineGetterSetter(FileReader.prototype, 'readyState', function(): any {
|
||||||
// Create the getters and setters again. This code comes from FileReader.js in cordova-plugin-file.
|
return this._localURL ? this._readyState : this._realReader.readyState;
|
||||||
this.defineGetterSetter(FileReader.prototype, 'readyState', function(): any {
|
});
|
||||||
return this._localURL ? this._readyState : this._realReader.readyState;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.defineGetterSetter(FileReader.prototype, 'error', function(): any {
|
this.defineGetterSetter(FileReader.prototype, 'error', function(): any {
|
||||||
return this._localURL ? this._error : this._realReader.error;
|
return this._localURL ? this._error : this._realReader.error;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.defineGetterSetter(FileReader.prototype, 'result', function(): any {
|
this.defineGetterSetter(FileReader.prototype, 'result', function(): any {
|
||||||
return this._localURL ? this._result : this._realReader.result;
|
return this._localURL ? this._result : this._realReader.result;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.defineEvent('onloadstart');
|
this.defineEvent('onloadstart');
|
||||||
this.defineEvent('onprogress');
|
this.defineEvent('onprogress');
|
||||||
this.defineEvent('onload');
|
this.defineEvent('onload');
|
||||||
this.defineEvent('onerror');
|
this.defineEvent('onerror');
|
||||||
this.defineEvent('onloadend');
|
this.defineEvent('onloadend');
|
||||||
this.defineEvent('onabort');
|
this.defineEvent('onabort');
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -57,8 +57,8 @@ export class CoreIframeUtilsProvider {
|
||||||
|
|
||||||
const win = <WKUserScriptWindow> window;
|
const win = <WKUserScriptWindow> window;
|
||||||
|
|
||||||
platform.ready().then(() => {
|
if (appProvider.isIOS() && win.WKUserScript) {
|
||||||
if (appProvider.isIOS() && win.WKUserScript) {
|
platform.ready().then(() => {
|
||||||
// Inject code to the iframes because we cannot access the online ones.
|
// Inject code to the iframes because we cannot access the online ones.
|
||||||
const wwwPath = fileProvider.getWWWAbsolutePath();
|
const wwwPath = fileProvider.getWWWAbsolutePath();
|
||||||
const linksPath = textUtils.concatenatePaths(wwwPath, 'assets/js/iframe-treat-links.js');
|
const linksPath = textUtils.concatenatePaths(wwwPath, 'assets/js/iframe-treat-links.js');
|
||||||
|
@ -73,8 +73,8 @@ export class CoreIframeUtilsProvider {
|
||||||
|
|
||||||
// Handle post messages received by iframes.
|
// Handle post messages received by iframes.
|
||||||
window.addEventListener('message', this.handleIframeMessage.bind(this));
|
window.addEventListener('message', this.handleIframeMessage.bind(this));
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue