Merge pull request #2523 from crazyserver/MOBILE-3532

Mobile 3532
main
Juan Leyva 2020-09-16 09:37:55 +02:00 committed by GitHub
commit a93667c9f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 106 additions and 65 deletions

View File

@ -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.

View File

@ -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);
}
});
}
} }
} }

View File

@ -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();
} }
} }

View File

@ -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');
} }
});
} }
/** /**

View File

@ -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));
} });
}); }
} }
/** /**