MOBILE-4166 core: Move some CoreApp functions to CorePlatform
parent
884827afb6
commit
2258c1183b
|
@ -123,7 +123,7 @@ export class VideoJSOgvJS extends Tech {
|
||||||
this.playerId = options.playerId;
|
this.playerId = options.playerId;
|
||||||
|
|
||||||
this.on('loadedmetadata', () => {
|
this.on('loadedmetadata', () => {
|
||||||
if (CoreApp.isIPhone()) {
|
if (CorePlatform.isIPhone()) {
|
||||||
// iPhoneOS add some inline styles to the canvas, we need to remove it.
|
// iPhoneOS add some inline styles to the canvas, we need to remove it.
|
||||||
const canvas = this.el_.getElementsByTagName('canvas')[0];
|
const canvas = this.el_.getElementsByTagName('canvas')[0];
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ export class VideoJSOgvJS extends Tech {
|
||||||
* @returns True if volume can be controlled.
|
* @returns True if volume can be controlled.
|
||||||
*/
|
*/
|
||||||
static canControlVolume(): boolean {
|
static canControlVolume(): boolean {
|
||||||
if (CoreApp.isIPhone()) {
|
if (CorePlatform.isIPhone()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,7 +393,7 @@ export class VideoJSOgvJS extends Tech {
|
||||||
*/
|
*/
|
||||||
setVolume(percentAsDecimal: number): void {
|
setVolume(percentAsDecimal: number): void {
|
||||||
// eslint-disable-next-line no-prototype-builtins
|
// eslint-disable-next-line no-prototype-builtins
|
||||||
if (!CoreApp.isIPhone() && this.el_.hasOwnProperty('volume')) {
|
if (!CorePlatform.isIPhone() && this.el_.hasOwnProperty('volume')) {
|
||||||
this.el_.volume = percentAsDecimal;
|
this.el_.volume = percentAsDecimal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ import { Component } from '@angular/core';
|
||||||
import { FormBuilder } from '@angular/forms';
|
import { FormBuilder } from '@angular/forms';
|
||||||
import { SafeUrl } from '@angular/platform-browser';
|
import { SafeUrl } from '@angular/platform-browser';
|
||||||
import { CoreAnyError } from '@classes/errors/error';
|
import { CoreAnyError } from '@classes/errors/error';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreGeolocation, CoreGeolocationError, CoreGeolocationErrorReason } from '@services/geolocation';
|
import { CoreGeolocation, CoreGeolocationError, CoreGeolocationErrorReason } from '@services/geolocation';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { DomSanitizer } from '@singletons';
|
import { DomSanitizer } from '@singletons';
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ export class AddonModDataFieldLatlongComponent extends AddonModDataFieldPluginBa
|
||||||
const northFixed = north ? north.toFixed(4) : '0.0000';
|
const northFixed = north ? north.toFixed(4) : '0.0000';
|
||||||
const eastFixed = east ? east.toFixed(4) : '0.0000';
|
const eastFixed = east ? east.toFixed(4) : '0.0000';
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
url = 'http://maps.apple.com/?ll=' + northFixed + ',' + eastFixed + '&near=' + northFixed + ',' + eastFixed;
|
url = 'http://maps.apple.com/?ll=' + northFixed + ',' + eastFixed + '&near=' + northFixed + ',' + eastFixed;
|
||||||
} else {
|
} else {
|
||||||
url = 'geo:' + northFixed + ',' + eastFixed;
|
url = 'geo:' + northFixed + ',' + eastFixed;
|
||||||
|
|
|
@ -19,7 +19,6 @@ import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/
|
||||||
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
|
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
|
||||||
import { CoreCourse } from '@features/course/services/course';
|
import { CoreCourse } from '@features/course/services/course';
|
||||||
import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate';
|
import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { CoreFileHelper } from '@services/file-helper';
|
import { CoreFileHelper } from '@services/file-helper';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
@ -35,6 +34,7 @@ import {
|
||||||
AddonModResourceProvider,
|
AddonModResourceProvider,
|
||||||
} from '../../services/resource';
|
} from '../../services/resource';
|
||||||
import { AddonModResourceHelper } from '../../services/resource-helper';
|
import { AddonModResourceHelper } from '../../services/resource-helper';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component that displays a resource.
|
* Component that displays a resource.
|
||||||
|
@ -79,7 +79,7 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource
|
||||||
async ngOnInit(): Promise<void> {
|
async ngOnInit(): Promise<void> {
|
||||||
super.ngOnInit();
|
super.ngOnInit();
|
||||||
|
|
||||||
this.isIOS = CoreApp.isIOS();
|
this.isIOS = CorePlatform.isIOS();
|
||||||
this.isOnline = CoreNetwork.isOnline();
|
this.isOnline = CoreNetwork.isOnline();
|
||||||
|
|
||||||
// Refresh online status when changes.
|
// Refresh online status when changes.
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, Input, Output, OnInit, OnDestroy, EventEmitter } from '@angular/core';
|
import { Component, Input, Output, OnInit, OnDestroy, EventEmitter } from '@angular/core';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { CoreFilepool } from '@services/filepool';
|
import { CoreFilepool } from '@services/filepool';
|
||||||
import { CoreFileHelper } from '@services/file-helper';
|
import { CoreFileHelper } from '@services/file-helper';
|
||||||
|
@ -27,6 +26,7 @@ import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { CoreWSFile } from '@services/ws';
|
import { CoreWSFile } from '@services/ws';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to handle a remote file. Shows the file name, icon (depending on mimetype) and a button
|
* Component to handle a remote file. Shows the file name, icon (depending on mimetype) and a button
|
||||||
|
@ -87,7 +87,7 @@ export class CoreFileComponent implements OnInit, OnDestroy {
|
||||||
this.fileSize = this.file.filesize;
|
this.fileSize = this.file.filesize;
|
||||||
this.fileName = this.file.filename || '';
|
this.fileName = this.file.filename || '';
|
||||||
|
|
||||||
this.isIOS = CoreApp.isIOS();
|
this.isIOS = CorePlatform.isIOS();
|
||||||
this.defaultIsOpenWithPicker = CoreFileHelper.defaultIsOpenWithPicker();
|
this.defaultIsOpenWithPicker = CoreFileHelper.defaultIsOpenWithPicker();
|
||||||
this.openButtonIcon = this.defaultIsOpenWithPicker ? 'fas-file' : 'fas-share-square';
|
this.openButtonIcon = this.defaultIsOpenWithPicker ? 'fas-file' : 'fas-share-square';
|
||||||
this.openButtonLabel = this.defaultIsOpenWithPicker ? 'core.openfile' : 'core.openwith';
|
this.openButtonLabel = this.defaultIsOpenWithPicker ? 'core.openfile' : 'core.openwith';
|
||||||
|
|
|
@ -21,7 +21,7 @@ import { Translate } from '@singletons';
|
||||||
import { CoreDirectivesRegistry } from '@singletons/directives-registry';
|
import { CoreDirectivesRegistry } from '@singletons/directives-registry';
|
||||||
import { CorePromisedValue } from '@classes/promised-value';
|
import { CorePromisedValue } from '@classes/promised-value';
|
||||||
import { AsyncDirective } from '@classes/async-directive';
|
import { AsyncDirective } from '@classes/async-directive';
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to show a loading spinner and message while data is being loaded.
|
* Component to show a loading spinner and message while data is being loaded.
|
||||||
|
@ -146,7 +146,7 @@ export class CoreLoadingComponent implements OnInit, OnChanges, AfterViewInit, A
|
||||||
if (loaded) {
|
if (loaded) {
|
||||||
this.onReadyPromise.resolve();
|
this.onReadyPromise.resolve();
|
||||||
this.restoreScrollPosition();
|
this.restoreScrollPosition();
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
this.mutationObserver.observe(this.element, { childList: true });
|
this.mutationObserver.observe(this.element, { childList: true });
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -25,8 +25,8 @@ import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreTimeUtils } from '@services/utils/time';
|
import { CoreTimeUtils } from '@services/utils/time';
|
||||||
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
import { CoreUtils, CoreUtilsOpenFileOptions, OpenFileAction } from '@services/utils/utils';
|
||||||
import { CoreForms } from '@singletons/form';
|
import { CoreForms } from '@singletons/form';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CorePath } from '@singletons/path';
|
import { CorePath } from '@singletons/path';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component to handle a local file. Only files inside the app folder can be managed.
|
* Component to handle a local file. Only files inside the app folder can be managed.
|
||||||
|
@ -83,7 +83,7 @@ export class CoreLocalFileComponent implements OnInit {
|
||||||
|
|
||||||
this.timemodified = CoreTimeUtils.userDate(metadata.modificationTime.getTime(), 'core.strftimedatetimeshort');
|
this.timemodified = CoreTimeUtils.userDate(metadata.modificationTime.getTime(), 'core.strftimedatetimeshort');
|
||||||
|
|
||||||
this.isIOS = CoreApp.isIOS();
|
this.isIOS = CorePlatform.isIOS();
|
||||||
this.defaultIsOpenWithPicker = CoreFileHelper.defaultIsOpenWithPicker();
|
this.defaultIsOpenWithPicker = CoreFileHelper.defaultIsOpenWithPicker();
|
||||||
this.openButtonIcon = this.defaultIsOpenWithPicker ? 'fas-file' : 'fas-share-square';
|
this.openButtonIcon = this.defaultIsOpenWithPicker ? 'fas-file' : 'fas-share-square';
|
||||||
this.openButtonLabel = this.defaultIsOpenWithPicker ? 'core.openfile' : 'core.openwith';
|
this.openButtonLabel = this.defaultIsOpenWithPicker ? 'core.openfile' : 'core.openwith';
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
import { Component, OnInit, AfterViewInit, Input, ElementRef, ContentChild } from '@angular/core';
|
import { Component, OnInit, AfterViewInit, Input, ElementRef, ContentChild } from '@angular/core';
|
||||||
import { IonInput } from '@ionic/angular';
|
import { IonInput } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ export class CoreShowPasswordComponent implements OnInit, AfterViewInit {
|
||||||
|
|
||||||
this.setData(this.input);
|
this.setData(this.input);
|
||||||
// In Android, the keyboard is closed when the input type changes. Focus it again.
|
// In Android, the keyboard is closed when the input type changes. Focus it again.
|
||||||
if (isFocused && CoreApp.isAndroid()) {
|
if (isFocused && CorePlatform.isAndroid()) {
|
||||||
CoreDomUtils.focusElement(this.input);
|
CoreDomUtils.focusElement(this.input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import {
|
||||||
EventEmitter,
|
EventEmitter,
|
||||||
OnDestroy,
|
OnDestroy,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreFilepool, CoreFilepoolFileActions, CoreFilepoolFileEventData } from '@services/filepool';
|
import { CoreFilepool, CoreFilepoolFileActions, CoreFilepoolFileEventData } from '@services/filepool';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
@ -39,6 +38,7 @@ import { Translate } from '@singletons';
|
||||||
import { AsyncDirective } from '@classes/async-directive';
|
import { AsyncDirective } from '@classes/async-directive';
|
||||||
import { CoreDirectivesRegistry } from '@singletons/directives-registry';
|
import { CoreDirectivesRegistry } from '@singletons/directives-registry';
|
||||||
import { CorePromisedValue } from '@classes/promised-value';
|
import { CorePromisedValue } from '@classes/promised-value';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directive to handle external content.
|
* Directive to handle external content.
|
||||||
|
@ -117,7 +117,7 @@ export class CoreExternalContentDirective implements AfterViewInit, OnChanges, O
|
||||||
newSource.setAttribute('src', url);
|
newSource.setAttribute('src', url);
|
||||||
|
|
||||||
if (type) {
|
if (type) {
|
||||||
if (CoreApp.isAndroid() && type == 'video/quicktime') {
|
if (CorePlatform.isAndroid() && type == 'video/quicktime') {
|
||||||
// Fix for VideoJS/Chrome bug https://github.com/videojs/video.js/issues/423 .
|
// Fix for VideoJS/Chrome bug https://github.com/videojs/video.js/issues/423 .
|
||||||
newSource.setAttribute('type', 'video/mp4');
|
newSource.setAttribute('type', 'video/mp4');
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -19,7 +19,6 @@ import { ChooserResult } from '@ionic-native/chooser/ngx';
|
||||||
import { FileEntry, IFile } from '@ionic-native/file/ngx';
|
import { FileEntry, IFile } from '@ionic-native/file/ngx';
|
||||||
import { MediaFile } from '@ionic-native/media-capture/ngx';
|
import { MediaFile } from '@ionic-native/media-capture/ngx';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { CoreFile, CoreFileProvider, CoreFileProgressEvent } from '@services/file';
|
import { CoreFile, CoreFileProvider, CoreFileProgressEvent } from '@services/file';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
|
@ -652,7 +651,7 @@ export class CoreFileUploaderHelperProvider {
|
||||||
options.mediaType = Camera.MediaType.PICTURE;
|
options.mediaType = Camera.MediaType.PICTURE;
|
||||||
} else if (!imageSupported && videoSupported) {
|
} else if (!imageSupported && videoSupported) {
|
||||||
options.mediaType = Camera.MediaType.VIDEO;
|
options.mediaType = Camera.MediaType.VIDEO;
|
||||||
} else if (CoreApp.isIOS()) {
|
} else if (CorePlatform.isIOS()) {
|
||||||
// Only get all media in iOS because in Android using this option allows uploading any kind of file.
|
// Only get all media in iOS because in Android using this option allows uploading any kind of file.
|
||||||
options.mediaType = Camera.MediaType.ALLMEDIA;
|
options.mediaType = Camera.MediaType.ALLMEDIA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@ import { FileEntry } from '@ionic-native/file/ngx';
|
||||||
import { MediaFile, CaptureError, CaptureAudioOptions, CaptureVideoOptions } from '@ionic-native/media-capture/ngx';
|
import { MediaFile, CaptureError, CaptureAudioOptions, CaptureVideoOptions } from '@ionic-native/media-capture/ngx';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreFile, CoreFileProvider } from '@services/file';
|
import { CoreFile, CoreFileProvider } from '@services/file';
|
||||||
import { CoreFilepool } from '@services/filepool';
|
import { CoreFilepool } from '@services/filepool';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
@ -33,6 +32,7 @@ import { CoreError } from '@classes/errors/error';
|
||||||
import { CoreSite } from '@classes/site';
|
import { CoreSite } from '@classes/site';
|
||||||
import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
|
import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
|
||||||
import { CorePath } from '@singletons/path';
|
import { CorePath } from '@singletons/path';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File upload options.
|
* File upload options.
|
||||||
|
@ -236,7 +236,7 @@ export class CoreFileUploaderProvider {
|
||||||
getCameraUploadOptions(uri: string, isFromAlbum?: boolean): CoreFileUploaderOptions {
|
getCameraUploadOptions(uri: string, isFromAlbum?: boolean): CoreFileUploaderOptions {
|
||||||
const extension = CoreMimetypeUtils.guessExtensionFromUrl(uri);
|
const extension = CoreMimetypeUtils.guessExtensionFromUrl(uri);
|
||||||
const mimetype = CoreMimetypeUtils.getMimeType(extension);
|
const mimetype = CoreMimetypeUtils.getMimeType(extension);
|
||||||
const isIOS = CoreApp.isIOS();
|
const isIOS = CorePlatform.isIOS();
|
||||||
const options: CoreFileUploaderOptions = {
|
const options: CoreFileUploaderOptions = {
|
||||||
deleteAfterUpload: !isFromAlbum,
|
deleteAfterUpload: !isFromAlbum,
|
||||||
mimeType: mimetype,
|
mimeType: mimetype,
|
||||||
|
@ -259,7 +259,7 @@ export class CoreFileUploaderProvider {
|
||||||
// If the file was picked from the album, delete it only if it was copied to the app's folder.
|
// If the file was picked from the album, delete it only if it was copied to the app's folder.
|
||||||
options.deleteAfterUpload = CoreFile.isFileInAppFolder(uri);
|
options.deleteAfterUpload = CoreFile.isFileInAppFolder(uri);
|
||||||
|
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
// Picking an image from album in Android adds a timestamp at the end of the file. Delete it.
|
// Picking an image from album in Android adds a timestamp at the end of the file. Delete it.
|
||||||
options.fileName = options.fileName.replace(/(\.[^.]*)\?[^.]*$/, '$1');
|
options.fileName = options.fileName.replace(/(\.[^.]*)\?[^.]*$/, '$1');
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,10 +45,10 @@ export class CoreFileUploaderAudioHandlerService implements CoreFileUploaderHand
|
||||||
* @returns Supported mimetypes.
|
* @returns Supported mimetypes.
|
||||||
*/
|
*/
|
||||||
getSupportedMimetypes(mimetypes: string[]): string[] {
|
getSupportedMimetypes(mimetypes: string[]): string[] {
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS it's recorded as WAV.
|
// In iOS it's recorded as WAV.
|
||||||
return CoreUtils.filterByRegexp(mimetypes, /^audio\/wav$/);
|
return CoreUtils.filterByRegexp(mimetypes, /^audio\/wav$/);
|
||||||
} else if (CoreApp.isAndroid()) {
|
} else if (CorePlatform.isAndroid()) {
|
||||||
// In Android we don't know the format the audio will be recorded, so accept any audio mimetype.
|
// In Android we don't know the format the audio will be recorded, so accept any audio mimetype.
|
||||||
return CoreUtils.filterByRegexp(mimetypes, /^audio\//);
|
return CoreUtils.filterByRegexp(mimetypes, /^audio\//);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreFileUploaderHandler, CoreFileUploaderHandlerData, CoreFileUploaderHandlerResult } from '../fileuploader-delegate';
|
import { CoreFileUploaderHandler, CoreFileUploaderHandlerData, CoreFileUploaderHandlerResult } from '../fileuploader-delegate';
|
||||||
import { CoreFileUploaderHelper } from '../fileuploader-helper';
|
import { CoreFileUploaderHelper } from '../fileuploader-helper';
|
||||||
|
@ -94,7 +93,7 @@ export class CoreFileUploaderFileHandlerService implements CoreFileUploaderHandl
|
||||||
const input = document.createElement('input');
|
const input = document.createElement('input');
|
||||||
input.setAttribute('type', 'file');
|
input.setAttribute('type', 'file');
|
||||||
input.classList.add('core-fileuploader-file-handler-input');
|
input.classList.add('core-fileuploader-file-handler-input');
|
||||||
if (mimetypes && mimetypes.length && (!CoreApp.isAndroid() || mimetypes.length == 1)) {
|
if (mimetypes && mimetypes.length && (!CorePlatform.isAndroid() || mimetypes.length == 1)) {
|
||||||
// Don't use accept attribute in Android with several mimetypes, it's not supported.
|
// Don't use accept attribute in Android with several mimetypes, it's not supported.
|
||||||
input.setAttribute('accept', mimetypes.join(', '));
|
input.setAttribute('accept', mimetypes.join(', '));
|
||||||
}
|
}
|
||||||
|
@ -134,7 +133,7 @@ export class CoreFileUploaderFileHandlerService implements CoreFileUploaderHandl
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS, the click on the input stopped working for some reason. We need to put it 1 level higher.
|
// In iOS, the click on the input stopped working for some reason. We need to put it 1 level higher.
|
||||||
element.parentElement?.appendChild(input);
|
element.parentElement?.appendChild(input);
|
||||||
|
|
||||||
|
|
|
@ -45,10 +45,10 @@ export class CoreFileUploaderVideoHandlerService implements CoreFileUploaderHand
|
||||||
* @returns Supported mimetypes.
|
* @returns Supported mimetypes.
|
||||||
*/
|
*/
|
||||||
getSupportedMimetypes(mimetypes: string[]): string[] {
|
getSupportedMimetypes(mimetypes: string[]): string[] {
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS it's recorded as MOV.
|
// In iOS it's recorded as MOV.
|
||||||
return CoreUtils.filterByRegexp(mimetypes, /^video\/quicktime$/);
|
return CoreUtils.filterByRegexp(mimetypes, /^video\/quicktime$/);
|
||||||
} else if (CoreApp.isAndroid()) {
|
} else if (CorePlatform.isAndroid()) {
|
||||||
// In Android we don't know the format the video will be recorded, so accept any video mimetype.
|
// In Android we don't know the format the video will be recorded, so accept any video mimetype.
|
||||||
return CoreUtils.filterByRegexp(mimetypes, /^video\//);
|
return CoreUtils.filterByRegexp(mimetypes, /^video\//);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -32,6 +32,7 @@ import { CoreUserSupport } from '@features/user/services/support';
|
||||||
import { CoreUserSupportConfig } from '@features/user/classes/support/support-config';
|
import { CoreUserSupportConfig } from '@features/user/classes/support/support-config';
|
||||||
import { CoreUserGuestSupportConfig } from '@features/user/classes/support/guest-support-config';
|
import { CoreUserGuestSupportConfig } from '@features/user/classes/support/guest-support-config';
|
||||||
import { SafeHtml } from '@angular/platform-browser';
|
import { SafeHtml } from '@angular/platform-browser';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page to enter the user credentials.
|
* Page to enter the user credentials.
|
||||||
|
@ -108,7 +109,7 @@ export class CoreLoginCredentialsPage implements OnInit, OnDestroy {
|
||||||
this.pageLoaded = true;
|
this.pageLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// Make iOS auto-fill work. The field that isn't focused doesn't get updated, do it manually.
|
// Make iOS auto-fill work. The field that isn't focused doesn't get updated, do it manually.
|
||||||
// Debounce it to prevent triggering this function too often when the user is typing.
|
// Debounce it to prevent triggering this function too often when the user is typing.
|
||||||
this.valueChangeSubscription = this.credForm.valueChanges.pipe(debounceTime(1000)).subscribe((changes) => {
|
this.valueChangeSubscription = this.credForm.valueChanges.pipe(debounceTime(1000)).subscribe((changes) => {
|
||||||
|
|
|
@ -45,6 +45,7 @@ import { CoreErrorInfoComponent } from '@components/error-info/error-info';
|
||||||
import { CoreUserSupportConfig } from '@features/user/classes/support/support-config';
|
import { CoreUserSupportConfig } from '@features/user/classes/support/support-config';
|
||||||
import { CoreUserGuestSupportConfig } from '@features/user/classes/support/guest-support-config';
|
import { CoreUserGuestSupportConfig } from '@features/user/classes/support/guest-support-config';
|
||||||
import { CoreLoginError } from '@classes/errors/loginerror';
|
import { CoreLoginError } from '@classes/errors/loginerror';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Site (url) chooser when adding a new site.
|
* Site (url) chooser when adding a new site.
|
||||||
|
@ -93,7 +94,7 @@ export class CoreLoginSitePage implements OnInit {
|
||||||
// Load fixed sites if they're set.
|
// Load fixed sites if they're set.
|
||||||
if (CoreLoginHelper.hasSeveralFixedSites()) {
|
if (CoreLoginHelper.hasSeveralFixedSites()) {
|
||||||
url = this.initSiteSelector();
|
url = this.initSiteSelector();
|
||||||
} else if (CoreConstants.CONFIG.enableonboarding && !CoreApp.isIOS()) {
|
} else if (CoreConstants.CONFIG.enableonboarding && !CorePlatform.isIOS()) {
|
||||||
this.initOnboarding();
|
this.initOnboarding();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ import { IonTabs } from '@ionic/angular';
|
||||||
import { BackButtonEvent } from '@ionic/core';
|
import { BackButtonEvent } from '@ionic/core';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreEvents, CoreEventObserver } from '@singletons/events';
|
import { CoreEvents, CoreEventObserver } from '@singletons/events';
|
||||||
import { CoreMainMenu, CoreMainMenuProvider } from '../../services/mainmenu';
|
import { CoreMainMenu, CoreMainMenuProvider } from '../../services/mainmenu';
|
||||||
import { CoreMainMenuDelegate, CoreMainMenuHandlerToDisplay } from '../../services/mainmenu-delegate';
|
import { CoreMainMenuDelegate, CoreMainMenuHandlerToDisplay } from '../../services/mainmenu-delegate';
|
||||||
|
@ -31,6 +30,7 @@ import { trigger, state, style, transition, animate } from '@angular/animations'
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreDom } from '@singletons/dom';
|
import { CoreDom } from '@singletons/dom';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
const ANIMATION_DURATION = 500;
|
const ANIMATION_DURATION = 500;
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ export class CoreMainMenuPage implements OnInit, OnDestroy {
|
||||||
});
|
});
|
||||||
document.addEventListener('ionBackButton', this.backButtonFunction);
|
document.addEventListener('ionBackButton', this.backButtonFunction);
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS, the resize event is triggered before the keyboard is opened/closed and not triggered again once done.
|
// In iOS, the resize event is triggered before the keyboard is opened/closed and not triggered again once done.
|
||||||
// Init handlers again once keyboard is closed since the resize event doesn't have the updated height.
|
// Init handlers again once keyboard is closed since the resize event doesn't have the updated height.
|
||||||
this.keyboardObserver = CoreEvents.on(CoreEvents.KEYBOARD_CHANGE, (kbHeight: number) => {
|
this.keyboardObserver = CoreEvents.on(CoreEvents.KEYBOARD_CHANGE, (kbHeight: number) => {
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreLang, CoreLangLanguage } from '@services/lang';
|
import { CoreLang, CoreLangLanguage } from '@services/lang';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
|
@ -23,6 +22,7 @@ import { Device, makeSingleton } from '@singletons';
|
||||||
import { CoreArray } from '@singletons/array';
|
import { CoreArray } from '@singletons/array';
|
||||||
import { CoreTextUtils } from '@services/utils/text';
|
import { CoreTextUtils } from '@services/utils/text';
|
||||||
import { CoreScreen } from '@services/screen';
|
import { CoreScreen } from '@services/screen';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
declare module '@singletons/events' {
|
declare module '@singletons/events' {
|
||||||
|
|
||||||
|
@ -196,9 +196,9 @@ export class CoreMainMenuProvider {
|
||||||
osversion: Device.version,
|
osversion: Device.version,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
replacements.devicetype = 'Android';
|
replacements.devicetype = 'Android';
|
||||||
} else if (CoreApp.isIOS()) {
|
} else if (CorePlatform.isIOS()) {
|
||||||
replacements.devicetype = 'iPhone or iPad';
|
replacements.devicetype = 'iPhone or iPad';
|
||||||
} else {
|
} else {
|
||||||
replacements.devicetype = 'Other';
|
replacements.devicetype = 'Other';
|
||||||
|
|
|
@ -228,7 +228,7 @@ export class CorePushNotificationsProvider {
|
||||||
* @returns Promise resolved when done.
|
* @returns Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
protected async createDefaultChannel(): Promise<void> {
|
protected async createDefaultChannel(): Promise<void> {
|
||||||
if (!CoreApp.isAndroid()) {
|
if (!CorePlatform.isAndroid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,7 +481,7 @@ export class CorePushNotificationsProvider {
|
||||||
text: notification.message,
|
text: notification.message,
|
||||||
channel: 'PushPluginChannel',
|
channel: 'PushPluginChannel',
|
||||||
};
|
};
|
||||||
const isAndroid = CoreApp.isAndroid();
|
const isAndroid = CorePlatform.isAndroid();
|
||||||
const extraFeatures = CoreUtils.isTrueOrOne(data.extrafeatures);
|
const extraFeatures = CoreUtils.isTrueOrOne(data.extrafeatures);
|
||||||
|
|
||||||
if (extraFeatures && isAndroid && CoreUtils.isFalseOrZero(data.notif)) {
|
if (extraFeatures && isAndroid && CoreUtils.isFalseOrZero(data.notif)) {
|
||||||
|
|
|
@ -16,7 +16,7 @@ import { CoreConstants } from '@/core/constants';
|
||||||
import { Params } from '@angular/router';
|
import { Params } from '@angular/router';
|
||||||
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
|
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
|
||||||
import { SHAREDFILES_PAGE_NAME } from '@features/sharedfiles/sharedfiles.module';
|
import { SHAREDFILES_PAGE_NAME } from '@features/sharedfiles/sharedfiles.module';
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a collection of setting sections.
|
* Provides a collection of setting sections.
|
||||||
|
@ -45,7 +45,7 @@ export class CoreSettingsSectionsSource extends CoreRoutedItemsManagerSource<Cor
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
sections.push({
|
sections.push({
|
||||||
name: 'core.sharedfiles.sharedfiles',
|
name: 'core.sharedfiles.sharedfiles',
|
||||||
path: SHAREDFILES_PAGE_NAME + '/list/root',
|
path: SHAREDFILES_PAGE_NAME + '/list/root',
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
// 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 { CoreApp } from '@services/app';
|
|
||||||
import { Component, OnDestroy } from '@angular/core';
|
import { Component, OnDestroy } from '@angular/core';
|
||||||
import { CoreConstants } from '@/core/constants';
|
import { CoreConstants } from '@/core/constants';
|
||||||
import { CoreLocalNotifications } from '@services/local-notifications';
|
import { CoreLocalNotifications } from '@services/local-notifications';
|
||||||
|
@ -111,10 +110,10 @@ export class CoreSettingsDeviceInfoPage implements OnDestroy {
|
||||||
|
|
||||||
if (CorePlatform.isMobile()) {
|
if (CorePlatform.isMobile()) {
|
||||||
this.deviceInfo.deviceType = CorePlatform.is('tablet') ? 'tablet' : 'phone';
|
this.deviceInfo.deviceType = CorePlatform.is('tablet') ? 'tablet' : 'phone';
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
this.deviceInfo.deviceOs = 'android';
|
this.deviceInfo.deviceOs = 'android';
|
||||||
this.deviceOsTranslated = 'Android';
|
this.deviceOsTranslated = 'Android';
|
||||||
} else if (CoreApp.isIOS()) {
|
} else if (CorePlatform.isIOS()) {
|
||||||
this.deviceInfo.deviceOs = 'ios';
|
this.deviceInfo.deviceOs = 'ios';
|
||||||
this.deviceOsTranslated = 'iOS';
|
this.deviceOsTranslated = 'iOS';
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -20,13 +20,13 @@ import { CoreLang } from '@services/lang';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
|
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
|
||||||
import { CoreSettingsHelper, CoreColorScheme, CoreZoomLevel } from '../../services/settings-helper';
|
import { CoreSettingsHelper, CoreColorScheme, CoreZoomLevel } from '../../services/settings-helper';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreIframeUtils } from '@services/utils/iframe';
|
import { CoreIframeUtils } from '@services/utils/iframe';
|
||||||
import { Diagnostic, Translate } from '@singletons';
|
import { Diagnostic, Translate } from '@singletons';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { AlertButton } from '@ionic/angular';
|
import { AlertButton } from '@ionic/angular';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Page that displays the general settings.
|
* Page that displays the general settings.
|
||||||
|
@ -81,7 +81,7 @@ export class CoreSettingsGeneralPage {
|
||||||
this.colorSchemes.push(CoreColorScheme.LIGHT);
|
this.colorSchemes.push(CoreColorScheme.LIGHT);
|
||||||
this.selectedScheme = this.colorSchemes[0];
|
this.selectedScheme = this.colorSchemes[0];
|
||||||
} else {
|
} else {
|
||||||
this.isAndroid = CoreApp.isAndroid();
|
this.isAndroid = CorePlatform.isAndroid();
|
||||||
this.colorSchemes = CoreSettingsHelper.getAllowedColorSchemes();
|
this.colorSchemes = CoreSettingsHelper.getAllowedColorSchemes();
|
||||||
this.selectedScheme = await CoreConfig.get(CoreConstants.SETTINGS_COLOR_SCHEME, CoreColorScheme.LIGHT);
|
this.selectedScheme = await CoreConfig.get(CoreConstants.SETTINGS_COLOR_SCHEME, CoreColorScheme.LIGHT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { CoreSettingsHandler, CoreSettingsHandlerData } from '@features/settings/services/settings-delegate';
|
import { CoreSettingsHandler, CoreSettingsHandlerData } from '@features/settings/services/settings-delegate';
|
||||||
import { SHAREDFILES_PAGE_NAME } from '@features/sharedfiles/sharedfiles.module';
|
import { SHAREDFILES_PAGE_NAME } from '@features/sharedfiles/sharedfiles.module';
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
import { makeSingleton } from '@singletons';
|
import { makeSingleton } from '@singletons';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +33,7 @@ export class CoreSharedFilesSettingsHandlerService implements CoreSettingsHandle
|
||||||
* @returns Whether or not the handler is enabled on a site level.
|
* @returns Whether or not the handler is enabled on a site level.
|
||||||
*/
|
*/
|
||||||
async isEnabled(): Promise<boolean> {
|
async isEnabled(): Promise<boolean> {
|
||||||
return CoreApp.isIOS();
|
return CorePlatform.isIOS();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -19,7 +19,7 @@ import {
|
||||||
CoreFileUploaderHandlerData,
|
CoreFileUploaderHandlerData,
|
||||||
CoreFileUploaderHandlerResult,
|
CoreFileUploaderHandlerResult,
|
||||||
} from '@features/fileuploader/services/fileuploader-delegate';
|
} from '@features/fileuploader/services/fileuploader-delegate';
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
import { makeSingleton } from '@singletons';
|
import { makeSingleton } from '@singletons';
|
||||||
import { CoreSharedFilesHelper } from '../sharedfiles-helper';
|
import { CoreSharedFilesHelper } from '../sharedfiles-helper';
|
||||||
/**
|
/**
|
||||||
|
@ -37,7 +37,7 @@ export class CoreSharedFilesUploadHandlerService implements CoreFileUploaderHand
|
||||||
* @returns True or promise resolved with true if enabled.
|
* @returns True or promise resolved with true if enabled.
|
||||||
*/
|
*/
|
||||||
async isEnabled(): Promise<boolean> {
|
async isEnabled(): Promise<boolean> {
|
||||||
return CoreApp.isIOS();
|
return CorePlatform.isIOS();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,7 +18,6 @@ import { FileEntry } from '@ionic-native/file/ngx';
|
||||||
import { CoreCanceledError } from '@classes/errors/cancelederror';
|
import { CoreCanceledError } from '@classes/errors/cancelederror';
|
||||||
import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
|
import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
|
||||||
import { CoreFileUploaderHandlerResult } from '@features/fileuploader/services/fileuploader-delegate';
|
import { CoreFileUploaderHandlerResult } from '@features/fileuploader/services/fileuploader-delegate';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
@ -49,7 +48,7 @@ export class CoreSharedFilesHelperProvider {
|
||||||
* Initialize.
|
* Initialize.
|
||||||
*/
|
*/
|
||||||
initialize(): void {
|
initialize(): void {
|
||||||
if (!CoreApp.isIOS()) {
|
if (!CorePlatform.isIOS()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ export class CoreSitePluginsProvider {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (args.appismobile) {
|
if (args.appismobile) {
|
||||||
defaultArgs.appplatform = CoreApp.isIOS() ? 'ios' : 'android';
|
defaultArgs.appplatform = CorePlatform.isIOS() ? 'ios' : 'android';
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -12,14 +12,16 @@
|
||||||
// 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 { CoreApp } from '@services/app';
|
|
||||||
import { CorePlatform } from '@services/platform';
|
import { CorePlatform } from '@services/platform';
|
||||||
import { CoreIframeUtils } from '@services/utils/iframe';
|
import { CoreIframeUtils } from '@services/utils/iframe';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject some scripts for iOS iframes.
|
||||||
|
*/
|
||||||
export default async function(): Promise<void> {
|
export default async function(): Promise<void> {
|
||||||
await CorePlatform.ready();
|
await CorePlatform.ready();
|
||||||
|
|
||||||
if (!CoreApp.isIOS() || !('WKUserScript' in window)) {
|
if (!CorePlatform.isIOS() || !('WKUserScript' in window)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ import { CoreSiteError } from '@classes/errors/siteerror';
|
||||||
import { CoreLoginHelper } from '@features/login/services/login-helper';
|
import { CoreLoginHelper } from '@features/login/services/login-helper';
|
||||||
import { CoreUserAuthenticatedSupportConfig } from '@features/user/classes/support/authenticated-support-config';
|
import { CoreUserAuthenticatedSupportConfig } from '@features/user/classes/support/authenticated-support-config';
|
||||||
import { CoreUserNullSupportConfig } from '@features/user/classes/support/null-support-config';
|
import { CoreUserNullSupportConfig } from '@features/user/classes/support/null-support-config';
|
||||||
import { CoreApp } from '@services/app';
|
import { CorePlatform } from '@services/platform';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreCustomURLSchemes } from '@services/urlschemes';
|
import { CoreCustomURLSchemes } from '@services/urlschemes';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
|
@ -27,6 +27,9 @@ import { CoreEvents } from '@singletons/events';
|
||||||
|
|
||||||
let lastInAppUrl: string | null = null;
|
let lastInAppUrl: string | null = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
export default function(): void {
|
export default function(): void {
|
||||||
// Check URLs loaded in any InAppBrowser.
|
// Check URLs loaded in any InAppBrowser.
|
||||||
CoreEvents.on(CoreEvents.IAB_LOAD_START, async (event) => {
|
CoreEvents.on(CoreEvents.IAB_LOAD_START, async (event) => {
|
||||||
|
@ -59,7 +62,7 @@ export default function(): void {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CoreApp.isAndroid()) {
|
if (!CorePlatform.isAndroid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import { CoreDB } from '@services/db';
|
||||||
import { CoreEvents } from '@singletons/events';
|
import { CoreEvents } from '@singletons/events';
|
||||||
import { SQLiteDB, SQLiteDBTableSchema } from '@classes/sqlitedb';
|
import { SQLiteDB, SQLiteDBTableSchema } from '@classes/sqlitedb';
|
||||||
|
|
||||||
import { makeSingleton, Keyboard, StatusBar, Device } from '@singletons';
|
import { makeSingleton, Keyboard, StatusBar } from '@singletons';
|
||||||
import { CoreLogger } from '@singletons/logger';
|
import { CoreLogger } from '@singletons/logger';
|
||||||
import { CoreColors } from '@singletons/colors';
|
import { CoreColors } from '@singletons/colors';
|
||||||
import { DBNAME, SCHEMA_VERSIONS_TABLE_NAME, SCHEMA_VERSIONS_TABLE_SCHEMA, SchemaVersionsDBEntry } from '@services/database/app';
|
import { DBNAME, SCHEMA_VERSIONS_TABLE_NAME, SCHEMA_VERSIONS_TABLE_SCHEMA, SchemaVersionsDBEntry } from '@services/database/app';
|
||||||
|
@ -204,7 +204,7 @@ export class CoreAppProvider {
|
||||||
return 'itms-apps://itunes.apple.com/app/' + storesConfig.ios;
|
return 'itms-apps://itunes.apple.com/app/' + storesConfig.ios;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.isAndroid() && storesConfig.android) {
|
if (CorePlatform.isAndroid() && storesConfig.android) {
|
||||||
return 'market://details?id=' + storesConfig.android;
|
return 'market://details?id=' + storesConfig.android;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,13 +219,10 @@ export class CoreAppProvider {
|
||||||
* Get platform major version number.
|
* Get platform major version number.
|
||||||
*
|
*
|
||||||
* @returns The platform major number.
|
* @returns The platform major number.
|
||||||
|
* @deprecated since 4.1.1. Use CorePlatform.getPlatformMajorVersion instead.
|
||||||
*/
|
*/
|
||||||
getPlatformMajorVersion(): number {
|
getPlatformMajorVersion(): number {
|
||||||
if (!CorePlatform.isMobile()) {
|
return CorePlatform.getPlatformMajorVersion();
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Number(Device.version?.split('.')[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -242,9 +239,10 @@ export class CoreAppProvider {
|
||||||
* Checks if the app is running in an Android mobile or tablet device.
|
* Checks if the app is running in an Android mobile or tablet device.
|
||||||
*
|
*
|
||||||
* @returns Whether the app is running in an Android mobile or tablet device.
|
* @returns Whether the app is running in an Android mobile or tablet device.
|
||||||
|
* @deprecated since 4.1.1. Use CorePlatform.isAndroid instead.
|
||||||
*/
|
*/
|
||||||
isAndroid(): boolean {
|
isAndroid(): boolean {
|
||||||
return CorePlatform.isMobile() && CorePlatform.is('android');
|
return CorePlatform.isAndroid();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -261,27 +259,10 @@ export class CoreAppProvider {
|
||||||
* Checks if the app is running in an iOS mobile or tablet device.
|
* Checks if the app is running in an iOS mobile or tablet device.
|
||||||
*
|
*
|
||||||
* @returns Whether the app is running in an iOS mobile or tablet device.
|
* @returns Whether the app is running in an iOS mobile or tablet device.
|
||||||
|
* @deprecated since 4.1.1. Use CorePlatform.isIOS instead.
|
||||||
*/
|
*/
|
||||||
isIOS(): boolean {
|
isIOS(): boolean {
|
||||||
return CorePlatform.isMobile() && !CorePlatform.is('android');
|
return CorePlatform.isIOS();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the app is running in an iPad device.
|
|
||||||
*
|
|
||||||
* @returns Whether the app is running in an iPad device.
|
|
||||||
*/
|
|
||||||
isIPad(): boolean {
|
|
||||||
return CoreApp.isIOS() && CorePlatform.is('ipad');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the app is running in an iPhone device.
|
|
||||||
*
|
|
||||||
* @returns Whether the app is running in an iPhone device.
|
|
||||||
*/
|
|
||||||
isIPhone(): boolean {
|
|
||||||
return CoreApp.isIOS() && CorePlatform.is('iphone');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -405,7 +386,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.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
Keyboard.show();
|
Keyboard.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { FileEntry } from '@ionic-native/file/ngx';
|
import { FileEntry } from '@ionic-native/file/ngx';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreFilepool } from '@services/filepool';
|
import { CoreFilepool } from '@services/filepool';
|
||||||
|
@ -31,6 +30,7 @@ import { CoreNetworkError } from '@classes/errors/network-error';
|
||||||
import { CoreConfig } from './config';
|
import { CoreConfig } from './config';
|
||||||
import { CoreCanceledError } from '@classes/errors/cancelederror';
|
import { CoreCanceledError } from '@classes/errors/cancelederror';
|
||||||
import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
import { CoreMimetypeUtils } from '@services/utils/mimetype';
|
||||||
|
import { CorePlatform } from './platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provider to provide some helper functions regarding files and packages.
|
* Provider to provide some helper functions regarding files and packages.
|
||||||
|
@ -44,7 +44,7 @@ export class CoreFileHelperProvider {
|
||||||
* @returns Boolean.
|
* @returns Boolean.
|
||||||
*/
|
*/
|
||||||
defaultIsOpenWithPicker(): boolean {
|
defaultIsOpenWithPicker(): boolean {
|
||||||
return CoreApp.isIOS() && CoreConstants.CONFIG.iOSDefaultOpenFileAction === OpenFileAction.OPEN_WITH;
|
return CorePlatform.isIOS() && CoreConstants.CONFIG.iOSDefaultOpenFileAction === OpenFileAction.OPEN_WITH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,7 +16,6 @@ import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
import { FileEntry, DirectoryEntry, Entry, Metadata, IFile } from '@ionic-native/file/ngx';
|
import { FileEntry, DirectoryEntry, Entry, Metadata, IFile } from '@ionic-native/file/ngx';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
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 { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
|
@ -140,9 +139,9 @@ export class CoreFileProvider {
|
||||||
|
|
||||||
await CorePlatform.ready();
|
await CorePlatform.ready();
|
||||||
|
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
this.basePath = File.externalApplicationStorageDirectory || this.basePath;
|
this.basePath = File.externalApplicationStorageDirectory || this.basePath;
|
||||||
} else if (CoreApp.isIOS()) {
|
} else if (CorePlatform.isIOS()) {
|
||||||
this.basePath = File.documentsDirectory || this.basePath;
|
this.basePath = File.documentsDirectory || this.basePath;
|
||||||
} else if (!this.isAvailable() || this.basePath === '') {
|
} else if (!this.isAvailable() || this.basePath === '') {
|
||||||
this.logger.error('Error getting device OS.');
|
this.logger.error('Error getting device OS.');
|
||||||
|
@ -441,7 +440,7 @@ export class CoreFileProvider {
|
||||||
*/
|
*/
|
||||||
calculateFreeSpace(): Promise<number> {
|
calculateFreeSpace(): Promise<number> {
|
||||||
return File.getFreeDiskSpace().then((size) => {
|
return File.getFreeDiskSpace().then((size) => {
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS the size is in bytes.
|
// In iOS the size is in bytes.
|
||||||
return Number(size);
|
return Number(size);
|
||||||
}
|
}
|
||||||
|
@ -717,7 +716,7 @@ export class CoreFileProvider {
|
||||||
async getBasePathToDownload(): Promise<string> {
|
async getBasePathToDownload(): Promise<string> {
|
||||||
await this.init();
|
await this.init();
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
// In iOS we want the internal URL (cdvfile://localhost/persistent/...).
|
// In iOS we want the internal URL (cdvfile://localhost/persistent/...).
|
||||||
const dirEntry = await File.resolveDirectoryUrl(this.basePath);
|
const dirEntry = await File.resolveDirectoryUrl(this.basePath);
|
||||||
|
|
||||||
|
@ -1263,7 +1262,7 @@ export class CoreFileProvider {
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CoreApp.isIOS()) {
|
if (CorePlatform.isIOS()) {
|
||||||
return src.replace(CoreConstants.CONFIG.ioswebviewscheme + '://localhost/_app_file_', 'file://');
|
return src.replace(CoreConstants.CONFIG.ioswebviewscheme + '://localhost/_app_file_', 'file://');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ export class CoreGeolocationProvider {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CoreApp.isIOS()) {
|
if (!CorePlatform.isIOS()) {
|
||||||
Diagnostic.switchToLocationSettings();
|
Diagnostic.switchToLocationSettings();
|
||||||
await CoreApp.waitForResume(30000);
|
await CoreApp.waitForResume(30000);
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ export class CoreGeolocationProvider {
|
||||||
* Request and return the location authorization status for the application.
|
* Request and return the location authorization status for the application.
|
||||||
*/
|
*/
|
||||||
protected async requestLocationAuthorization(): Promise<void> {
|
protected async requestLocationAuthorization(): Promise<void> {
|
||||||
if (!CoreApp.isIOS()) {
|
if (!CorePlatform.isIOS()) {
|
||||||
await Diagnostic.requestLocationAuthorization();
|
await Diagnostic.requestLocationAuthorization();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -186,7 +186,7 @@ export class CoreLocalNotificationsProvider {
|
||||||
*/
|
*/
|
||||||
canDisableSound(): boolean {
|
canDisableSound(): boolean {
|
||||||
// Only allow disabling sound in Android 7 or lower. In iOS and Android 8+ it can easily be done with system settings.
|
// Only allow disabling sound in Android 7 or lower. In iOS and Android 8+ it can easily be done with system settings.
|
||||||
return this.isAvailable() && CoreApp.isAndroid() && CoreApp.getPlatformMajorVersion() < 8;
|
return CorePlatform.isAndroid() && CorePlatform.getPlatformMajorVersion() < 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -195,7 +195,7 @@ export class CoreLocalNotificationsProvider {
|
||||||
* @returns Promise resolved when done.
|
* @returns Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
protected async createDefaultChannel(): Promise<void> {
|
protected async createDefaultChannel(): Promise<void> {
|
||||||
if (!CoreApp.isAndroid()) {
|
if (!CorePlatform.isAndroid()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -583,7 +583,7 @@ export class CoreLocalNotificationsProvider {
|
||||||
notification.data.component = component;
|
notification.data.component = component;
|
||||||
notification.data.siteId = siteId;
|
notification.data.siteId = siteId;
|
||||||
|
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
notification.icon = notification.icon || 'res://icon';
|
notification.icon = notification.icon || 'res://icon';
|
||||||
notification.smallIcon = notification.smallIcon || 'res://smallicon';
|
notification.smallIcon = notification.smallIcon || 'res://smallicon';
|
||||||
notification.color = notification.color || CoreConstants.CONFIG.notificoncolor;
|
notification.color = notification.color || CoreConstants.CONFIG.notificoncolor;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Platform } from '@ionic/angular';
|
import { Platform } from '@ionic/angular';
|
||||||
import { makeSingleton } from '@singletons';
|
import { Device, makeSingleton } from '@singletons';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend Ionic's Platform service.
|
* Extend Ionic's Platform service.
|
||||||
|
@ -22,6 +22,55 @@ import { makeSingleton } from '@singletons';
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class CorePlatformService extends Platform {
|
export class CorePlatformService extends Platform {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get platform major version number.
|
||||||
|
*
|
||||||
|
* @returns The platform major number.
|
||||||
|
*/
|
||||||
|
getPlatformMajorVersion(): number {
|
||||||
|
if (!this.isMobile()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Number(Device.version?.split('.')[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the app is running in an Android mobile or tablet device.
|
||||||
|
*
|
||||||
|
* @returns Whether the app is running in an Android mobile or tablet device.
|
||||||
|
*/
|
||||||
|
isAndroid(): boolean {
|
||||||
|
return this.isMobile() && this.is('android');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the app is running in an iOS mobile or tablet device.
|
||||||
|
*
|
||||||
|
* @returns Whether the app is running in an iOS mobile or tablet device.
|
||||||
|
*/
|
||||||
|
isIOS(): boolean {
|
||||||
|
return this.isMobile() && !this.is('android');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the app is running in an iPad device.
|
||||||
|
*
|
||||||
|
* @returns Whether the app is running in an iPad device.
|
||||||
|
*/
|
||||||
|
isIPad(): boolean {
|
||||||
|
return this.isIOS() && this.is('ipad');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the app is running in an iPhone device.
|
||||||
|
*
|
||||||
|
* @returns Whether the app is running in an iPhone device.
|
||||||
|
*/
|
||||||
|
isIPhone(): boolean {
|
||||||
|
return this.isIOS() && this.is('iphone');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the app is running in a mobile or tablet device (Cordova).
|
* Checks if the app is running in a mobile or tablet device (Cordova).
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
// 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 { CoreApp } from '@services/app';
|
|
||||||
import { CoreTextUtilsProvider } from '@services/utils/text';
|
import { CoreTextUtilsProvider } from '@services/utils/text';
|
||||||
import { DomSanitizer } from '@singletons';
|
import { DomSanitizer } from '@singletons';
|
||||||
|
|
||||||
import { mockSingleton } from '@/testing/utils';
|
import { mockSingleton } from '@/testing/utils';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
describe('CoreTextUtilsProvider', () => {
|
describe('CoreTextUtilsProvider', () => {
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ describe('CoreTextUtilsProvider', () => {
|
||||||
let textUtils: CoreTextUtilsProvider;
|
let textUtils: CoreTextUtilsProvider;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mockSingleton(CoreApp, [], { isAndroid: () => config.platform === 'android' });
|
mockSingleton(CorePlatform, [], { isAndroid: () => config.platform === 'android' });
|
||||||
mockSingleton(DomSanitizer, [], { bypassSecurityTrustUrl: url => url });
|
mockSingleton(DomSanitizer, [], { bypassSecurityTrustUrl: url => url });
|
||||||
|
|
||||||
textUtils = new CoreTextUtilsProvider();
|
textUtils = new CoreTextUtilsProvider();
|
||||||
|
@ -57,7 +57,7 @@ describe('CoreTextUtilsProvider', () => {
|
||||||
expect(url).toEqual('geo:0,0?q=Moodle%20Spain%20HQ');
|
expect(url).toEqual('geo:0,0?q=Moodle%20Spain%20HQ');
|
||||||
|
|
||||||
expect(DomSanitizer.bypassSecurityTrustUrl).toHaveBeenCalled();
|
expect(DomSanitizer.bypassSecurityTrustUrl).toHaveBeenCalled();
|
||||||
expect(CoreApp.isAndroid).toHaveBeenCalled();
|
expect(CorePlatform.isAndroid).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('builds address URL for non-Android platforms', () => {
|
it('builds address URL for non-Android platforms', () => {
|
||||||
|
@ -73,7 +73,7 @@ describe('CoreTextUtilsProvider', () => {
|
||||||
expect(url).toEqual('http://maps.google.com?q=Moodle%20Spain%20HQ');
|
expect(url).toEqual('http://maps.google.com?q=Moodle%20Spain%20HQ');
|
||||||
|
|
||||||
expect(DomSanitizer.bypassSecurityTrustUrl).toHaveBeenCalled();
|
expect(DomSanitizer.bypassSecurityTrustUrl).toHaveBeenCalled();
|
||||||
expect(CoreApp.isAndroid).toHaveBeenCalled();
|
expect(CorePlatform.isAndroid).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('doesn\'t build address if it\'s already a URL', () => {
|
it('doesn\'t build address if it\'s already a URL', () => {
|
||||||
|
|
|
@ -57,6 +57,7 @@ import { CoreNetwork } from '@services/network';
|
||||||
import { CoreSiteError } from '@classes/errors/siteerror';
|
import { CoreSiteError } from '@classes/errors/siteerror';
|
||||||
import { CoreUserSupport } from '@features/user/services/support';
|
import { CoreUserSupport } from '@features/user/services/support';
|
||||||
import { CoreErrorInfoComponent } from '@components/error-info/error-info';
|
import { CoreErrorInfoComponent } from '@components/error-info/error-info';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Utils" service with helper functions for UI, DOM elements and HTML code.
|
* "Utils" service with helper functions for UI, DOM elements and HTML code.
|
||||||
|
@ -133,7 +134,7 @@ export class CoreDomUtilsProvider {
|
||||||
const getAvailableBytes = async (): Promise<number | null> => {
|
const getAvailableBytes = async (): Promise<number | null> => {
|
||||||
const availableBytes = await CoreFile.calculateFreeSpace();
|
const availableBytes = await CoreFile.calculateFreeSpace();
|
||||||
|
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
return availableBytes;
|
return availableBytes;
|
||||||
} else {
|
} else {
|
||||||
// Space calculation is not accurate on iOS, but it gets more accurate when space is lower.
|
// Space calculation is not accurate on iOS, but it gets more accurate when space is lower.
|
||||||
|
@ -152,7 +153,7 @@ export class CoreDomUtilsProvider {
|
||||||
} else {
|
} else {
|
||||||
const availableSize = CoreTextUtils.bytesToSize(availableBytes, 2);
|
const availableSize = CoreTextUtils.bytesToSize(availableBytes, 2);
|
||||||
|
|
||||||
if (CoreApp.isAndroid() && size.size > availableBytes - CoreConstants.MINIMUM_FREE_SPACE) {
|
if (CorePlatform.isAndroid() && size.size > availableBytes - CoreConstants.MINIMUM_FREE_SPACE) {
|
||||||
throw new CoreError(
|
throw new CoreError(
|
||||||
Translate.instant(
|
Translate.instant(
|
||||||
'core.course.insufficientavailablespace',
|
'core.course.insufficientavailablespace',
|
||||||
|
@ -338,7 +339,7 @@ export class CoreDomUtilsProvider {
|
||||||
|
|
||||||
if (focusElement === document.activeElement) {
|
if (focusElement === document.activeElement) {
|
||||||
await CoreUtils.nextTick();
|
await CoreUtils.nextTick();
|
||||||
if (CoreApp.isAndroid() && this.supportsInputKeyboard(focusElement)) {
|
if (CorePlatform.isAndroid() && this.supportsInputKeyboard(focusElement)) {
|
||||||
// On some Android versions the keyboard doesn't open automatically.
|
// On some Android versions the keyboard doesn't open automatically.
|
||||||
CoreApp.openKeyboard();
|
CoreApp.openKeyboard();
|
||||||
}
|
}
|
||||||
|
@ -1529,7 +1530,7 @@ export class CoreDomUtilsProvider {
|
||||||
buttons: buttons,
|
buttons: buttons,
|
||||||
});
|
});
|
||||||
|
|
||||||
const isDevice = CoreApp.isAndroid() || CoreApp.isIOS();
|
const isDevice = CorePlatform.isAndroid() || CorePlatform.isIOS();
|
||||||
if (!isDevice) {
|
if (!isDevice) {
|
||||||
// Treat all anchors so they don't override the app.
|
// Treat all anchors so they don't override the app.
|
||||||
const alertMessageEl: HTMLElement | null = alert.querySelector('.alert-message');
|
const alertMessageEl: HTMLElement | null = alert.querySelector('.alert-message');
|
||||||
|
@ -1989,7 +1990,7 @@ export class CoreDomUtilsProvider {
|
||||||
* @returns Promise resolved when done.
|
* @returns Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
async waitForResizeDone(windowWidth?: number, windowHeight?: number, retries = 0): Promise<void> {
|
async waitForResizeDone(windowWidth?: number, windowHeight?: number, retries = 0): Promise<void> {
|
||||||
if (!CoreApp.isIOS()) {
|
if (!CorePlatform.isIOS()) {
|
||||||
return; // Only wait in iOS.
|
return; // Only wait in iOS.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ import { Injectable } from '@angular/core';
|
||||||
import { WKUserScriptWindow } from 'cordova-plugin-wkuserscript';
|
import { WKUserScriptWindow } from 'cordova-plugin-wkuserscript';
|
||||||
import { WKWebViewCookiesWindow } from 'cordova-plugin-wkwebview-cookies';
|
import { WKWebViewCookiesWindow } from 'cordova-plugin-wkwebview-cookies';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreNetwork } from '@services/network';
|
import { CoreNetwork } from '@services/network';
|
||||||
import { CoreFile } from '@services/file';
|
import { CoreFile } from '@services/file';
|
||||||
import { CoreFileHelper } from '@services/file-helper';
|
import { CoreFileHelper } from '@services/file-helper';
|
||||||
|
@ -32,6 +31,7 @@ import { CoreWindow } from '@singletons/window';
|
||||||
import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper';
|
import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper';
|
||||||
import { CorePath } from '@singletons/path';
|
import { CorePath } from '@singletons/path';
|
||||||
import { CorePromisedValue } from '@classes/promised-value';
|
import { CorePromisedValue } from '@classes/promised-value';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possible types of frame elements.
|
* Possible types of frame elements.
|
||||||
|
@ -531,7 +531,7 @@ export class CoreIframeUtilsProvider {
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
CoreDomUtils.showErrorModal(error);
|
CoreDomUtils.showErrorModal(error);
|
||||||
}
|
}
|
||||||
} else if (CoreApp.isIOS() && (!link.target || link.target == '_self') && element) {
|
} else if (CorePlatform.isIOS() && (!link.target || link.target == '_self') && element) {
|
||||||
// In cordova ios 4.1.0 links inside iframes stopped working. We'll manually treat them.
|
// In cordova ios 4.1.0 links inside iframes stopped working. We'll manually treat them.
|
||||||
event && event.preventDefault();
|
event && event.preventDefault();
|
||||||
if (element.tagName.toLowerCase() == 'object') {
|
if (element.tagName.toLowerCase() == 'object') {
|
||||||
|
@ -564,7 +564,7 @@ export class CoreIframeUtilsProvider {
|
||||||
* @returns Promise resolved when done.
|
* @returns Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
async fixIframeCookies(url: string): Promise<void> {
|
async fixIframeCookies(url: string): Promise<void> {
|
||||||
if (!CoreApp.isIOS() || !url || CoreUrlUtils.isLocalFileUrl(url)) {
|
if (!CorePlatform.isIOS() || !url || CoreUrlUtils.isLocalFileUrl(url)) {
|
||||||
// No need to fix cookies.
|
// No need to fix cookies.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -593,7 +593,7 @@ export class CoreIframeUtilsProvider {
|
||||||
* @returns Boolean.
|
* @returns Boolean.
|
||||||
*/
|
*/
|
||||||
shouldDisplayHelp(): boolean {
|
shouldDisplayHelp(): boolean {
|
||||||
return CoreApp.isIOS() && CoreApp.getPlatformMajorVersion() >= 14;
|
return CorePlatform.isIOS() && CorePlatform.getPlatformMajorVersion() >= 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,7 +16,6 @@ import { Injectable } from '@angular/core';
|
||||||
import { SafeUrl } from '@angular/platform-browser';
|
import { SafeUrl } from '@angular/platform-browser';
|
||||||
import { ModalOptions } from '@ionic/core';
|
import { ModalOptions } from '@ionic/core';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreAnyError, CoreError } from '@classes/errors/error';
|
import { CoreAnyError, CoreError } from '@classes/errors/error';
|
||||||
import { DomSanitizer, makeSingleton, Translate } from '@singletons';
|
import { DomSanitizer, makeSingleton, Translate } from '@singletons';
|
||||||
import { CoreWSFile } from '@services/ws';
|
import { CoreWSFile } from '@services/ws';
|
||||||
|
@ -28,6 +27,7 @@ import { CoreText } from '@singletons/text';
|
||||||
import { CoreUrl } from '@singletons/url';
|
import { CoreUrl } from '@singletons/url';
|
||||||
import { AlertButton } from '@ionic/angular';
|
import { AlertButton } from '@ionic/angular';
|
||||||
import { CorePath } from '@singletons/path';
|
import { CorePath } from '@singletons/path';
|
||||||
|
import { CorePlatform } from '@services/platform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Different type of errors the app can treat.
|
* Different type of errors the app can treat.
|
||||||
|
@ -187,7 +187,7 @@ export class CoreTextUtilsProvider {
|
||||||
return DomSanitizer.bypassSecurityTrustUrl(address);
|
return DomSanitizer.bypassSecurityTrustUrl(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DomSanitizer.bypassSecurityTrustUrl((CoreApp.isAndroid() ? 'geo:0,0?q=' : 'http://maps.google.com?q=') +
|
return DomSanitizer.bypassSecurityTrustUrl((CorePlatform.isAndroid() ? 'geo:0,0?q=' : 'http://maps.google.com?q=') +
|
||||||
encodeURIComponent(address));
|
encodeURIComponent(address));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ import { InAppBrowserObject, InAppBrowserOptions } from '@ionic-native/in-app-br
|
||||||
import { FileEntry } from '@ionic-native/file/ngx';
|
import { FileEntry } from '@ionic-native/file/ngx';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
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 { CoreLang } from '@services/lang';
|
import { CoreLang } from '@services/lang';
|
||||||
|
@ -995,12 +994,12 @@ export class CoreUtilsProvider {
|
||||||
const extension = CoreMimetypeUtils.getFileExtension(path);
|
const extension = CoreMimetypeUtils.getFileExtension(path);
|
||||||
const mimetype = extension && CoreMimetypeUtils.getMimeType(extension);
|
const mimetype = extension && CoreMimetypeUtils.getMimeType(extension);
|
||||||
|
|
||||||
if (mimetype == 'text/html' && CoreApp.isAndroid()) {
|
if (mimetype == 'text/html' && CorePlatform.isAndroid()) {
|
||||||
// Open HTML local files in InAppBrowser, in system browser some embedded files aren't loaded.
|
// Open HTML local files in InAppBrowser, in system browser some embedded files aren't loaded.
|
||||||
this.openInApp(path);
|
this.openInApp(path);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} else if (extension === 'apk' && CoreApp.isAndroid()) {
|
} else if (extension === 'apk' && CorePlatform.isAndroid()) {
|
||||||
const url = await CoreUtils.ignoreErrors(
|
const url = await CoreUtils.ignoreErrors(
|
||||||
CoreFilepool.getFileUrlByPath(CoreSites.getCurrentSiteId(), CoreFile.removeBasePath(path)),
|
CoreFilepool.getFileUrlByPath(CoreSites.getCurrentSiteId(), CoreFile.removeBasePath(path)),
|
||||||
);
|
);
|
||||||
|
@ -1065,7 +1064,7 @@ export class CoreUtilsProvider {
|
||||||
options.enableViewPortScale = options.enableViewPortScale ?? 'yes'; // Enable zoom on iOS by default.
|
options.enableViewPortScale = options.enableViewPortScale ?? 'yes'; // Enable zoom on iOS by default.
|
||||||
options.allowInlineMediaPlayback = options.allowInlineMediaPlayback ?? 'yes'; // Allow playing inline videos in iOS.
|
options.allowInlineMediaPlayback = options.allowInlineMediaPlayback ?? 'yes'; // Allow playing inline videos in iOS.
|
||||||
|
|
||||||
if (!options.location && CoreApp.isIOS() && url.indexOf('file://') === 0) {
|
if (!options.location && CorePlatform.isIOS() && url.indexOf('file://') === 0) {
|
||||||
// The URL uses file protocol, don't show it on iOS.
|
// The URL uses file protocol, don't show it on iOS.
|
||||||
// In Android we keep it because otherwise we lose the whole toolbar.
|
// In Android we keep it because otherwise we lose the whole toolbar.
|
||||||
options.location = 'no';
|
options.location = 'no';
|
||||||
|
@ -1190,7 +1189,7 @@ export class CoreUtilsProvider {
|
||||||
* @returns Promise resolved when opened.
|
* @returns Promise resolved when opened.
|
||||||
*/
|
*/
|
||||||
async openOnlineFile(url: string): Promise<void> {
|
async openOnlineFile(url: string): Promise<void> {
|
||||||
if (CoreApp.isAndroid()) {
|
if (CorePlatform.isAndroid()) {
|
||||||
// In Android we need the mimetype to open it.
|
// In Android we need the mimetype to open it.
|
||||||
const mimetype = await this.ignoreErrors(this.getMimeTypeFromUrl(url));
|
const mimetype = await this.ignoreErrors(this.getMimeTypeFromUrl(url));
|
||||||
|
|
||||||
|
@ -1823,7 +1822,7 @@ export class CoreUtilsProvider {
|
||||||
shouldOpenWithDialog(options: CoreUtilsOpenFileOptions = {}): boolean {
|
shouldOpenWithDialog(options: CoreUtilsOpenFileOptions = {}): boolean {
|
||||||
const openFileAction = options.iOSOpenFileAction ?? CoreConstants.CONFIG.iOSDefaultOpenFileAction;
|
const openFileAction = options.iOSOpenFileAction ?? CoreConstants.CONFIG.iOSDefaultOpenFileAction;
|
||||||
|
|
||||||
return CoreApp.isIOS() && openFileAction == OpenFileAction.OPEN_WITH;
|
return CorePlatform.isIOS() && openFileAction == OpenFileAction.OPEN_WITH;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { CoreCancellablePromise } from '@classes/cancellable-promise';
|
import { CoreCancellablePromise } from '@classes/cancellable-promise';
|
||||||
import { CoreApp } from '@services/app';
|
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreEventObserver } from '@singletons/events';
|
import { CoreEventObserver } from '@singletons/events';
|
||||||
|
@ -568,77 +567,6 @@ export class CoreDom {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
/**
|
|
||||||
* Get all source URLs and types for a video or audio.
|
|
||||||
*
|
|
||||||
* @param mediaElement Audio or video element.
|
|
||||||
* @returns List of sources.
|
|
||||||
*/
|
|
||||||
static getMediaSources(mediaElement: HTMLVideoElement | HTMLAudioElement): CoreMediaSource[] {
|
|
||||||
const sources = Array.from(mediaElement.querySelectorAll('source')).map(source => ({
|
|
||||||
src: source.src || source.getAttribute('target-src') || '',
|
|
||||||
type: source.type,
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (mediaElement.src) {
|
|
||||||
sources.push({
|
|
||||||
src: mediaElement.src,
|
|
||||||
type: '',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return sources;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a source needs to be converted to be able to reproduce it.
|
|
||||||
*
|
|
||||||
* @param source Source.
|
|
||||||
* @returns Whether needs conversion.
|
|
||||||
*/
|
|
||||||
static sourceNeedsConversion(source: CoreMediaSource): boolean {
|
|
||||||
if (!CoreApp.isIOS()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let extension = source.type ? CoreMimetypeUtils.getExtension(source.type) : undefined;
|
|
||||||
if (!extension) {
|
|
||||||
extension = CoreMimetypeUtils.guessExtensionFromUrl(source.src);
|
|
||||||
}
|
|
||||||
|
|
||||||
return !!extension && ['ogv', 'webm', 'oga', 'ogg'].includes(extension);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if JS player should be used for a certain source.
|
|
||||||
*
|
|
||||||
* @param source Source.
|
|
||||||
* @returns Whether JS player should be used.
|
|
||||||
*/
|
|
||||||
static sourceUsesJavascriptPlayer(source: CoreMediaSource): boolean {
|
|
||||||
// For now, only use JS player if the source needs to be converted.
|
|
||||||
return CoreDom.sourceNeedsConversion(source);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if JS player should be used for a certain audio or video.
|
|
||||||
*
|
|
||||||
* @param mediaElement Media element.
|
|
||||||
* @returns Whether JS player should be used.
|
|
||||||
*/
|
|
||||||
static mediaUsesJavascriptPlayer(mediaElement: HTMLVideoElement | HTMLAudioElement): boolean {
|
|
||||||
if (!CoreApp.isIOS()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const sources = CoreDom.getMediaSources(mediaElement);
|
|
||||||
|
|
||||||
return sources.some(source => CoreDom.sourceUsesJavascriptPlayer(source));
|
|
||||||
}
|
|
||||||
|
|
||||||
=======
|
|
||||||
>>>>>>> f42ea632ca (a)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,6 +62,8 @@ const DEFAULT_SERVICE_SINGLETON_MOCKS: [CoreSingletonProxy, unknown][] = [
|
||||||
[CorePlatform, mock({
|
[CorePlatform, mock({
|
||||||
is: () => false,
|
is: () => false,
|
||||||
isMobile: () => false,
|
isMobile: () => false,
|
||||||
|
isAndroid: () => false,
|
||||||
|
isIOS: () => false,
|
||||||
ready: () => Promise.resolve(),
|
ready: () => Promise.resolve(),
|
||||||
resume: new Subject<void>(),
|
resume: new Subject<void>(),
|
||||||
})],
|
})],
|
||||||
|
|
Loading…
Reference in New Issue