MOBILE-3320 core: Refactor initializers
parent
af0b3aa2b9
commit
f1bc354be6
|
@ -3312,6 +3312,12 @@
|
||||||
"integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
|
"integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/webpack-env": {
|
||||||
|
"version": "1.16.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.0.tgz",
|
||||||
|
"integrity": "sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/webpack-sources": {
|
"@types/webpack-sources": {
|
||||||
"version": "0.1.8",
|
"version": "0.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz",
|
||||||
|
|
|
@ -131,6 +131,7 @@
|
||||||
"@ionic/angular-toolkit": "^2.3.0",
|
"@ionic/angular-toolkit": "^2.3.0",
|
||||||
"@types/faker": "^5.1.3",
|
"@types/faker": "^5.1.3",
|
||||||
"@types/node": "^12.12.64",
|
"@types/node": "^12.12.64",
|
||||||
|
"@types/webpack-env": "^1.16.0",
|
||||||
"@typescript-eslint/eslint-plugin": "4.3.0",
|
"@typescript-eslint/eslint-plugin": "4.3.0",
|
||||||
"@typescript-eslint/parser": "4.3.0",
|
"@typescript-eslint/parser": "4.3.0",
|
||||||
"eslint": "^7.6.0",
|
"eslint": "^7.6.0",
|
||||||
|
|
|
@ -12,9 +12,10 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { ApplicationInitStatus, APP_INITIALIZER, Injector } from '@angular/core';
|
import { ApplicationInitStatus, APP_INITIALIZER, Injectable, Injector } from '@angular/core';
|
||||||
import { setSingletonsInjector } from '@singletons';
|
import { setSingletonsInjector } from '@singletons';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
export class CoreApplicationInitStatus extends ApplicationInitStatus {
|
export class CoreApplicationInitStatus extends ApplicationInitStatus {
|
||||||
|
|
||||||
constructor(injector: Injector) {
|
constructor(injector: Injector) {
|
||||||
|
|
|
@ -15,18 +15,14 @@
|
||||||
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||||
import { ApplicationInitStatus, Injector, NgModule } from '@angular/core';
|
import { ApplicationInitStatus, Injector, NgModule } from '@angular/core';
|
||||||
|
|
||||||
import { Platform } from '@ionic/angular';
|
|
||||||
|
|
||||||
import { CoreApplicationInitStatus } from './classes/application-init-status';
|
import { CoreApplicationInitStatus } from './classes/application-init-status';
|
||||||
import { CoreFeaturesModule } from './features/features.module';
|
import { CoreFeaturesModule } from './features/features.module';
|
||||||
import { CoreFile } from './services/file';
|
|
||||||
import { CoreInit, CoreInitDelegate } from './services/init';
|
|
||||||
import { CoreInterceptor } from './classes/interceptor';
|
import { CoreInterceptor } from './classes/interceptor';
|
||||||
import { CoreSites, CORE_SITE_SCHEMAS } from './services/sites';
|
import { CORE_SITE_SCHEMAS } from './services/sites';
|
||||||
import { CoreUpdateManager } from './services/update-manager';
|
|
||||||
import { SITE_SCHEMA as FILEPOOL_SITE_SCHEMA } from './services/db/filepool';
|
import { SITE_SCHEMA as FILEPOOL_SITE_SCHEMA } from './services/db/filepool';
|
||||||
import { SITE_SCHEMA as SITES_SITE_SCHEMA } from './services/db/sites';
|
import { SITE_SCHEMA as SITES_SITE_SCHEMA } from './services/db/sites';
|
||||||
import { SITE_SCHEMA as SYNC_SITE_SCHEMA } from './services/db/sync';
|
import { SITE_SCHEMA as SYNC_SITE_SCHEMA } from './services/db/sync';
|
||||||
|
import { getInitializerProviders } from './initializers';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -44,42 +40,7 @@ import { SITE_SCHEMA as SYNC_SITE_SCHEMA } from './services/db/sync';
|
||||||
],
|
],
|
||||||
multi: true,
|
multi: true,
|
||||||
},
|
},
|
||||||
|
...getInitializerProviders(),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class CoreModule {
|
export class CoreModule {}
|
||||||
|
|
||||||
constructor(platform: Platform) {
|
|
||||||
// Register a handler for platform ready.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CorePlatformReady',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 400,
|
|
||||||
blocking: true,
|
|
||||||
load: async () => {
|
|
||||||
await platform.ready();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Register the update manager as an init process.
|
|
||||||
CoreInit.instance.registerProcess(CoreUpdateManager.instance);
|
|
||||||
|
|
||||||
// Restore the user's session during the init process.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CoreRestoreSession',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 200,
|
|
||||||
blocking: false,
|
|
||||||
load: CoreSites.instance.restoreSession.bind(CoreSites.instance),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Register clear app tmp folder.
|
|
||||||
CoreInit.instance.registerProcess({
|
|
||||||
name: 'CoreClearTmpFolder',
|
|
||||||
priority: CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 150,
|
|
||||||
blocking: false,
|
|
||||||
load: CoreFile.instance.clearTmpFolder.bind(CoreFile.instance),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Execute the init processes.
|
|
||||||
CoreInit.instance.executeInitProcesses();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -12,10 +12,9 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { NgModule } from '@angular/core';
|
import { APP_INITIALIZER, NgModule } from '@angular/core';
|
||||||
import { Platform } from '@ionic/angular';
|
import { Platform } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreInitDelegate } from '@services/init';
|
|
||||||
import { CoreEmulatorHelperProvider } from './services/emulator-helper';
|
import { CoreEmulatorHelperProvider } from './services/emulator-helper';
|
||||||
import { CoreEmulatorComponentsModule } from './components/components.module';
|
import { CoreEmulatorComponentsModule } from './components/components.module';
|
||||||
|
|
||||||
|
@ -141,20 +140,18 @@ import { ZipMock } from './services/zip';
|
||||||
deps: [Platform, File],
|
deps: [Platform, File],
|
||||||
useFactory: (platform: Platform, file: File): Zip => platform.is('cordova') ? new Zip() : new ZipMock(file),
|
useFactory: (platform: Platform, file: File): Zip => platform.is('cordova') ? new Zip() : new ZipMock(file),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
provide: APP_INITIALIZER,
|
||||||
|
deps: [Platform, CoreEmulatorHelperProvider],
|
||||||
|
useFactory: (platform: Platform, helperProvider: CoreEmulatorHelperProvider) => () => {
|
||||||
|
if (platform.is('cordova')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return helperProvider.load();
|
||||||
|
},
|
||||||
|
multi: true,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class CoreEmulatorModule {
|
export class CoreEmulatorModule {}
|
||||||
|
|
||||||
constructor(
|
|
||||||
platform: Platform,
|
|
||||||
initDelegate: CoreInitDelegate,
|
|
||||||
helper: CoreEmulatorHelperProvider,
|
|
||||||
) {
|
|
||||||
|
|
||||||
if (!platform.is('cordova')) {
|
|
||||||
// Register an init process to load the Mocks that need it.
|
|
||||||
initDelegate.registerProcess(helper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ import { Injectable } from '@angular/core';
|
||||||
import { File } from '@ionic-native/file/ngx';
|
import { File } from '@ionic-native/file/ngx';
|
||||||
|
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreInitDelegate, CoreInitHandler } from '@services/init';
|
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import { FileMock } from './file';
|
import { FileMock } from './file';
|
||||||
|
@ -25,14 +24,8 @@ import { FileTransferErrorMock } from './file-transfer';
|
||||||
/**
|
/**
|
||||||
* Helper service for the emulator feature. It also acts as an init handler.
|
* Helper service for the emulator feature. It also acts as an init handler.
|
||||||
*/
|
*/
|
||||||
@Injectable({
|
@Injectable({ providedIn: 'root' })
|
||||||
providedIn: 'root',
|
export class CoreEmulatorHelperProvider {
|
||||||
})
|
|
||||||
export class CoreEmulatorHelperProvider implements CoreInitHandler {
|
|
||||||
|
|
||||||
name = 'CoreEmulator';
|
|
||||||
priority = CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 500;
|
|
||||||
blocking = true;
|
|
||||||
|
|
||||||
protected logger: CoreLogger;
|
protected logger: CoreLogger;
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ import { Component, OnInit } from '@angular/core';
|
||||||
import { NavController } from '@ionic/angular';
|
import { NavController } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreApp, CoreRedirectData } from '@services/app';
|
import { CoreApp, CoreRedirectData } from '@services/app';
|
||||||
import { CoreInit } from '@services/init';
|
import { ApplicationInit, SplashScreen } from '@singletons';
|
||||||
import { SplashScreen } from '@singletons';
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreLoginHelper } from '@features/login/services/login-helper';
|
import { CoreLoginHelper } from '@features/login/services/login-helper';
|
||||||
|
@ -39,7 +38,7 @@ export class CoreLoginInitPage implements OnInit {
|
||||||
*/
|
*/
|
||||||
async ngOnInit(): Promise<void> {
|
async ngOnInit(): Promise<void> {
|
||||||
// Wait for the app to be ready.
|
// Wait for the app to be ready.
|
||||||
await CoreInit.instance.ready();
|
await ApplicationInit.instance.donePromise;
|
||||||
|
|
||||||
// Check if there was a pending redirect.
|
// Check if there was a pending redirect.
|
||||||
const redirectData = CoreApp.instance.getRedirect();
|
const redirectData = CoreApp.instance.getRedirect();
|
||||||
|
|
|
@ -15,10 +15,9 @@
|
||||||
import { NavController } from '@ionic/angular';
|
import { NavController } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { CoreInit } from '@services/init';
|
|
||||||
import { CoreLoginInitPage } from '@features/login/pages/init/init';
|
import { CoreLoginInitPage } from '@features/login/pages/init/init';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { SplashScreen } from '@singletons';
|
import { ApplicationInit, SplashScreen } from '@singletons';
|
||||||
|
|
||||||
import { mock, mockSingleton, renderComponent, RenderConfig } from '@/testing/utils';
|
import { mock, mockSingleton, renderComponent, RenderConfig } from '@/testing/utils';
|
||||||
|
|
||||||
|
@ -29,7 +28,7 @@ describe('CoreLoginInitPage', () => {
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mockSingleton(CoreApp, { getRedirect: () => ({}) });
|
mockSingleton(CoreApp, { getRedirect: () => ({}) });
|
||||||
mockSingleton(CoreInit, { ready: () => Promise.resolve() });
|
mockSingleton(ApplicationInit, { donePromise: Promise.resolve() });
|
||||||
mockSingleton(CoreSites, { isLoggedIn: () => false });
|
mockSingleton(CoreSites, { isLoggedIn: () => false });
|
||||||
mockSingleton(SplashScreen, ['hide']);
|
mockSingleton(SplashScreen, ['hide']);
|
||||||
|
|
||||||
|
@ -52,7 +51,7 @@ describe('CoreLoginInitPage', () => {
|
||||||
const fixture = await renderComponent(CoreLoginInitPage, config);
|
const fixture = await renderComponent(CoreLoginInitPage, config);
|
||||||
|
|
||||||
fixture.componentInstance.ngOnInit();
|
fixture.componentInstance.ngOnInit();
|
||||||
await CoreInit.instance.ready();
|
await ApplicationInit.instance.donePromise;
|
||||||
|
|
||||||
expect(navController.navigateRoot).toHaveBeenCalledWith('/login/sites');
|
expect(navController.navigateRoot).toHaveBeenCalledWith('/login/sites');
|
||||||
});
|
});
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Router, CanLoad, CanActivate, UrlTree } from '@angular/router';
|
import { Router, CanLoad, CanActivate, UrlTree } from '@angular/router';
|
||||||
|
|
||||||
import { CoreInit } from '@services/init';
|
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
import { ApplicationInit } from '@singletons';
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class AuthGuard implements CanLoad, CanActivate {
|
export class AuthGuard implements CanLoad, CanActivate {
|
||||||
|
@ -32,7 +32,7 @@ export class AuthGuard implements CanLoad, CanActivate {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async guard(): Promise<true | UrlTree> {
|
private async guard(): Promise<true | UrlTree> {
|
||||||
await CoreInit.instance.ready();
|
await ApplicationInit.instance.donePromise;
|
||||||
|
|
||||||
return CoreSites.instance.isLoggedIn() || this.router.parseUrl('/login');
|
return CoreSites.instance.isLoggedIn() || this.router.parseUrl('/login');
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { CoreFile } from '@services/file';
|
||||||
|
|
||||||
|
export default async function(): Promise<void> {
|
||||||
|
await CoreFile.instance.clearTmpFolder();
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { APP_INITIALIZER, Provider } from '@angular/core';
|
||||||
|
|
||||||
|
export function getInitializerProviders(): Provider[] {
|
||||||
|
const context = require.context('./', false, /\.ts$/);
|
||||||
|
|
||||||
|
return context.keys().reduce((providers, fileName) => {
|
||||||
|
const name = (fileName.match(/^(?:\.\/)?(.+)\.ts$/) || [])[1];
|
||||||
|
|
||||||
|
if (typeof name !== 'undefined' && name !== 'index') {
|
||||||
|
providers.push({
|
||||||
|
provide: APP_INITIALIZER,
|
||||||
|
useValue: context(fileName).default,
|
||||||
|
multi: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return providers;
|
||||||
|
}, [] as Provider[]);
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { CoreUpdateManager } from '@services/update-manager';
|
||||||
|
|
||||||
|
export default async function(): Promise<void> {
|
||||||
|
await CoreUpdateManager.instance.load();
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Platform } from '@singletons';
|
||||||
|
|
||||||
|
export default async function(): Promise<void> {
|
||||||
|
await Platform.instance.ready();
|
||||||
|
|
||||||
|
if (!window.cordova?.InAppBrowser) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.open = window.cordova.InAppBrowser.open;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { ApplicationRef } from '@angular/core';
|
||||||
|
import { CoreApp, CoreAppProvider } from '@services/app';
|
||||||
|
import { CoreCron, CoreCronDelegate } from '@services/cron';
|
||||||
|
import { Application } from '@singletons';
|
||||||
|
|
||||||
|
type AutomatedTestsWindow = Window & {
|
||||||
|
appRef?: ApplicationRef;
|
||||||
|
appProvider?: CoreAppProvider;
|
||||||
|
cronProvider?: CoreCronDelegate;
|
||||||
|
};
|
||||||
|
|
||||||
|
function initializeAutomatedTestsWindow(window: AutomatedTestsWindow) {
|
||||||
|
window.appRef = Application.instance;
|
||||||
|
window.appProvider = CoreApp.instance;
|
||||||
|
window.cronProvider = CoreCron.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function(): void {
|
||||||
|
if (!CoreAppProvider.isAutomated()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
initializeAutomatedTestsWindow(window);
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { CoreSites } from '@services/sites';
|
||||||
|
|
||||||
|
export default async function(): Promise<void> {
|
||||||
|
await CoreSites.instance.restoreSession();
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { CoreApp } from '@services/app';
|
||||||
|
import { NgZone, Keyboard } from '@singletons';
|
||||||
|
|
||||||
|
export default function(): void {
|
||||||
|
const zone = NgZone.instance;
|
||||||
|
const app = CoreApp.instance;
|
||||||
|
const keyboard = Keyboard.instance;
|
||||||
|
|
||||||
|
// Execute callbacks in the Angular zone, so change detection doesn't stop working.
|
||||||
|
keyboard.onKeyboardShow().subscribe(data => zone.run(() => app.onKeyboardShow(data.keyboardHeight)));
|
||||||
|
keyboard.onKeyboardHide().subscribe(() => zone.run(() => app.onKeyboardHide()));
|
||||||
|
keyboard.onKeyboardWillShow().subscribe(() => zone.run(() => app.onKeyboardWillShow()));
|
||||||
|
keyboard.onKeyboardWillHide().subscribe(() => zone.run(() => app.onKeyboardWillHide()));
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Platform } from '@singletons';
|
||||||
|
|
||||||
|
export default async function(): Promise<void> {
|
||||||
|
await Platform.instance.ready();
|
||||||
|
}
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injectable, NgZone, ApplicationRef } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Params, Router } from '@angular/router';
|
import { Params, Router } from '@angular/router';
|
||||||
import { Connection } from '@ionic-native/network/ngx';
|
import { Connection } from '@ionic-native/network/ngx';
|
||||||
|
|
||||||
|
@ -57,60 +57,17 @@ export class CoreAppProvider {
|
||||||
// Variables for DB.
|
// Variables for DB.
|
||||||
protected createVersionsTableReady: Promise<void>;
|
protected createVersionsTableReady: Promise<void>;
|
||||||
|
|
||||||
constructor(
|
constructor(protected router: Router) {
|
||||||
appRef: ApplicationRef,
|
|
||||||
zone: NgZone,
|
|
||||||
protected router: Router,
|
|
||||||
) {
|
|
||||||
this.logger = CoreLogger.getInstance('CoreAppProvider');
|
this.logger = CoreLogger.getInstance('CoreAppProvider');
|
||||||
this.db = CoreDB.instance.getDB(DBNAME);
|
this.db = CoreDB.instance.getDB(DBNAME);
|
||||||
|
|
||||||
// Create the schema versions table.
|
// Create the schema versions table.
|
||||||
this.createVersionsTableReady = this.db.createTableFromSchema(SCHEMA_VERSIONS_TABLE_SCHEMA);
|
this.createVersionsTableReady = this.db.createTableFromSchema(SCHEMA_VERSIONS_TABLE_SCHEMA);
|
||||||
|
|
||||||
Keyboard.instance.onKeyboardShow().subscribe((data) => {
|
|
||||||
// Execute the callback in the Angular zone, so change detection doesn't stop working.
|
|
||||||
zone.run(() => {
|
|
||||||
document.body.classList.add('keyboard-is-open');
|
|
||||||
this.setKeyboardShown(true);
|
|
||||||
// Error on iOS calculating size.
|
|
||||||
// More info: https://github.com/ionic-team/ionic-plugin-keyboard/issues/276 .
|
|
||||||
CoreEvents.trigger(CoreEvents.KEYBOARD_CHANGE, data.keyboardHeight);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Keyboard.instance.onKeyboardHide().subscribe(() => {
|
|
||||||
// Execute the callback in the Angular zone, so change detection doesn't stop working.
|
|
||||||
zone.run(() => {
|
|
||||||
document.body.classList.remove('keyboard-is-open');
|
|
||||||
this.setKeyboardShown(false);
|
|
||||||
CoreEvents.trigger(CoreEvents.KEYBOARD_CHANGE, 0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Keyboard.instance.onKeyboardWillShow().subscribe(() => {
|
|
||||||
// Execute the callback in the Angular zone, so change detection doesn't stop working.
|
|
||||||
zone.run(() => {
|
|
||||||
this.keyboardOpening = true;
|
|
||||||
this.keyboardClosing = false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Keyboard.instance.onKeyboardWillHide().subscribe(() => {
|
|
||||||
// Execute the callback in the Angular zone, so change detection doesn't stop working.
|
|
||||||
zone.run(() => {
|
|
||||||
this.keyboardOpening = false;
|
|
||||||
this.keyboardClosing = true;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// @todo
|
// @todo
|
||||||
// this.platform.registerBackButtonAction(() => {
|
// this.platform.registerBackButtonAction(() => {
|
||||||
// this.backButtonAction();
|
// this.backButtonAction();
|
||||||
// }, 100);
|
// }, 100);
|
||||||
|
|
||||||
// Export the app provider and appRef to control the application in Behat tests.
|
|
||||||
if (CoreAppProvider.isAutomated()) {
|
|
||||||
(<WindowForAutomatedTests> window).appProvider = this;
|
|
||||||
(<WindowForAutomatedTests> window).appRef = appRef;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -429,6 +386,44 @@ export class CoreAppProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify that Keyboard has been shown.
|
||||||
|
*
|
||||||
|
* @param keyboardHeight Keyboard height.
|
||||||
|
*/
|
||||||
|
onKeyboardShow(keyboardHeight: number): void {
|
||||||
|
document.body.classList.add('keyboard-is-open');
|
||||||
|
this.setKeyboardShown(true);
|
||||||
|
// Error on iOS calculating size.
|
||||||
|
// More info: https://github.com/ionic-team/ionic-plugin-keyboard/issues/276 .
|
||||||
|
CoreEvents.trigger(CoreEvents.KEYBOARD_CHANGE, keyboardHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify that Keyboard has been hidden.
|
||||||
|
*/
|
||||||
|
onKeyboardHide(): void {
|
||||||
|
document.body.classList.remove('keyboard-is-open');
|
||||||
|
this.setKeyboardShown(false);
|
||||||
|
CoreEvents.trigger(CoreEvents.KEYBOARD_CHANGE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify that Keyboard is about to be shown.
|
||||||
|
*/
|
||||||
|
onKeyboardWillShow(): void {
|
||||||
|
this.keyboardOpening = true;
|
||||||
|
this.keyboardClosing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify that Keyboard is about to be hidden.
|
||||||
|
*/
|
||||||
|
onKeyboardWillHide(): void {
|
||||||
|
this.keyboardOpening = false;
|
||||||
|
this.keyboardClosing = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set keyboard shown or hidden.
|
* Set keyboard shown or hidden.
|
||||||
*
|
*
|
||||||
|
@ -735,11 +730,3 @@ export type CoreAppSchema = {
|
||||||
*/
|
*/
|
||||||
migrate?(db: SQLiteDB, oldVersion: number): Promise<void>;
|
migrate?(db: SQLiteDB, oldVersion: number): Promise<void>;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Extended window type for automated tests.
|
|
||||||
*/
|
|
||||||
export type WindowForAutomatedTests = Window & {
|
|
||||||
appProvider?: CoreAppProvider;
|
|
||||||
appRef?: ApplicationRef;
|
|
||||||
};
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { Injectable, NgZone } from '@angular/core';
|
import { Injectable, NgZone } from '@angular/core';
|
||||||
|
|
||||||
import { CoreApp, CoreAppProvider } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { CoreConfig } from '@services/config';
|
import { CoreConfig } from '@services/config';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
|
@ -57,11 +57,6 @@ export class CoreCronDelegate {
|
||||||
this.startNetworkHandlers();
|
this.startNetworkHandlers();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Export the sync provider so Behat tests can trigger cron tasks without waiting.
|
|
||||||
if (CoreAppProvider.isAutomated()) {
|
|
||||||
(<WindowForAutomatedTests> window).cronProvider = this;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -532,10 +527,3 @@ export interface CoreCronHandler {
|
||||||
*/
|
*/
|
||||||
execute?(siteId?: string, force?: boolean): Promise<void>;
|
execute?(siteId?: string, force?: boolean): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Extended window type for automated tests.
|
|
||||||
*/
|
|
||||||
export type WindowForAutomatedTests = Window & {
|
|
||||||
cronProvider?: CoreCronDelegate;
|
|
||||||
};
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import { Md5 } from 'ts-md5/dist/md5';
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
import { CoreEvents } from '@singletons/events';
|
import { CoreEvents } from '@singletons/events';
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreInit } from '@services/init';
|
|
||||||
import { CorePluginFile } from '@services/plugin-file-delegate';
|
import { CorePluginFile } from '@services/plugin-file-delegate';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreWS, CoreWSExternalFile } from '@services/ws';
|
import { CoreWS, CoreWSExternalFile } from '@services/ws';
|
||||||
|
@ -31,7 +30,7 @@ import { CoreUtils, PromiseDefer } from '@services/utils/utils';
|
||||||
import { SQLiteDB } from '@classes/sqlitedb';
|
import { SQLiteDB } from '@classes/sqlitedb';
|
||||||
import { CoreError } from '@classes/errors/error';
|
import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { makeSingleton, Network, NgZone, Translate } from '@singletons';
|
import { ApplicationInit, makeSingleton, Network, NgZone, Translate } from '@singletons';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import {
|
import {
|
||||||
APP_SCHEMA,
|
APP_SCHEMA,
|
||||||
|
@ -108,7 +107,7 @@ export class CoreFilepoolProvider {
|
||||||
*/
|
*/
|
||||||
protected async init(): Promise<void> {
|
protected async init(): Promise<void> {
|
||||||
// Waiting for the app to be ready to start processing the queue.
|
// Waiting for the app to be ready to start processing the queue.
|
||||||
await CoreInit.instance.ready();
|
await ApplicationInit.instance.donePromise;
|
||||||
|
|
||||||
this.checkQueueProcessing();
|
this.checkQueueProcessing();
|
||||||
|
|
||||||
|
|
|
@ -1,179 +0,0 @@
|
||||||
// (C) Copyright 2015 Moodle Pty Ltd.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
|
|
||||||
import { CoreUtils, PromiseDefer, OrderedPromiseData } from '@services/utils/utils';
|
|
||||||
import { CoreLogger } from '@singletons/logger';
|
|
||||||
import { makeSingleton } from '@singletons';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface that all init handlers must implement.
|
|
||||||
*/
|
|
||||||
export type CoreInitHandler = {
|
|
||||||
/**
|
|
||||||
* A name to identify the handler.
|
|
||||||
*/
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The highest priority is executed first. You should use values lower than MAX_RECOMMENDED_PRIORITY.
|
|
||||||
*/
|
|
||||||
priority?: number;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set this to true when this process should be resolved before any following one.
|
|
||||||
*/
|
|
||||||
blocking?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to execute during the init process.
|
|
||||||
*
|
|
||||||
* @return Promise resolved when done.
|
|
||||||
*/
|
|
||||||
load(): Promise<void>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Provider for initialisation mechanisms.
|
|
||||||
*/
|
|
||||||
@Injectable({ providedIn: 'root' })
|
|
||||||
export class CoreInitDelegate {
|
|
||||||
|
|
||||||
static readonly DEFAULT_PRIORITY = 100; // Default priority for init processes.
|
|
||||||
static readonly MAX_RECOMMENDED_PRIORITY = 600;
|
|
||||||
|
|
||||||
protected initProcesses: { [s: string]: CoreInitHandler } = {};
|
|
||||||
protected logger: CoreLogger;
|
|
||||||
protected readiness?: CoreInitReadinessPromiseDefer<void>;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.logger = CoreLogger.getInstance('CoreInitDelegate');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes the registered init processes.
|
|
||||||
*
|
|
||||||
* Reserved for core use, do not call directly.
|
|
||||||
*/
|
|
||||||
executeInitProcesses(): void {
|
|
||||||
const ordered: CoreInitHandler[] = [];
|
|
||||||
|
|
||||||
if (typeof this.readiness == 'undefined') {
|
|
||||||
this.initReadiness();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Re-ordering by priority.
|
|
||||||
for (const name in this.initProcesses) {
|
|
||||||
ordered.push(this.initProcesses[name]);
|
|
||||||
}
|
|
||||||
ordered.sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
||||||
|
|
||||||
const orderedPromises: OrderedPromiseData[] = ordered.map((data: CoreInitHandler) => ({
|
|
||||||
function: this.prepareProcess.bind(this, data),
|
|
||||||
blocking: !!data.blocking,
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Execute all the processes in order to solve dependencies.
|
|
||||||
CoreUtils.instance.executeOrderedPromises(orderedPromises).finally(this.readiness!.resolve);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Init the readiness promise.
|
|
||||||
*/
|
|
||||||
protected initReadiness(): void {
|
|
||||||
this.readiness = CoreUtils.instance.promiseDefer();
|
|
||||||
|
|
||||||
// eslint-disable-next-line promise/catch-or-return
|
|
||||||
this.readiness.promise.then(() => this.readiness!.resolved = true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantly returns if the app is ready.
|
|
||||||
*
|
|
||||||
* @return Whether it's ready.
|
|
||||||
*/
|
|
||||||
isReady(): boolean {
|
|
||||||
return this.readiness?.resolved || false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convenience function to return a function that executes the process.
|
|
||||||
*
|
|
||||||
* @param data The data of the process.
|
|
||||||
* @return Promise of the process.
|
|
||||||
*/
|
|
||||||
protected async prepareProcess(data: CoreInitHandler): Promise<void> {
|
|
||||||
this.logger.debug(`Executing init process '${data.name}'`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
await data.load();
|
|
||||||
} catch (e) {
|
|
||||||
this.logger.error('Error while calling the init process \'' + data.name + '\'. ' + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notifies when the app is ready. This returns a promise that is resolved when the app is initialised.
|
|
||||||
*
|
|
||||||
* @return Resolved when the app is initialised. Never rejected.
|
|
||||||
*/
|
|
||||||
async ready(): Promise<void> {
|
|
||||||
if (typeof this.readiness == 'undefined') {
|
|
||||||
// Prevent race conditions if this is called before executeInitProcesses.
|
|
||||||
this.initReadiness();
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.readiness!.promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers an initialisation process.
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Init processes can be used to add initialisation logic to the app. Anything that should block the user interface while
|
|
||||||
* some processes are done should be an init process. It is recommended to use a priority lower than MAX_RECOMMENDED_PRIORITY
|
|
||||||
* to make sure that your process does not happen before some essential other core processes.
|
|
||||||
*
|
|
||||||
* An init process should never change state or prompt user interaction.
|
|
||||||
*
|
|
||||||
* This delegate cannot be used by site plugins.
|
|
||||||
*
|
|
||||||
* @param instance The instance of the handler.
|
|
||||||
*/
|
|
||||||
registerProcess(handler: CoreInitHandler): void {
|
|
||||||
if (typeof handler.priority == 'undefined') {
|
|
||||||
handler.priority = CoreInitDelegate.DEFAULT_PRIORITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof this.initProcesses[handler.name] != 'undefined') {
|
|
||||||
this.logger.log(`Process '${handler.name}' already registered.`);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger.log(`Registering process '${handler.name}'.`);
|
|
||||||
this.initProcesses[handler.name] = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CoreInit extends makeSingleton(CoreInitDelegate) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deferred promise for init readiness.
|
|
||||||
*/
|
|
||||||
type CoreInitReadinessPromiseDefer<T> = PromiseDefer<T> & {
|
|
||||||
resolved?: boolean; // If true, readiness have been resolved.
|
|
||||||
};
|
|
|
@ -15,10 +15,9 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreConfig } from '@services/config';
|
import { CoreConfig } from '@services/config';
|
||||||
import { CoreInitHandler, CoreInitDelegate } from '@services/init';
|
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { makeSingleton } from '@singletons';
|
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
|
import { makeSingleton } from '@singletons';
|
||||||
|
|
||||||
const VERSION_APPLIED = 'version_applied';
|
const VERSION_APPLIED = 'version_applied';
|
||||||
|
|
||||||
|
@ -28,12 +27,7 @@ const VERSION_APPLIED = 'version_applied';
|
||||||
* This service handles processes that need to be run when updating the app, like migrate Ionic 1 database data to Ionic 3.
|
* This service handles processes that need to be run when updating the app, like migrate Ionic 1 database data to Ionic 3.
|
||||||
*/
|
*/
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class CoreUpdateManagerProvider implements CoreInitHandler {
|
export class CoreUpdateManagerProvider {
|
||||||
|
|
||||||
// Data for init delegate.
|
|
||||||
name = 'CoreUpdateManager';
|
|
||||||
priority = CoreInitDelegate.MAX_RECOMMENDED_PRIORITY + 300;
|
|
||||||
blocking = true;
|
|
||||||
|
|
||||||
protected logger: CoreLogger;
|
protected logger: CoreLogger;
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,7 @@ import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
||||||
import { CoreTextUtils } from '@services/utils/text';
|
import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreWSError } from '@classes/errors/wserror';
|
import { CoreWSError } from '@classes/errors/wserror';
|
||||||
import {
|
import { makeSingleton, Clipboard, InAppBrowser, FileOpener, WebIntent, QRScanner, Translate } from '@singletons';
|
||||||
makeSingleton, Clipboard, InAppBrowser, Platform, FileOpener, WebIntent, QRScanner, Translate,
|
|
||||||
} from '@singletons';
|
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
|
|
||||||
type TreeNode<T> = T & { children: TreeNode<T>[] };
|
type TreeNode<T> = T & { children: TreeNode<T>[] };
|
||||||
|
@ -48,9 +46,6 @@ export class CoreUtilsProvider {
|
||||||
|
|
||||||
constructor(protected zone: NgZone) {
|
constructor(protected zone: NgZone) {
|
||||||
this.logger = CoreLogger.getInstance('CoreUtilsProvider');
|
this.logger = CoreLogger.getInstance('CoreUtilsProvider');
|
||||||
|
|
||||||
// eslint-disable-next-line promise/catch-or-return
|
|
||||||
Platform.instance.ready().then(() => this.overrideWindowOpen());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1606,17 +1601,6 @@ export class CoreUtilsProvider {
|
||||||
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Override native window.open with InAppBrowser if available.
|
|
||||||
*/
|
|
||||||
private overrideWindowOpen() {
|
|
||||||
if (!window.cordova?.InAppBrowser) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.open = window.cordova.InAppBrowser.open;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CoreUtils extends makeSingleton(CoreUtilsProvider) {}
|
export class CoreUtils extends makeSingleton(CoreUtilsProvider) {}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Injector, NgZone as NgZoneService } from '@angular/core';
|
import { ApplicationRef, ApplicationInitStatus, Injector, NgZone as NgZoneService } from '@angular/core';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
@ -111,6 +111,8 @@ export class LoadingController extends makeSingleton(LoadingControllerService) {
|
||||||
export class ModalController extends makeSingleton(ModalControllerService) {}
|
export class ModalController extends makeSingleton(ModalControllerService) {}
|
||||||
export class ToastController extends makeSingleton(ToastControllerService) {}
|
export class ToastController extends makeSingleton(ToastControllerService) {}
|
||||||
export class GestureController extends makeSingleton(GestureControllerService) {}
|
export class GestureController extends makeSingleton(GestureControllerService) {}
|
||||||
|
export class ApplicationInit extends makeSingleton(ApplicationInitStatus) {}
|
||||||
|
export class Application extends makeSingleton(ApplicationRef) {}
|
||||||
|
|
||||||
// Convert external libraries injectables.
|
// Convert external libraries injectables.
|
||||||
export class Translate extends makeSingleton(TranslateService) {}
|
export class Translate extends makeSingleton(TranslateService) {}
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
"cordova-plugin-inappbrowser",
|
"cordova-plugin-inappbrowser",
|
||||||
"cordova",
|
"cordova",
|
||||||
"dom-mediacapture-record",
|
"dom-mediacapture-record",
|
||||||
"node"
|
"node",
|
||||||
|
"webpack-env"
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@classes/*": ["core/classes/*"],
|
"@classes/*": ["core/classes/*"],
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
"dom-mediacapture-record",
|
"dom-mediacapture-record",
|
||||||
"faker",
|
"faker",
|
||||||
"jest",
|
"jest",
|
||||||
"node"
|
"node",
|
||||||
|
"webpack-env"
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@classes/*": ["core/classes/*"],
|
"@classes/*": ["core/classes/*"],
|
||||||
|
|
Loading…
Reference in New Issue