Merge pull request #1478 from dpalou/MOBILE-2546
MOBILE-2546 ios: Fix split view animation when recording audiomain
commit
6bd420605e
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
import { Component, ViewChild, Input, ElementRef, OnInit, Optional, OnDestroy } from '@angular/core';
|
import { Component, ViewChild, Input, ElementRef, OnInit, Optional, OnDestroy } from '@angular/core';
|
||||||
import { NavController, Nav, ViewController } from 'ionic-angular';
|
import { NavController, Nav, ViewController } from 'ionic-angular';
|
||||||
|
import { CoreFileUploaderProvider } from '@core/fileuploader/providers/fileuploader';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -53,12 +54,18 @@ export class CoreSplitViewComponent implements OnInit, OnDestroy {
|
||||||
protected detailsDidEnterSubscription: Subscription;
|
protected detailsDidEnterSubscription: Subscription;
|
||||||
protected masterCanLeaveOverridden = false;
|
protected masterCanLeaveOverridden = false;
|
||||||
protected originalMasterCanLeave: Function;
|
protected originalMasterCanLeave: Function;
|
||||||
|
protected ignoreSplitChanged = false;
|
||||||
|
protected audioCaptureSubscription: Subscription;
|
||||||
|
|
||||||
// Empty placeholder for the 'detail' page.
|
// Empty placeholder for the 'detail' page.
|
||||||
detailPage: any = null;
|
detailPage: any = null;
|
||||||
|
|
||||||
constructor(@Optional() private masterNav: NavController, element: ElementRef) {
|
constructor(@Optional() private masterNav: NavController, element: ElementRef, fileUploaderProvider: CoreFileUploaderProvider) {
|
||||||
this.element = element.nativeElement;
|
this.element = element.nativeElement;
|
||||||
|
|
||||||
|
this.audioCaptureSubscription = fileUploaderProvider.onAudioCapture.subscribe((starting) => {
|
||||||
|
this.ignoreSplitChanged = starting;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -184,6 +191,10 @@ export class CoreSplitViewComponent implements OnInit, OnDestroy {
|
||||||
* @param {Boolean} isOn If it fits both panels at the same time.
|
* @param {Boolean} isOn If it fits both panels at the same time.
|
||||||
*/
|
*/
|
||||||
onSplitPaneChanged(isOn: boolean): void {
|
onSplitPaneChanged(isOn: boolean): void {
|
||||||
|
if (this.ignoreSplitChanged) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.isEnabled = isOn;
|
this.isEnabled = isOn;
|
||||||
if (this.masterNav && this.detailNav) {
|
if (this.masterNav && this.detailNav) {
|
||||||
(isOn) ? this.activateSplitView() : this.deactivateSplitView();
|
(isOn) ? this.activateSplitView() : this.deactivateSplitView();
|
||||||
|
@ -228,5 +239,6 @@ export class CoreSplitViewComponent implements OnInit, OnDestroy {
|
||||||
*/
|
*/
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
this.detailsDidEnterSubscription && this.detailsDidEnterSubscription.unsubscribe();
|
this.detailsDidEnterSubscription && this.detailsDidEnterSubscription.unsubscribe();
|
||||||
|
this.audioCaptureSubscription.unsubscribe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Platform } from 'ionic-angular';
|
import { Platform } from 'ionic-angular';
|
||||||
import { MediaFile } from '@ionic-native/media-capture';
|
import { Camera, CameraOptions } from '@ionic-native/camera';
|
||||||
|
import { MediaCapture, MediaFile, CaptureError, CaptureAudioOptions, CaptureVideoOptions } from '@ionic-native/media-capture';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreFileProvider } from '@providers/file';
|
import { CoreFileProvider } from '@providers/file';
|
||||||
import { CoreFilepoolProvider } from '@providers/filepool';
|
import { CoreFilepoolProvider } from '@providers/filepool';
|
||||||
|
@ -25,6 +26,7 @@ import { CoreTextUtilsProvider } from '@providers/utils/text';
|
||||||
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
||||||
import { CoreUtilsProvider } from '@providers/utils/utils';
|
import { CoreUtilsProvider } from '@providers/utils/utils';
|
||||||
import { CoreWSFileUploadOptions } from '@providers/ws';
|
import { CoreWSFileUploadOptions } from '@providers/ws';
|
||||||
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File upload options.
|
* File upload options.
|
||||||
|
@ -47,10 +49,16 @@ export class CoreFileUploaderProvider {
|
||||||
|
|
||||||
protected logger;
|
protected logger;
|
||||||
|
|
||||||
|
// Observers to notify when a media file starts/stops being recorded/selected.
|
||||||
|
onGetPicture: Subject<boolean> = new Subject<boolean>();
|
||||||
|
onAudioCapture: Subject<boolean> = new Subject<boolean>();
|
||||||
|
onVideoCapture: Subject<boolean> = new Subject<boolean>();
|
||||||
|
|
||||||
constructor(logger: CoreLoggerProvider, private fileProvider: CoreFileProvider, private textUtils: CoreTextUtilsProvider,
|
constructor(logger: CoreLoggerProvider, private fileProvider: CoreFileProvider, private textUtils: CoreTextUtilsProvider,
|
||||||
private utils: CoreUtilsProvider, private sitesProvider: CoreSitesProvider, private timeUtils: CoreTimeUtilsProvider,
|
private utils: CoreUtilsProvider, private sitesProvider: CoreSitesProvider, private timeUtils: CoreTimeUtilsProvider,
|
||||||
private mimeUtils: CoreMimetypeUtilsProvider, private filepoolProvider: CoreFilepoolProvider,
|
private mimeUtils: CoreMimetypeUtilsProvider, private filepoolProvider: CoreFilepoolProvider,
|
||||||
private platform: Platform, private translate: TranslateService) {
|
private platform: Platform, private translate: TranslateService, private mediaCapture: MediaCapture,
|
||||||
|
private camera: Camera) {
|
||||||
this.logger = logger.getInstance('CoreFileUploaderProvider');
|
this.logger = logger.getInstance('CoreFileUploaderProvider');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +97,34 @@ export class CoreFileUploaderProvider {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the audio recorder application and return information about captured audio clip files.
|
||||||
|
*
|
||||||
|
* @param {CaptureAudioOptions} options Options.
|
||||||
|
* @return {Promise<MediaFile[] | CaptureError>} Promise resolved with the result.
|
||||||
|
*/
|
||||||
|
captureAudio(options: CaptureAudioOptions): Promise<MediaFile[] | CaptureError> {
|
||||||
|
this.onAudioCapture.next(true);
|
||||||
|
|
||||||
|
return this.mediaCapture.captureAudio(options).finally(() => {
|
||||||
|
this.onAudioCapture.next(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the video recorder application and return information about captured video clip files.
|
||||||
|
*
|
||||||
|
* @param {CaptureVideoOptions} options Options.
|
||||||
|
* @return {Promise<MediaFile[] | CaptureError>} Promise resolved with the result.
|
||||||
|
*/
|
||||||
|
captureVideo(options: CaptureVideoOptions): Promise<MediaFile[] | CaptureError> {
|
||||||
|
this.onVideoCapture.next(true);
|
||||||
|
|
||||||
|
return this.mediaCapture.captureVideo(options).finally(() => {
|
||||||
|
this.onVideoCapture.next(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear temporary attachments to be uploaded.
|
* Clear temporary attachments to be uploaded.
|
||||||
* Attachments already saved in an offline store will NOT be deleted.
|
* Attachments already saved in an offline store will NOT be deleted.
|
||||||
|
@ -194,6 +230,20 @@ export class CoreFileUploaderProvider {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take a picture or video, or load one from the library.
|
||||||
|
*
|
||||||
|
* @param {CameraOptions} options Options.
|
||||||
|
* @return {Promise<any>} Promise resolved with the result.
|
||||||
|
*/
|
||||||
|
getPicture(options: CameraOptions): Promise<any> {
|
||||||
|
this.onGetPicture.next(true);
|
||||||
|
|
||||||
|
return this.camera.getPicture(options).finally(() => {
|
||||||
|
this.onGetPicture.next(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the files stored in a folder, marking them as offline.
|
* Get the files stored in a folder, marking them as offline.
|
||||||
*
|
*
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ActionSheetController, ActionSheet, Platform } from 'ionic-angular';
|
import { ActionSheetController, ActionSheet, Platform } from 'ionic-angular';
|
||||||
import { MediaCapture, MediaFile } from '@ionic-native/media-capture';
|
import { MediaFile } from '@ionic-native/media-capture';
|
||||||
import { Camera, CameraOptions } from '@ionic-native/camera';
|
import { Camera, CameraOptions } from '@ionic-native/camera';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { CoreAppProvider } from '@providers/app';
|
import { CoreAppProvider } from '@providers/app';
|
||||||
|
@ -40,7 +40,7 @@ export class CoreFileUploaderHelperProvider {
|
||||||
private fileUploaderProvider: CoreFileUploaderProvider, private domUtils: CoreDomUtilsProvider,
|
private fileUploaderProvider: CoreFileUploaderProvider, private domUtils: CoreDomUtilsProvider,
|
||||||
private textUtils: CoreTextUtilsProvider, private fileProvider: CoreFileProvider, private utils: CoreUtilsProvider,
|
private textUtils: CoreTextUtilsProvider, private fileProvider: CoreFileProvider, private utils: CoreUtilsProvider,
|
||||||
private actionSheetCtrl: ActionSheetController, private uploaderDelegate: CoreFileUploaderDelegate,
|
private actionSheetCtrl: ActionSheetController, private uploaderDelegate: CoreFileUploaderDelegate,
|
||||||
private mediaCapture: MediaCapture, private camera: Camera, private platform: Platform) {
|
private camera: Camera, private platform: Platform) {
|
||||||
this.logger = logger.getInstance('CoreFileUploaderProvider');
|
this.logger = logger.getInstance('CoreFileUploaderProvider');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,10 +450,10 @@ export class CoreFileUploaderHelperProvider {
|
||||||
* @return {Promise<any>} Promise resolved when done.
|
* @return {Promise<any>} Promise resolved when done.
|
||||||
*/
|
*/
|
||||||
uploadAudioOrVideo(isAudio: boolean, maxSize: number, upload?: boolean, mimetypes?: string[]): Promise<any> {
|
uploadAudioOrVideo(isAudio: boolean, maxSize: number, upload?: boolean, mimetypes?: string[]): Promise<any> {
|
||||||
this.logger.debug('Trying to record a video file');
|
this.logger.debug('Trying to record a ' + (isAudio ? 'audio' : 'video') + ' file');
|
||||||
|
|
||||||
const options = { limit: 1, mimetypes: mimetypes },
|
const options = { limit: 1, mimetypes: mimetypes },
|
||||||
promise = isAudio ? this.mediaCapture.captureAudio(options) : this.mediaCapture.captureVideo(options);
|
promise = isAudio ? this.fileUploaderProvider.captureAudio(options) : this.fileUploaderProvider.captureVideo(options);
|
||||||
|
|
||||||
// The mimetypes param is only for desktop apps, the Cordova plugin doesn't support it.
|
// The mimetypes param is only for desktop apps, the Cordova plugin doesn't support it.
|
||||||
return promise.then((medias) => {
|
return promise.then((medias) => {
|
||||||
|
@ -549,7 +549,7 @@ export class CoreFileUploaderHelperProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.camera.getPicture(options).then((path) => {
|
return this.fileUploaderProvider.getPicture(options).then((path) => {
|
||||||
const error = this.fileUploaderProvider.isInvalidMimetype(mimetypes, path); // Verify that the mimetype is supported.
|
const error = this.fileUploaderProvider.isInvalidMimetype(mimetypes, path); // Verify that the mimetype is supported.
|
||||||
if (error) {
|
if (error) {
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
|
|
Loading…
Reference in New Issue