Merge pull request #3564 from NoelDeMartin/MOBILE-2314

MOBILE-2314: Audio recorder improvements
main
Dani Palou 2023-02-23 16:16:01 +01:00 committed by GitHub
commit 2cf259107e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 15 deletions

View File

@ -198,6 +198,7 @@
</config-file>
<config-file parent="/*" target="AndroidManifest.xml">
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
</config-file>
<config-file parent="/*" target="AndroidManifest.xml">
<queries>

View File

@ -7,6 +7,7 @@
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
isolation: isolate;
@ -23,6 +24,8 @@
z-index: 3; // ion-backdrop has z-index 2
transform: translateY(100%);
transition: transform 300ms ease-in;
width: 100%;
max-width: 500px;
}
&.active {

View File

@ -34,6 +34,7 @@ export class CoreSheetModalComponent<T extends CoreModalComponent> implements Af
private element: HTMLElement;
private wrapperElement = new CorePromisedValue<HTMLElement>();
private content?: HTMLElement;
constructor({ nativeElement: element }: ElementRef<HTMLElement>) {
this.element = element;
@ -61,7 +62,7 @@ export class CoreSheetModalComponent<T extends CoreModalComponent> implements Af
*/
async show(): Promise<T> {
const wrapper = await this.wrapperElement;
const element = await AngularFrameworkDelegate.attachViewToDom(wrapper, this.component, this.componentProps ?? {});
this.content = await AngularFrameworkDelegate.attachViewToDom(wrapper, this.component, this.componentProps ?? {});
await CoreUtils.nextTick();
@ -71,7 +72,7 @@ export class CoreSheetModalComponent<T extends CoreModalComponent> implements Af
await CoreUtils.nextTick();
await CoreUtils.wait(300);
const instance = CoreDirectivesRegistry.resolve(element, this.component);
const instance = CoreDirectivesRegistry.resolve(this.content, this.component);
if (!instance) {
throw new Error('Modal not mounted properly');
@ -84,10 +85,13 @@ export class CoreSheetModalComponent<T extends CoreModalComponent> implements Af
* Hide modal.
*/
async hide(): Promise<void> {
const wrapper = await this.wrapperElement;
this.element.classList.remove('active');
await CoreUtils.nextTick();
await CoreUtils.wait(300);
await AngularFrameworkDelegate.removeViewFromDom(wrapper, this.content);
}
}

View File

@ -2,7 +2,12 @@
--background-color: var(--ion-background-color, #fff);
--bars-color: var(--ion-text-color, #000);
position: relative;
canvas {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}

View File

@ -48,17 +48,7 @@ export class CoreFileUploaderAudioHistogramComponent implements AfterViewInit, O
this.context = this.canvas?.getContext('2d');
this.buffer = new Uint8Array(this.analyser.fftSize);
if (this.context && this.canvas) {
const styles = getComputedStyle(this.element);
this.canvas.width = this.canvas.clientWidth;
this.canvas.height = this.canvas.clientHeight;
this.context.fillStyle = styles.getPropertyValue('--background-color');
this.context.lineCap = 'round';
this.context.lineWidth = CoreFileUploaderAudioHistogramComponent.BARS_WIDTH;
this.context.strokeStyle = styles.getPropertyValue('--bars-color');
}
this.updateCanvas(this.element.clientWidth, this.element.clientHeight);
this.draw();
}
@ -77,6 +67,10 @@ export class CoreFileUploaderAudioHistogramComponent implements AfterViewInit, O
return;
}
if (this.canvas.width !== this.element.clientWidth || this.canvas.height !== this.element.clientHeight) {
this.updateCanvas(this.element.clientWidth, this.element.clientHeight);
}
const width = this.canvas.width;
const height = this.canvas.height;
const barsWidth = CoreFileUploaderAudioHistogramComponent.BARS_WIDTH;
@ -157,4 +151,25 @@ export class CoreFileUploaderAudioHistogramComponent implements AfterViewInit, O
}
}
/**
* Set canvas element dimensions and configure styles.
*
* @param width Canvas width.
* @param height Canvas height.
*/
private updateCanvas(width: number, height: number): void {
if (!this.canvas || !this.context) {
return;
}
const styles = getComputedStyle(this.element);
this.canvas.width = width;
this.canvas.height = height;
this.context.fillStyle = styles.getPropertyValue('--background-color');
this.context.lineCap = 'round';
this.context.lineWidth = CoreFileUploaderAudioHistogramComponent.BARS_WIDTH;
this.context.strokeStyle = styles.getPropertyValue('--bars-color');
}
}

View File

@ -86,7 +86,11 @@ export class CoreFileUploaderAudioRecorderComponent extends CoreModalComponent<C
* @inheritdoc
*/
ngOnDestroy(): void {
this.media$.value?.recorder.stop();
const recorder = this.media$.value?.recorder;
if (recorder && recorder.state !== 'inactive') {
recorder.stop();
}
}
/**

View File

@ -76,8 +76,8 @@ export class CoreModalsService {
modal.result.finally(async () => {
await sheetModal.hide();
await AngularFrameworkDelegate.removeViewFromDom(container, element);
element.remove();
viewContainer?.removeAttribute('aria-hidden');
});