MOBILE-4653 utils: Move IAB related utils functions

main
Pau Ferrer Ocaña 2024-11-15 12:42:15 +01:00
parent bc35290e15
commit fe0d6a0979
13 changed files with 229 additions and 149 deletions

View File

@ -28,6 +28,7 @@ import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton, Translate } from '@singletons';
import { ADDON_MOD_LTI_COMPONENT } from '../constants';
import { CoreCacheUpdateFrequency } from '@/core/constants';
import { CoreInAppBrowser } from '@singletons/iab';
/**
* Service that provides some features for LTI.
@ -253,7 +254,7 @@ export class AddonModLtiProvider {
const launcherUrl = await this.generateLauncher(url, params);
if (CorePlatform.isMobile()) {
CoreUtils.openInApp(launcherUrl);
CoreInAppBrowser.open(launcherUrl);
} else {
// In desktop open in browser, we found some cases where inapp caused JS issues.
CoreUtils.openInBrowser(launcherUrl);

View File

@ -24,6 +24,7 @@ import { AddonNotifications } from '../notifications';
import { AddonNotificationsMainMenuHandlerService } from './mainmenu';
import { AddonNotificationsHelper } from '../notifications-helper';
import { CoreViewer } from '@features/viewer/services/viewer';
import { CoreInAppBrowser } from '@singletons/iab';
/**
* Handler for non-messaging push notifications clicks.
@ -89,7 +90,7 @@ export class AddonNotificationsPushClickHandlerService implements CorePushNotifi
switch (notification.customdata.appurlopenin) {
case 'inapp':
CoreUtils.openInApp(url);
CoreInAppBrowser.open(url);
return;

View File

@ -22,7 +22,7 @@ import { CoreApp } from '@services/app';
import { CoreNavigator } from '@services/navigator';
import { CoreSubscriptions } from '@singletons/subscriptions';
import { CoreWindow } from '@singletons/window';
import { CoreUtils } from '@services/utils/utils';
import { CoreInAppBrowser } from '@singletons/iab';
import { CorePlatform } from '@services/platform';
import { CoreLogger } from '@singletons/logger';
import { CorePromisedValue } from '@classes/promised-value';
@ -51,7 +51,7 @@ export class AppComponent implements OnInit, AfterViewInit {
CorePlatform.resume.subscribe(() => {
// Wait a second before setting it to false since in iOS there could be some frozen WS calls.
setTimeout(() => {
if (CoreLoginHelper.isWaitingForBrowser() && !CoreUtils.isInAppBrowserOpen()) {
if (CoreLoginHelper.isWaitingForBrowser() && !CoreInAppBrowser.isInAppBrowserOpen()) {
CoreLoginHelper.stopWaitingForBrowser();
CoreLoginHelper.checkLogout();
}

View File

@ -55,6 +55,7 @@ import { CoreAuthenticatedSite, CoreAuthenticatedSiteOptionalData, CoreSiteWSPre
import { firstValueFrom } from 'rxjs';
import { CorePlatform } from '@services/platform';
import { CoreLoadings } from '@services/loadings';
import { CoreInAppBrowser } from '@singletons/iab';
/**
* Class that represents a site (combination of site + user).
@ -535,7 +536,7 @@ export class CoreSite extends CoreAuthenticatedSite {
options.clearsessioncache = 'yes';
}
return CoreUtils.openInApp(autoLoginUrl, options);
return CoreInAppBrowser.open(autoLoginUrl, options);
} else {
return CoreUtils.openInBrowser(autoLoginUrl, options);
}

View File

@ -17,7 +17,7 @@ import { Component, Input, OnInit } from '@angular/core';
import { CoreLang, CoreLangFormat } from '@services/lang';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CoreInAppBrowser } from '@singletons/iab';
import { CorePath } from '@singletons/path';
/**
@ -66,7 +66,7 @@ export class CoreRecaptchaComponent implements OnInit {
// The app cannot render the recaptcha directly because it has problems with the local protocols and domains.
const src = CorePath.concatenatePaths(this.siteUrl, 'webservice/recaptcha.php?lang=' + this.lang);
const inAppBrowserWindow = CoreUtils.openInApp(src);
const inAppBrowserWindow = CoreInAppBrowser.open(src);
if (!inAppBrowserWindow) {
return;
}

View File

@ -28,6 +28,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreDom } from '@singletons/dom';
import { toBoolean } from '../transforms/boolean';
import { CoreLoadings } from '@services/loadings';
import { CoreInAppBrowser } from '@singletons/iab';
/**
* Directive to open a link in external browser or in the app.
@ -186,7 +187,7 @@ export class CoreLinkDirective implements OnInit {
if (!CoreSites.isLoggedIn()) {
// Not logged in, cannot auto-login.
if (openInApp) {
CoreUtils.openInApp(href);
CoreInAppBrowser.open(href);
} else {
CoreUtils.openInBrowser(href, { showBrowserWarning: this.showBrowserWarning });
}
@ -227,7 +228,7 @@ export class CoreLinkDirective implements OnInit {
}
} else {
if (openInApp) {
CoreUtils.openInApp(href);
CoreInAppBrowser.open(href);
} else {
CoreUtils.openInBrowser(href, { showBrowserWarning: this.showBrowserWarning });
}

View File

@ -19,7 +19,7 @@ import { CoreLoginHelper } from '@features/login/services/login-helper';
import { Translate } from '@singletons';
import { CoreNavigator } from '@services/navigator';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreUtils } from '@services/utils/utils';
import { CoreInAppBrowser } from '@singletons/iab';
import { CoreUserSupport } from '@features/user/services/support';
/**
@ -94,7 +94,7 @@ export class CoreLoginChangePasswordPage implements OnDestroy {
this.urlLoadedObserver = CoreEvents.on(CoreEvents.IAB_LOAD_STOP, (event) => {
if (event.url.match(/\/login\/change_password\.php.*return=1/)) {
// Password has changed, close the IAB now.
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
this.login();
return;
@ -105,7 +105,7 @@ export class CoreLoginChangePasswordPage implements OnDestroy {
}
// Use a script to check if the user changed the password, in some platforms we cannot tell using the URL.
CoreUtils.getInAppBrowserInstance()?.executeScript({
CoreInAppBrowser.getInAppBrowserInstance()?.executeScript({
code: `
if (
document.querySelector('input[type="password"]') === null &&
@ -119,7 +119,7 @@ export class CoreLoginChangePasswordPage implements OnDestroy {
this.messageObserver = CoreEvents.on(CoreEvents.IAB_MESSAGE, (data) => {
if (data.passwordChanged) {
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
this.login();
}
});

View File

@ -62,6 +62,7 @@ import { CoreQRScan } from '@services/qrscan';
import { CoreLoadings } from '@services/loadings';
import { CoreErrorHelper } from '@services/error-helper';
import { CoreSSO } from '@singletons/sso';
import { CoreInAppBrowser } from '@singletons/iab';
/**
* Helper provider that provides some common features regarding authentication.
@ -172,7 +173,7 @@ export class CoreLoginHelperProvider {
async forgottenPasswordClicked(siteUrl: string, username: string, siteConfig?: CoreSitePublicConfigResponse): Promise<void> {
if (siteConfig && siteConfig.forgottenpasswordurl) {
// URL set, open it.
CoreUtils.openInApp(siteConfig.forgottenpasswordurl);
CoreInAppBrowser.open(siteConfig.forgottenpasswordurl);
return;
}
@ -663,7 +664,7 @@ export class CoreLoginHelperProvider {
this.logger.debug('openBrowserForSSOLogin loginUrl:', loginUrl);
if (this.isSSOEmbeddedBrowser(typeOfLogin)) {
CoreUtils.openInApp(loginUrl, {
CoreInAppBrowser.open(loginUrl, {
clearsessioncache: 'yes', // Clear the session cache to allow for multiple logins.
closebuttoncaption: Translate.instant('core.login.cancel'),
});
@ -690,7 +691,7 @@ export class CoreLoginHelperProvider {
await alert.onDidDismiss();
CoreUtils.openInApp(siteUrl + '/login/change_password.php');
CoreInAppBrowser.open(siteUrl + '/login/change_password.php');
}
/**
@ -699,7 +700,7 @@ export class CoreLoginHelperProvider {
* @param siteUrl URL of the site.
*/
openForgottenPassword(siteUrl: string): void {
CoreUtils.openInApp(siteUrl + '/login/forgot_password.php');
CoreInAppBrowser.open(siteUrl + '/login/forgot_password.php');
}
/**

View File

@ -19,7 +19,7 @@ import { CoreLoginHelper } from '@features/login/services/login-helper';
import { Translate } from '@singletons';
import { CoreNavigator } from '@services/navigator';
import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreUtils } from '@services/utils/utils';
import { CoreInAppBrowser } from '@singletons/iab';
import { CoreUserSupport } from '@features/user/services/support';
/**
@ -93,7 +93,7 @@ export class CoreUserCompleteProfilePage implements OnDestroy {
this.urlLoadedObserver = CoreEvents.on(CoreEvents.IAB_LOAD_START, (event) => {
if (event.url.match(/\/user\/preferences.php/)) {
// Profile should be complete now.
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
this.login();
}
});

View File

@ -18,7 +18,7 @@ import { CoreUserAuthenticatedSupportConfig } from '@features/user/classes/suppo
import { InAppBrowserObject } from '@awesome-cordova-plugins/in-app-browser';
import { CorePlatform } from '@services/platform';
import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils';
import { CoreInAppBrowser } from '@singletons/iab';
import { makeSingleton, Translate } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { CoreSubscriptions } from '@singletons/subscriptions';
@ -42,7 +42,7 @@ export class CoreUserSupportService {
const supportConfig = options.supportConfig ?? CoreUserAuthenticatedSupportConfig.forCurrentSite();
const supportPageUrl = supportConfig.getSupportPageUrl();
const autoLoginUrl = await CoreSites.getCurrentSite()?.getAutoLoginUrl(supportPageUrl, false);
const browser = CoreUtils.openInApp(autoLoginUrl ?? supportPageUrl);
const browser = CoreInAppBrowser.open(autoLoginUrl ?? supportPageUrl);
if (supportPageUrl.endsWith('/user/contactsitesupport.php')) {
this.populateSupportForm(browser, options.subject, options.message);

View File

@ -23,6 +23,7 @@ import { CoreUrl } from '@singletons/url';
import { CoreUtils } from '@services/utils/utils';
import { Translate } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { CoreInAppBrowser } from '@singletons/iab';
let lastInAppUrl: string | null = null;
@ -43,14 +44,14 @@ export default function(): void {
CoreCustomURLSchemes.handleCustomURL(url).catch((error) => {
CoreCustomURLSchemes.treatHandleCustomURLError(error);
});
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
return;
}
if (isExternalApp && url.includes('://token=')) {
// It's an SSO token for another app. Close the IAB and show an error.
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
CoreDomUtils.showErrorModal(new CoreSiteError({
supportConfig: CoreSites.getCurrentSite()
? CoreUserAuthenticatedSupportConfig.forCurrentSite()
@ -73,10 +74,10 @@ export default function(): void {
// At this point, URL schemes will stop working in IAB, and in Android the IAB is showing a "Webpage not available" error.
// Re-loading the page inside the existing IAB doesn't fix it, we need to re-load the whole IAB.
if (lastInAppUrl) {
CoreUtils.openInApp(lastInAppUrl);
CoreInAppBrowser.open(lastInAppUrl);
} else {
// No last URL loaded, close the InAppBrowser.
CoreUtils.closeInAppBrowser();
CoreInAppBrowser.closeInAppBrowser();
}
});

View File

@ -13,19 +13,17 @@
// limitations under the License.
import { Injectable } from '@angular/core';
import { InAppBrowserObject, InAppBrowserOptions } from '@awesome-cordova-plugins/in-app-browser';
import { InAppBrowserObject } from '@awesome-cordova-plugins/in-app-browser';
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { CoreEvents } from '@singletons/events';
import { CoreFile } from '@services/file';
import { CoreLang, CoreLangFormat } from '@services/lang';
import { CoreWS } from '@services/ws';
import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { makeSingleton, InAppBrowser, FileOpener, WebIntent, Translate, NgZone } from '@singletons';
import { makeSingleton, FileOpener, WebIntent, Translate } from '@singletons';
import { CoreLogger } from '@singletons/logger';
import { CoreFileEntry } from '@services/file-helper';
import { CoreConstants } from '@/core/constants';
import { CoreWindow } from '@singletons/window';
import { CoreColors } from '@singletons/colors';
import { CorePlatform } from '@services/platform';
import { CoreErrorWithOptions } from '@classes/errors/errorwithoptions';
import { CoreFilepool } from '@services/filepool';
@ -38,6 +36,7 @@ import { CoreText } from '@singletons/text';
import { CoreWait, CoreWaitOptions } from '@singletons/wait';
import { CoreQRScan } from '@services/qrscan';
import { CoreErrorHelper } from '@services/error-helper';
import { CoreInAppBrowser, CoreInAppBrowserOpenOptions } from '@singletons/iab';
export type TreeNode<T> = T & { children: TreeNode<T>[] };
@ -50,7 +49,6 @@ export class CoreUtilsProvider {
protected readonly DONT_CLONE = ['[object FileEntry]', '[object DirectoryEntry]', '[object DOMFileSystem]'];
protected logger: CoreLogger;
protected iabInstance?: InAppBrowserObject;
protected uniqueIds: {[name: string]: number} = {};
constructor() {
@ -269,29 +267,31 @@ export class CoreUtilsProvider {
/**
* Close the InAppBrowser window.
*
* @deprecated since 5.0. Use CoreInAppBrowser.closeInAppBrowser instead.
*/
closeInAppBrowser(): void {
if (this.iabInstance) {
this.iabInstance.close();
}
CoreInAppBrowser.closeInAppBrowser();
}
/**
* Get inapp browser instance (if any).
*
* @returns IAB instance, undefined if not open.
* @deprecated since 5.0. Use CoreInAppBrowser.getInAppBrowserInstance instead.
*/
getInAppBrowserInstance(): InAppBrowserObject | undefined {
return this.iabInstance;
return CoreInAppBrowser.getInAppBrowserInstance();
}
/**
* Check if inapp browser is open.
*
* @returns Whether it's open.
* @deprecated since 5.0. Use CoreInAppBrowser.isInAppBrowserOpen instead.
*/
isInAppBrowserOpen(): boolean {
return !!this.iabInstance;
return CoreInAppBrowser.isInAppBrowserOpen();
}
/**
@ -968,7 +968,7 @@ export class CoreUtilsProvider {
if (mimetype == 'text/html' && CorePlatform.isAndroid()) {
// Open HTML local files in InAppBrowser, in system browser some embedded files aren't loaded.
this.openInApp(path);
CoreInAppBrowser.open(path);
return;
} else if (extension === 'apk' && CorePlatform.isAndroid()) {
@ -1042,117 +1042,16 @@ export class CoreUtilsProvider {
/**
* Open a URL using InAppBrowser.
* Do not use for files, refer to {@link CoreUtilsProvider.openFile}.
* Do not use for files, refer to {@link CoreUtils.openFile}.
*
* @param url The URL to open.
* @param options Override default options passed to InAppBrowser.
* @returns The opened window.
*/
openInApp(url: string, options?: CoreUtilsOpenInAppOptions): InAppBrowserObject {
options = options || {};
options.usewkwebview = 'yes'; // Force WKWebView in iOS.
options.enableViewPortScale = options.enableViewPortScale ?? 'yes'; // Enable zoom on iOS by default.
options.allowInlineMediaPlayback = options.allowInlineMediaPlayback ?? 'yes'; // Allow playing inline videos in iOS.
if (!options.location && CorePlatform.isIOS() && url.indexOf('file://') === 0) {
// The URL uses file protocol, don't show it on iOS.
// In Android we keep it because otherwise we lose the whole toolbar.
options.location = 'no';
}
this.setInAppBrowserToolbarColors(options);
this.iabInstance = InAppBrowser.create(url, '_blank', options);
if (CorePlatform.isMobile()) {
const loadStartUrls: string[] = [];
const loadStartSubscription = this.iabInstance.on('loadstart').subscribe((event) => {
NgZone.run(() => {
// Store the last loaded URLs (max 10).
loadStartUrls.push(event.url);
if (loadStartUrls.length > 10) {
loadStartUrls.shift();
}
CoreEvents.trigger(CoreEvents.IAB_LOAD_START, event);
});
});
const loadStopSubscription = this.iabInstance.on('loadstop').subscribe((event) => {
NgZone.run(() => {
CoreEvents.trigger(CoreEvents.IAB_LOAD_STOP, event);
});
});
const messageSubscription = this.iabInstance.on('message').subscribe((event) => {
NgZone.run(() => {
CoreEvents.trigger(CoreEvents.IAB_MESSAGE, event.data);
});
});
const exitSubscription = this.iabInstance.on('exit').subscribe((event) => {
NgZone.run(() => {
loadStartSubscription.unsubscribe();
loadStopSubscription.unsubscribe();
messageSubscription.unsubscribe();
exitSubscription.unsubscribe();
this.iabInstance = undefined;
CoreEvents.trigger(CoreEvents.IAB_EXIT, event);
});
});
}
CoreAnalytics.logEvent({
type: CoreAnalyticsEventType.OPEN_LINK,
link: CoreUrl.unfixPluginfileURL(options.originalUrl ?? url),
});
return this.iabInstance;
}
/**
* Given some IAB options, set the toolbar colors properties to the right values.
*
* @param options Options to change.
* @returns Changed options.
* @deprecated since 5.0. Use CoreInAppBrowser.openInApp instead.
*/
protected setInAppBrowserToolbarColors(options: InAppBrowserOptions): InAppBrowserOptions {
if (options.toolbarcolor) {
// Color already set.
return options;
}
// Color not set. Check if it needs to be changed automatically.
let bgColor: string | undefined;
let textColor: string | undefined;
if (CoreConstants.CONFIG.iabToolbarColors === 'auto') {
bgColor = CoreColors.getToolbarBackgroundColor();
} else if (CoreConstants.CONFIG.iabToolbarColors && typeof CoreConstants.CONFIG.iabToolbarColors === 'object') {
bgColor = CoreConstants.CONFIG.iabToolbarColors.background;
textColor = CoreConstants.CONFIG.iabToolbarColors.text;
}
if (!bgColor) {
// Use default color. In iOS, use black background color since the default is transparent and doesn't look good.
options.locationcolor = '#000000';
return options;
}
if (!textColor) {
textColor = CoreColors.isWhiteContrastingBetter(bgColor) ? '#ffffff' : '#000000';
}
options.toolbarcolor = bgColor;
options.closebuttoncolor = textColor;
options.navigationbuttoncolor = textColor;
options.locationcolor = bgColor;
options.locationtextcolor = textColor;
return options;
openInApp(url: string, options?: CoreInAppBrowserOpenOptions): InAppBrowserObject {
return CoreInAppBrowser.open(url, options);
}
/**
@ -1224,7 +1123,7 @@ export class CoreUtilsProvider {
}
// In the rest of platforms we need to open them in InAppBrowser.
this.openInApp(url);
CoreInAppBrowser.open(url);
}
/**
@ -1810,13 +1709,6 @@ export type CoreUtilsOpenInBrowserOptions = {
browserWarningUrl?: string;
};
/**
* Options for opening in InAppBrowser.
*/
export type CoreUtilsOpenInAppOptions = InAppBrowserOptions & {
originalUrl?: string; // Original URL to open (in case the URL was treated, e.g. to add a token or an auto-login).
};
/**
* Options for waiting.
*

View File

@ -0,0 +1,182 @@
// (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 { InAppBrowserObject, InAppBrowserOptions } from '@awesome-cordova-plugins/in-app-browser';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import { CorePlatform } from '@services/platform';
import { InAppBrowser, NgZone } from '@singletons';
import { CoreEvents } from '@singletons/events';
import { CoreUrl } from './url';
import { CoreConstants } from '../constants';
import { CoreColors } from './colors';
/**
* Singleton with helper functions for InAppBrowser.
*/
export class CoreInAppBrowser {
private static iabInstance?: InAppBrowserObject;
/**
* Close the InAppBrowser window.
*/
static closeInAppBrowser(): void {
if (!CoreInAppBrowser.iabInstance) {
return;
}
CoreInAppBrowser.iabInstance.close();
}
/**
* Get inapp browser instance (if any).
*
* @returns IAB instance, undefined if not open.
*/
static getInAppBrowserInstance(): InAppBrowserObject | undefined {
return CoreInAppBrowser.iabInstance;
}
/**
* Check if inapp browser is open.
*
* @returns Whether it's open.
*/
static isInAppBrowserOpen(): boolean {
return !!CoreInAppBrowser.iabInstance;
}
/**
* Open a URL using InAppBrowser.
* Do not use for files, refer to {@link CoreUtilsProvider.openFile}.
*
* @param url The URL to open.
* @param options Override default options passed to InAppBrowser.
* @returns The opened window.
*/
static open(url: string, options?: CoreInAppBrowserOpenOptions): InAppBrowserObject {
options = options || {};
options.usewkwebview = 'yes'; // Force WKWebView in iOS.
options.enableViewPortScale = options.enableViewPortScale ?? 'yes'; // Enable zoom on iOS by default.
options.allowInlineMediaPlayback = options.allowInlineMediaPlayback ?? 'yes'; // Allow playing inline videos in iOS.
if (!options.location && CorePlatform.isIOS() && url.indexOf('file://') === 0) {
// The URL uses file protocol, don't show it on iOS.
// In Android we keep it because otherwise we lose the whole toolbar.
options.location = 'no';
}
CoreInAppBrowser.setInAppBrowserToolbarColors(options);
CoreInAppBrowser.iabInstance = InAppBrowser.create(url, '_blank', options);
if (CorePlatform.isMobile()) {
const loadStartUrls: string[] = [];
const loadStartSubscription = CoreInAppBrowser.iabInstance.on('loadstart').subscribe((event) => {
NgZone.run(() => {
// Store the last loaded URLs (max 10).
loadStartUrls.push(event.url);
if (loadStartUrls.length > 10) {
loadStartUrls.shift();
}
CoreEvents.trigger(CoreEvents.IAB_LOAD_START, event);
});
});
const loadStopSubscription = CoreInAppBrowser.iabInstance.on('loadstop').subscribe((event) => {
NgZone.run(() => {
CoreEvents.trigger(CoreEvents.IAB_LOAD_STOP, event);
});
});
const messageSubscription = CoreInAppBrowser.iabInstance.on('message').subscribe((event) => {
NgZone.run(() => {
CoreEvents.trigger(CoreEvents.IAB_MESSAGE, event.data);
});
});
const exitSubscription = CoreInAppBrowser.iabInstance.on('exit').subscribe((event) => {
NgZone.run(() => {
loadStartSubscription.unsubscribe();
loadStopSubscription.unsubscribe();
messageSubscription.unsubscribe();
exitSubscription.unsubscribe();
CoreInAppBrowser.iabInstance = undefined;
CoreEvents.trigger(CoreEvents.IAB_EXIT, event);
});
});
}
CoreAnalytics.logEvent({
type: CoreAnalyticsEventType.OPEN_LINK,
link: CoreUrl.unfixPluginfileURL(options.originalUrl ?? url),
});
return CoreInAppBrowser.iabInstance;
}
/**
* Given some IAB options, set the toolbar colors properties to the right values.
*
* @param options Options to change.
* @returns Changed options.
*/
protected static setInAppBrowserToolbarColors(options: InAppBrowserOptions): InAppBrowserOptions {
if (options.toolbarcolor) {
// Color already set.
return options;
}
// Color not set. Check if it needs to be changed automatically.
let bgColor: string | undefined;
let textColor: string | undefined;
if (CoreConstants.CONFIG.iabToolbarColors === 'auto') {
bgColor = CoreColors.getToolbarBackgroundColor();
} else if (CoreConstants.CONFIG.iabToolbarColors && typeof CoreConstants.CONFIG.iabToolbarColors === 'object') {
bgColor = CoreConstants.CONFIG.iabToolbarColors.background;
textColor = CoreConstants.CONFIG.iabToolbarColors.text;
}
if (!bgColor) {
// Use default color. In iOS, use black background color since the default is transparent and doesn't look good.
options.locationcolor = '#000000';
return options;
}
if (!textColor) {
textColor = CoreColors.isWhiteContrastingBetter(bgColor) ? '#ffffff' : '#000000';
}
options.toolbarcolor = bgColor;
options.closebuttoncolor = textColor;
options.navigationbuttoncolor = textColor;
options.locationcolor = bgColor;
options.locationtextcolor = textColor;
return options;
}
}
/**
* Options for opening in InAppBrowser.
*/
export type CoreInAppBrowserOpenOptions = InAppBrowserOptions & {
originalUrl?: string; // Original URL to open (in case the URL was treated, e.g. to add a token or an auto-login).
};