MOBILE-4059 core: Extract inappbrowser initializer

main
Noel De Martin 2022-10-05 11:27:15 +02:00
parent 1005aad1c1
commit 4ca9a4ad7b
2 changed files with 91 additions and 59 deletions

View File

@ -19,16 +19,14 @@ import { BackButtonEvent, ScrollDetail } from '@ionic/core';
import { CoreLang } from '@services/lang';
import { CoreLoginHelper } from '@features/login/services/login-helper';
import { CoreEvents } from '@singletons/events';
import { NgZone, SplashScreen, Translate } from '@singletons';
import { NgZone, SplashScreen } from '@singletons';
import { CoreNetwork } from '@services/network';
import { CoreApp } from '@services/app';
import { CoreSites } from '@services/sites';
import { CoreNavigator } from '@services/navigator';
import { CoreSubscriptions } from '@singletons/subscriptions';
import { CoreWindow } from '@singletons/window';
import { CoreCustomURLSchemes } from '@services/urlschemes';
import { CoreUtils } from '@services/utils/utils';
import { CoreUrlUtils } from '@services/utils/url';
import { CoreConstants } from '@/core/constants';
import { CoreSitePlugins } from '@features/siteplugins/services/siteplugins';
import { CoreDomUtils } from '@services/utils/dom';
@ -46,8 +44,6 @@ export class AppComponent implements OnInit, AfterViewInit {
@ViewChild(IonRouterOutlet) outlet?: IonRouterOutlet;
protected lastInAppUrl?: string;
/**
* Component being initialized.
*/
@ -91,60 +87,6 @@ export class AppComponent implements OnInit, AfterViewInit {
content.classList.toggle('core-footer-shadow', !CoreDom.scrollIsBottom(scrollElement));
});
// Check URLs loaded in any InAppBrowser.
CoreEvents.on(CoreEvents.IAB_LOAD_START, (event) => {
// URLs with a custom scheme can be prefixed with "http://" or "https://", we need to remove this.
const protocol = CoreUrlUtils.getUrlProtocol(event.url);
const url = event.url.replace(/^https?:\/\//, '');
const urlScheme = CoreUrlUtils.getUrlProtocol(url);
const isExternalApp = urlScheme && urlScheme !== 'file' && urlScheme !== 'cdvfile';
if (CoreCustomURLSchemes.isCustomURL(url)) {
// Close the browser if it's a valid SSO URL.
CoreCustomURLSchemes.handleCustomURL(url).catch((error) => {
CoreCustomURLSchemes.treatHandleCustomURLError(error);
});
CoreUtils.closeInAppBrowser();
} else if (isExternalApp && url.includes('://token=')) {
// It's an SSO token for another app. Close the IAB and show an error.
CoreUtils.closeInAppBrowser();
CoreDomUtils.showErrorModal(Translate.instant('core.login.contactyouradministratorissue', {
$a: '<br><br>' + Translate.instant('core.errorurlschemeinvalidscheme', {
$a: urlScheme,
}),
}));
} else if (CoreApp.isAndroid()) {
// Check if the URL has a custom URL scheme. In Android they need to be opened manually.
if (isExternalApp) {
// Open in browser should launch the right app if found and do nothing if not found.
CoreUtils.openInBrowser(url, { showBrowserWarning: false });
// At this point the InAppBrowser is showing a "Webpage not available" error message.
// Try to navigate to last loaded URL so this error message isn't found.
if (this.lastInAppUrl) {
CoreUtils.openInApp(this.lastInAppUrl);
} else {
// No last URL loaded, close the InAppBrowser.
CoreUtils.closeInAppBrowser();
}
} else {
this.lastInAppUrl = protocol ? `${protocol}://${url}` : url;
}
}
});
// Check InAppBrowser closed.
CoreEvents.on(CoreEvents.IAB_EXIT, () => {
this.lastInAppUrl = '';
if (CoreLoginHelper.isWaitingForBrowser()) {
CoreLoginHelper.stopWaitingForBrowser();
CoreLoginHelper.checkLogout();
}
});
CorePlatform.resume.subscribe(() => {
// Wait a second before setting it to false since in iOS there could be some frozen WS calls.
setTimeout(() => {

View File

@ -0,0 +1,90 @@
// (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 { CoreLoginHelper } from '@features/login/services/login-helper';
import { CoreApp } from '@services/app';
import { CoreCustomURLSchemes } from '@services/urlschemes';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUrlUtils } from '@services/utils/url';
import { CoreUtils } from '@services/utils/utils';
import { Translate } from '@singletons';
import { CoreEvents } from '@singletons/events';
let lastInAppUrl: string | null = null;
export default function(): void {
// Check URLs loaded in any InAppBrowser.
CoreEvents.on(CoreEvents.IAB_LOAD_START, async (event) => {
// URLs with a custom scheme can be prefixed with "http://" or "https://", we need to remove this.
const protocol = CoreUrlUtils.getUrlProtocol(event.url);
const url = event.url.replace(/^https?:\/\//, '');
const urlScheme = CoreUrlUtils.getUrlProtocol(url);
const isExternalApp = urlScheme && urlScheme !== 'file' && urlScheme !== 'cdvfile';
if (CoreCustomURLSchemes.isCustomURL(url)) {
// Close the browser if it's a valid SSO URL.
CoreCustomURLSchemes.handleCustomURL(url).catch((error) => {
CoreCustomURLSchemes.treatHandleCustomURLError(error);
});
CoreUtils.closeInAppBrowser();
return;
}
if (isExternalApp && url.includes('://token=')) {
// It's an SSO token for another app. Close the IAB and show an error.
CoreUtils.closeInAppBrowser();
CoreDomUtils.showErrorModal(Translate.instant('core.login.contactyouradministratorissue', {
$a: '<br><br>' + Translate.instant('core.errorurlschemeinvalidscheme', {
$a: urlScheme,
}),
}));
return;
}
if (!CoreApp.isAndroid()) {
return;
}
// Check if the URL has a custom URL scheme. In Android they need to be opened manually.
if (!isExternalApp) {
lastInAppUrl = protocol ? `${protocol}://${url}` : url;
return;
}
// Open in browser should launch the right app if found and do nothing if not found.
CoreUtils.openInBrowser(url, { showBrowserWarning: false });
// At this point the InAppBrowser is showing a "Webpage not available" error message.
// Try to navigate to last loaded URL so this error message isn't found.
if (lastInAppUrl) {
CoreUtils.openInApp(lastInAppUrl);
} else {
// No last URL loaded, close the InAppBrowser.
CoreUtils.closeInAppBrowser();
}
});
// Check InAppBrowser closed.
CoreEvents.on(CoreEvents.IAB_EXIT, () => {
lastInAppUrl = null;
if (CoreLoginHelper.isWaitingForBrowser()) {
CoreLoginHelper.stopWaitingForBrowser();
CoreLoginHelper.checkLogout();
}
});
}