From 7087faccc288be7838f09253e88d4c909d609a3e Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Wed, 2 Mar 2022 18:23:05 +0100 Subject: [PATCH 01/16] implementing audio functionality --- .../app/src/main/assets/capacitor.config.json | 3 +++ package-lock.json | 24 +++++++++---------- package.json | 8 +++---- .../pages/chat/messages/messages.page.html | 15 +++++++----- src/app/pages/chat/messages/messages.page.ts | 18 ++++++++------ .../group-messages/group-messages.page.html | 4 ++-- src/environments/environment.ts | 2 +- 7 files changed, 42 insertions(+), 32 deletions(-) diff --git a/android/app/src/main/assets/capacitor.config.json b/android/app/src/main/assets/capacitor.config.json index 2399c4927..b7bc000c7 100644 --- a/android/app/src/main/assets/capacitor.config.json +++ b/android/app/src/main/assets/capacitor.config.json @@ -16,5 +16,8 @@ "sound" ] } + }, + "server": { + "url": "http://192.168.0.81:8101" } } diff --git a/package-lock.json b/package-lock.json index 4efb94fea..07b5b68ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2194,19 +2194,19 @@ "integrity": "sha512-HCFwOxmK7igEgNm20y+zYi+XQ0OlZYnE4oCaI82TGmA7sehlDpBBKbjmI2Bd8aM09+BXFbAAtq7JCxkEfY8nIg==" }, "@capacitor/filesystem": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-1.0.6.tgz", - "integrity": "sha512-8xqUbDZFGBMhgqoBSn9wEd9OBPdHIRegQ9zCCZcpHNf3FFAIby1ck+aDFnoq+Da49xhD6ks1SKCBSxz/26qWTw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-1.1.0.tgz", + "integrity": "sha512-8O3UuvL8HNUEJvZnmn8yUmvgB1evtXfcF0oxIo3YbSlylqywJwS3JTiuhKmsvSxCdpbTy8IaTsutVh3gZgWbKg==" }, "@capacitor/haptics": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-1.1.3.tgz", - "integrity": "sha512-ui2mY/riK1Y4bxnJKJfclWO61obZ0RHmtErPhpmt4wIEVjG1segYdFop45R2PxyEwoUJgzEsAxnviM/T6k8seQ==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-1.1.4.tgz", + "integrity": "sha512-+pJIb5X7xAcbrWj6rJaV+cwBlv8aFwB1/Ob6EV4atydThuuVSSsAL4hI4ZYlPNOxM6H5s+ZDLj7Pa2os4eFmtg==" }, "@capacitor/ios": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-3.3.0.tgz", - "integrity": "sha512-KImT4hVoQJuAfe01wUYiMLnutMu7PxVCv4c8HVWiW+OuyyOua3lC8wQ5gAauGDugAo6mdM7fVva5a0Vtyhnbdg==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-3.4.1.tgz", + "integrity": "sha512-ycFCyKI8DsgedVg7PW5MpCVgqFuD0PMHQGVfC5ichXc2C/jAATX32EVdEMCB0N3guKoH2k6T3Efwg59+Fcdx2w==" }, "@capacitor/keyboard": { "version": "1.1.3", @@ -6881,9 +6881,9 @@ "dev": true }, "capacitor-voice-recorder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capacitor-voice-recorder/-/capacitor-voice-recorder-2.0.0.tgz", - "integrity": "sha512-YU0tN8+A963sCYjL9du6jbUqOh5w5dJf++8IFBkuV0sDQZuuLaK//1RypJi0MQLifQESZSjhTVWoXTViIthA/w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/capacitor-voice-recorder/-/capacitor-voice-recorder-2.1.0.tgz", + "integrity": "sha512-H0c/sUVD7cduVS5VqutKk00whyqXZUFi56ChRMl9Ke/LBU71HhHwzonPmheT8i9gQmgOaplc3TOpaKqckXb+3A==", "requires": { "get-blob-duration": "^1.2.0" } diff --git a/package.json b/package.json index 00ed7e276..d7cdfbdb9 100644 --- a/package.json +++ b/package.json @@ -39,9 +39,9 @@ "@capacitor/camera": "^1.2.0", "@capacitor/core": "^3.3.2", "@capacitor/device": "^1.1.0", - "@capacitor/filesystem": "^1.0.6", - "@capacitor/haptics": "^1.1.2", - "@capacitor/ios": "3.3.0", + "@capacitor/filesystem": "^1.1.0", + "@capacitor/haptics": "^1.1.4", + "@capacitor/ios": "3.4.1", "@capacitor/keyboard": "^1.1.2", "@capacitor/local-notifications": "^1.1.0", "@capacitor/network": "^1.0.6", @@ -99,7 +99,7 @@ "angular-tag-cloud-module": "^5.2.2", "bootstrap": "^4.5.0", "build": "0.1.4", - "capacitor-voice-recorder": "^2.0.0", + "capacitor-voice-recorder": "^2.1.0", "ci": "^2.1.1", "cordova": "^10.0.0", "cordova-plugin-crop": "^0.4.0", diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index c10e7c24c..cf18ead3b 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -175,16 +175,19 @@ - + + {{audio}} + + - +
@@ -199,7 +202,7 @@ - diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 93b62cb43..60dc2074d 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -20,7 +20,7 @@ import { ChatUserStorage } from 'src/app/store/chat/chat-user.service'; import { environment } from 'src/environments/environment'; import { ThemeService } from 'src/app/services/theme.service' -import { Directory, Encoding, FilesystemDirectory } from '@capacitor/filesystem'; +import { Filesystem, Directory, Encoding } from '@capacitor/filesystem'; import { VoiceRecorder, VoiceRecorderPlugin, RecordingData, GenericResponse, CurrentRecordingStatus } from 'capacitor-voice-recorder'; import { Haptics, ImpactStyle } from '@capacitor/haptics'; import { PreviewCameraPage } from 'src/app/modals/preview-camera/preview-camera.page'; @@ -40,9 +40,9 @@ import { SearchPage } from 'src/app/pages/search/search.page'; import { Storage } from '@ionic/storage'; import { FileToBase64Service } from 'src/app/services/file/file-to-base64.service'; import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; - import {Plugins} from '@capacitor/core'; +/* import {Plugins} from '@capacitor/core'; - const { Filesystem } = Plugins; + const { Filesystem } = Plugins; */ const IMAGE_DIR = 'stored-images'; @@ -144,7 +144,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { console.log('MEMBER', value) }) - //this.loadFiles(); + this.loadFiles(); VoiceRecorder.requestAudioRecordingPermission(); this.getChatMembers(); Filesystem.mkdir({ @@ -197,13 +197,16 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { directory: Directory.Data }).then(result => { console.log(result); - const temp: any[] = result.files.reverse(); + this.storedFileNames = result.files; + /* const temp: any[] = result.files.reverse(); this.storedFileNames = temp[0]; - console.log(this.storedFileNames); + console.log(this.storedFileNames); */ }) } startRecording() { + console.log('Recording'); + if (this.recording) { return; } @@ -212,6 +215,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { } stopRecording() { + console.log('Stop'); if (!this.recording) { return; } @@ -220,7 +224,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.recording = false; if (result.value && result.value.recordDataBase64) { const recordData = result.value.recordDataBase64; - console.log(recordData); + //console.log(recordData); this.myAudio = recordData; const fileName = new Date().getTime() + ".wav"; await Filesystem.writeFile({ diff --git a/src/app/shared/chat/group-messages/group-messages.page.html b/src/app/shared/chat/group-messages/group-messages.page.html index 515af253b..05738dbe3 100644 --- a/src/app/shared/chat/group-messages/group-messages.page.html +++ b/src/app/shared/chat/group-messages/group-messages.page.html @@ -205,14 +205,14 @@ -
+
diff --git a/src/environments/environment.ts b/src/environments/environment.ts index d333a7fd8..6bf93dabc 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, apiURL: 'https://gabinetedigital.dyndns.info/GabineteDigital.Services/V5/api/', - // apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V5/api/', + //apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V5/api/', apiChatUrl: 'https://gabinetedigitalchat.dyndns.info/api/v1/', apiWsChatUrl: 'wss://gabinetedigitalchat.dyndns.info/websocket', //apiChatUrl: 'https://www.tabularium.pt/api/v1/', From d2b311ff1993b160a629e450d04bd4ed44b933fc Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Thu, 3 Mar 2022 10:38:38 +0100 Subject: [PATCH 02/16] save --- android/app/src/main/AndroidManifest.xml.orig | 17 ----------------- .../app/src/main/assets/capacitor.config.json | 3 --- 2 files changed, 20 deletions(-) delete mode 100644 android/app/src/main/AndroidManifest.xml.orig diff --git a/android/app/src/main/AndroidManifest.xml.orig b/android/app/src/main/AndroidManifest.xml.orig deleted file mode 100644 index 66301e3a7..000000000 --- a/android/app/src/main/AndroidManifest.xml.orig +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/assets/capacitor.config.json b/android/app/src/main/assets/capacitor.config.json index b7bc000c7..2399c4927 100644 --- a/android/app/src/main/assets/capacitor.config.json +++ b/android/app/src/main/assets/capacitor.config.json @@ -16,8 +16,5 @@ "sound" ] } - }, - "server": { - "url": "http://192.168.0.81:8101" } } From 932b0b3c0558101622608b04012ab99486e87482 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Fri, 4 Mar 2022 11:52:43 +0100 Subject: [PATCH 03/16] save --- .../pages/chat/messages/messages.page.html | 21 ++++++++------- src/app/pages/chat/messages/messages.page.ts | 26 ++++++++++++------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index cf18ead3b..452809c49 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -175,21 +175,22 @@
- - {{audio}} - - - - + +
diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 60dc2074d..05cd38bb7 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -44,9 +44,6 @@ import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; const { Filesystem } = Plugins; */ - -const IMAGE_DIR = 'stored-images'; - @Component({ selector: 'app-messages', templateUrl: './messages.page.html', @@ -87,6 +84,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { recording = false; storedFileNames = []; + lastAudioRecorded = ''; durationDisplay = ''; duration = 0; @ViewChild('recordbtn', { read: ElementRef }) recordBtn: ElementRef; @@ -143,15 +141,14 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.wsChatMethodsService.getUserOfRoom(this.roomId).then((value) => { console.log('MEMBER', value) }) - this.loadFiles(); VoiceRecorder.requestAudioRecordingPermission(); this.getChatMembers(); - Filesystem.mkdir({ + /* Filesystem.mkdir({ path: IMAGE_DIR, directory: Directory.Data, recursive: true - }); + }); */ } ngAfterViewInit() { @@ -170,6 +167,9 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { onEnd: ev => { Haptics.impact({ style: ImpactStyle.Light }) this.stopRecording(); + setTimeout(() => { + this.loadFiles(); + }, 500); } }, true); longpress.enable(); @@ -197,10 +197,8 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { directory: Directory.Data }).then(result => { console.log(result); - this.storedFileNames = result.files; - /* const temp: any[] = result.files.reverse(); - this.storedFileNames = temp[0]; - console.log(this.storedFileNames); */ + this.storedFileNames = result.files.reverse(); + this.lastAudioRecorded = this.storedFileNames[0]; }) } @@ -234,7 +232,15 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }) } }) + } + async deleteRecording(fileName){ + await Filesystem.deleteFile({ + directory: Directory.Data, + path: fileName + }); + this.lastAudioRecorded = ''; + this.loadFiles(); } async playFile(fileName?: any) { From 0c9d5275a6887f9e7614501f4667134baef18939 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Fri, 4 Mar 2022 14:51:08 +0100 Subject: [PATCH 04/16] save --- .../pages/chat/messages/messages.page.html | 15 +++- src/app/pages/chat/messages/messages.page.ts | 80 +++++++++++++++++++ src/app/shared/chat/messages/messages.page.ts | 4 +- 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 452809c49..0572a94fb 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -194,16 +194,19 @@
- +
- + - @@ -213,7 +216,11 @@ - + diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 05cd38bb7..b1048a041 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -366,6 +366,86 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.wsChatMethodsService.getDmRoom(this.roomId).send({}) } + async sendAudio(fileName) { + + const roomId = this.roomId + + /* const file: any = await this.fileService.getFileFromDevice(audio); + console.log('Add file', file) + + const blob = new Blob([file],{type: file.type}) + console.log('Add file', blob) + + const formData = new FormData(); + formData.append("blobFile", blob); + + let pdfBase64; + this.blobToBase64(blob).then(res => { + console.log('Base64 pdf', res); + this.wsChatMethodsService.getDmRoom(roomId).send({ + file: { + "type": file.type, + "guid": '', + }, + attachments: [{ + "title": file.name , + "title_link": res, + "title_link_download": true, + "type": "file" + }], + temporaryData: formData + }) + }); */ + + const audioFile = await Filesystem.readFile({ + path: fileName, + directory: Directory.Data + }) + console.log(audioFile); + const base64sound = audioFile.data; + + const audioRef = new Audio(`data:audio/aac;base64,${base64sound}`) + + console.log(audioRef); + + //Converting base64 to blob + const base64 = await fetch(base64sound); + const base64Response = await fetch(`data:audio/aac;base64,${base64sound}`); + const blob = await base64Response.blob(); + + console.log(blob); + + const formData = new FormData(); + formData.append("blobFile", blob); + + this.wsChatMethodsService.getDmRoom(roomId).send({ + file: { + "type": "audio/aac", + "guid": '', + }, + attachments: [{ + "title": fileName , + "title_link": audioRef, + "title_link_download": true, + "type": "file" + }], + temporaryData: formData + }) + + alert('OK') + + } + + blobToBase64 = blob => { + const reader = new FileReader(); + reader.readAsDataURL(blob); + return new Promise(resolve => { + reader.onloadend = () => { + resolve(reader.result); + }; + }); + }; + viewDocument(msg: any, url?: string) { console.log(msg) if (msg.attachments.type == "application/webtrix") { diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index 2c768a2c7..9a3d8ef8a 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -751,7 +751,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy } else { this.downloadFile = btoa(new Uint8Array(event.body).reduce((data, byte) => data + String.fromCharCode(byte), '')); } - + msg.file = { guid: msg.file.guid, @@ -799,7 +799,7 @@ console.log(msg); }); modal.present(); } - + } } From 9fcd6f67c5dd676f1ee143232e6d06ff93f121d3 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Fri, 4 Mar 2022 18:46:56 +0100 Subject: [PATCH 05/16] save --- .../pages/chat/messages/messages.page.html | 48 +++++++++---------- .../pages/chat/messages/messages.page.scss | 5 +- src/app/pages/chat/messages/messages.page.ts | 17 +++++-- src/app/services/auth.service.ts | 2 + src/app/services/chat/ws-chat.service.ts | 2 +- .../theme/default/icons-chat-record-audio.svg | 8 ++++ .../theme/gov/icons-chat-record-audio.svg | 8 ++++ .../theme/gov/icons-chat-record-audio.svg | 4 ++ 8 files changed, 60 insertions(+), 34 deletions(-) create mode 100644 src/assets/icon/theme/default/icons-chat-record-audio.svg create mode 100644 src/assets/icon/theme/gov/icons-chat-record-audio.svg create mode 100644 src/assets/images/theme/gov/icons-chat-record-audio.svg diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 0572a94fb..461fea837 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -174,49 +174,45 @@ está a escrever ...
- - {{lastAudioRecorded}} - - - - - + +
+ {{durationDisplay}} + {{lastAudioRecorded}} +
+
- - -
-
- - - -
- - diff --git a/src/app/pages/chat/messages/messages.page.scss b/src/app/pages/chat/messages/messages.page.scss index c05d06a67..2e8e61210 100644 --- a/src/app/pages/chat/messages/messages.page.scss +++ b/src/app/pages/chat/messages/messages.page.scss @@ -228,7 +228,7 @@ justify-content: center; justify-content: space-evenly; align-items: center; - + border: 1px solid red; } .chat-icon-options{ @@ -251,6 +251,7 @@ padding-left: 15px; align-items: center; overflow: auto; + border: 1px solid red; ion-textarea{ margin: 0 !important; @@ -319,4 +320,4 @@ display: block; .typing ngx-letters-avatar { padding-right: 5px; -} \ No newline at end of file +} diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index b1048a041..515a7cacb 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -83,6 +83,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { LoadedDocument: any = null; recording = false; + allowTyping = true; storedFileNames = []; lastAudioRecorded = ''; durationDisplay = ''; @@ -162,14 +163,14 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { onStart: ev => { Haptics.impact({ style: ImpactStyle.Light }) this.startRecording(); - this.calculateDuration(); + //this.calculateDuration(); }, onEnd: ev => { Haptics.impact({ style: ImpactStyle.Light }) this.stopRecording(); - setTimeout(() => { + /* setTimeout(() => { this.loadFiles(); - }, 500); + }, 500); */ } }, true); longpress.enable(); @@ -210,9 +211,11 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { } this.recording = true; VoiceRecorder.startRecording(); + this.calculateDuration(); } stopRecording() { + this.allowTyping = false; console.log('Stop'); if (!this.recording) { return; @@ -232,6 +235,9 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }) } }) + setTimeout(() => { + this.loadFiles(); + }, 500); } async deleteRecording(fileName){ @@ -239,6 +245,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { directory: Directory.Data, path: fileName }); + this.allowTyping = true; this.lastAudioRecorded = ''; this.loadFiles(); } @@ -421,11 +428,11 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { this.wsChatMethodsService.getDmRoom(roomId).send({ file: { "type": "audio/aac", - "guid": '', + /* "guid": '', */ }, attachments: [{ "title": fileName , - "title_link": audioRef, + "title_link": base64Response.url, "title_link_download": true, "type": "file" }], diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index 7ab471218..4ceb10632 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -167,6 +167,8 @@ export class AuthService { message.file.guid = guid.path await this.storage.set(guid.path, message.file.image_url).then(() => { console.log('add picture to chat IMAGE SAVED') + console.log(message.attachments); + message.getFileFromDb() }); diff --git a/src/app/services/chat/ws-chat.service.ts b/src/app/services/chat/ws-chat.service.ts index f0f1911bc..bea72e7de 100644 --- a/src/app/services/chat/ws-chat.service.ts +++ b/src/app/services/chat/ws-chat.service.ts @@ -703,7 +703,7 @@ updateRoomEventss(roomId, collection:string, funx: Function, ) { this.wsMsgQueue[requestId] = {message, requestId, loginRequired} } else { let messageStr = JSON.stringify(message) - // console.log('messageStr', messageStr) + console.log('messageStr', messageStr) this.socket.send(messageStr) } diff --git a/src/assets/icon/theme/default/icons-chat-record-audio.svg b/src/assets/icon/theme/default/icons-chat-record-audio.svg new file mode 100644 index 000000000..867be5447 --- /dev/null +++ b/src/assets/icon/theme/default/icons-chat-record-audio.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icon/theme/gov/icons-chat-record-audio.svg b/src/assets/icon/theme/gov/icons-chat-record-audio.svg new file mode 100644 index 000000000..6e90079a1 --- /dev/null +++ b/src/assets/icon/theme/gov/icons-chat-record-audio.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/images/theme/gov/icons-chat-record-audio.svg b/src/assets/images/theme/gov/icons-chat-record-audio.svg new file mode 100644 index 000000000..48eb285e7 --- /dev/null +++ b/src/assets/images/theme/gov/icons-chat-record-audio.svg @@ -0,0 +1,4 @@ + + + + From e73d87988ab5fdd1dd3cad7487a9e06de66d0661 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Wed, 9 Mar 2022 09:12:50 +0100 Subject: [PATCH 06/16] save --- src/app/pages/chat/messages/messages.page.html | 10 ++++++---- src/app/pages/chat/messages/messages.page.scss | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 461fea837..c714f1282 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -195,7 +195,7 @@
-
+
@@ -203,16 +203,18 @@ -->
- +
- - diff --git a/src/app/pages/chat/messages/messages.page.scss b/src/app/pages/chat/messages/messages.page.scss index 2e8e61210..1aa3f3ce8 100644 --- a/src/app/pages/chat/messages/messages.page.scss +++ b/src/app/pages/chat/messages/messages.page.scss @@ -251,7 +251,6 @@ padding-left: 15px; align-items: center; overflow: auto; - border: 1px solid red; ion-textarea{ margin: 0 !important; From 00afc6d918694cc675375b92f3506449914d088a Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Wed, 9 Mar 2022 15:10:40 +0100 Subject: [PATCH 07/16] save --- package-lock.json | 20 ++++++++++++++++++++ package.json | 2 ++ src/app/app.module.ts | 3 +++ src/app/pages/chat/messages/messages.page.ts | 8 ++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07b5b68ce..08f2873fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3044,6 +3044,21 @@ } } }, + "@ionic-native/file-opener": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-5.36.0.tgz", + "integrity": "sha512-UKp3pbqvQXsAtLMJ5JE+KcTMxpjSZMFebf6nvy/KJvwy85JGIaCV4ZVM/H9CFUrHJMWBH6wDbY+WPygnsrl4Yg==", + "requires": { + "@types/cordova": "^0.0.34" + }, + "dependencies": { + "@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + } + } + }, "@ionic-native/file-path": { "version": "5.36.0", "resolved": "https://registry.npmjs.org/@ionic-native/file-path/-/file-path-5.36.0.tgz", @@ -8072,6 +8087,11 @@ "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==", "dev": true }, + "cordova-plugin-file-opener2": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-3.0.5.tgz", + "integrity": "sha512-tjLHDamH5+y0bJZYVe2967L1S4R8tL4Y0rJUzJGoxsyiw3FUlrJNS199POOpzZZ6Xhlntn9a2o7+84r1dMN21A==" + }, "cordova-plugin-filepath": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/cordova-plugin-filepath/-/cordova-plugin-filepath-1.6.0.tgz", diff --git a/package.json b/package.json index d7cdfbdb9..77e9e6137 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@ionic-native/document-viewer": "^5.36.0", "@ionic-native/fcm": "^5.36.0", "@ionic-native/file": "^5.36.0", + "@ionic-native/file-opener": "^5.36.0", "@ionic-native/file-path": "^5.30.0", "@ionic-native/fingerprint-aio": "^4.20.0", "@ionic-native/http": "^5.31.1", @@ -104,6 +105,7 @@ "cordova": "^10.0.0", "cordova-plugin-crop": "^0.4.0", "cordova-plugin-dbcopy": "git+https://github.com/an-rahulpandey/cordova-plugin-dbcopy.git", + "cordova-plugin-file-opener2": "^3.0.5", "cordova-plugin-filepath": "^1.5.8", "cordova-plugin-okhttp": "^2.0.0", "cordova-plugin-screen-orientation": "^3.0.2", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ed93e7c49..056b7423d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -69,6 +69,8 @@ import {NgxImageCompressService} from 'ngx-image-compress'; import { CustomImageCachePageRoutingModule } from './services/file/custom-image-cache/custom-image-cache-routing.module'; import { IonicImageLoaderComponent, IonicImageLoaderModule } from 'ionic-image-loader-v5'; +import { FileOpener } from '@ionic-native/file-opener/ngx'; + /* import { FCM } from '@ionic-native/fcm/ngx'; import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ //import { FCM } from 'cordova-plugin-fcm-with-dependecy-updated/ionic/ngx'; @@ -144,6 +146,7 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ StreamingMedia, PhotoViewer, NgxImageCompressService, + FileOpener ], bootstrap: [AppComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 515a7cacb..43afaf0a6 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -40,6 +40,7 @@ import { SearchPage } from 'src/app/pages/search/search.page'; import { Storage } from '@ionic/storage'; import { FileToBase64Service } from 'src/app/services/file/file-to-base64.service'; import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; +import { FileOpener } from '@ionic-native/file-opener/ngx'; /* import {Plugins} from '@capacitor/core'; const { Filesystem } = Plugins; */ @@ -117,6 +118,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { private processesService: ProcessesService, private storage: Storage, private fileToBase64Service: FileToBase64Service, + private fileOpener: FileOpener, ) { this.loggedUser = authService.ValidatedUserChat['data']; this.roomId = this.navParams.get('roomId'); @@ -258,9 +260,11 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { console.log(audioFile); const base64sound = audioFile.data; - const audioRef = new Audio(`data:audio/aac;base64,${base64sound}`) + this.fileOpener.open('C:/Users/tiago.kayaya/Downloads/Audiorecord','audio/wav') + + /* const audioRef = new Audio(`data:audio/aac;base64,${base64sound}`) audioRef.oncanplaythrough = () => audioRef.play(); - audioRef.load(); + audioRef.load(); */ } From 43b7e4ade0c323025d87925b3922708601211c07 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Thu, 10 Mar 2022 16:26:43 +0100 Subject: [PATCH 08/16] save --- .../pages/chat/messages/messages.page.html | 9 +++ src/app/pages/chat/messages/messages.page.ts | 65 +++++++++--------- src/assets/audio/Audiorecord.mp3 | Bin 0 -> 28212 bytes 3 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 src/assets/audio/Audiorecord.mp3 diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index c714f1282..3b9b95fb8 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -180,6 +180,15 @@ + + + +
{{durationDisplay}} {{lastAudioRecorded}} diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts index 43afaf0a6..91371c520 100644 --- a/src/app/pages/chat/messages/messages.page.ts +++ b/src/app/pages/chat/messages/messages.page.ts @@ -87,6 +87,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { allowTyping = true; storedFileNames = []; lastAudioRecorded = ''; + audioRecorded:any = ""; durationDisplay = ''; duration = 0; @ViewChild('recordbtn', { read: ElementRef }) recordBtn: ElementRef; @@ -237,7 +238,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { }) } }) - setTimeout(() => { + setTimeout(async () => { this.loadFiles(); }, 500); } @@ -260,11 +261,40 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { console.log(audioFile); const base64sound = audioFile.data; - this.fileOpener.open('C:/Users/tiago.kayaya/Downloads/Audiorecord','audio/wav') + //this.audioRecorded = `data:audio/aac;base64,${base64sound}`; - /* const audioRef = new Audio(`data:audio/aac;base64,${base64sound}`) + console.log(this.audioRecorded); + + //this.fileOpener.open('C:/Users/tiago.kayaya/Downloads/Audiorecord','audio/wav') + + const audioRef = new Audio(`data:audio/aac;base64,${base64sound}`) + //this.audioRecorded = audioRef; + //console.log(audioRef); audioRef.oncanplaythrough = () => audioRef.play(); - audioRef.load(); */ + audioRef.load(); + + //this.getFile(fileName); + + } + + async getFile(fileName?:any){ + const audioFile = await Filesystem.readFile({ + path: fileName, + directory: Directory.Data + }) + //console.log(audioFile); + const base64sound = audioFile.data; + + //Converting base64 to blob + const base64 = await fetch(base64sound); + //console.log(base64); + + const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`); + //console.log(base64Response); + + this.audioRecorded = base64Response.url; + + console.log(this.audioRecorded); } @@ -381,33 +411,6 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { const roomId = this.roomId - /* const file: any = await this.fileService.getFileFromDevice(audio); - console.log('Add file', file) - - const blob = new Blob([file],{type: file.type}) - console.log('Add file', blob) - - const formData = new FormData(); - formData.append("blobFile", blob); - - let pdfBase64; - this.blobToBase64(blob).then(res => { - console.log('Base64 pdf', res); - this.wsChatMethodsService.getDmRoom(roomId).send({ - file: { - "type": file.type, - "guid": '', - }, - attachments: [{ - "title": file.name , - "title_link": res, - "title_link_download": true, - "type": "file" - }], - temporaryData: formData - }) - }); */ - const audioFile = await Filesystem.readFile({ path: fileName, directory: Directory.Data diff --git a/src/assets/audio/Audiorecord.mp3 b/src/assets/audio/Audiorecord.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7f06c568bcdc9f70029322a51feb554735d86ed3 GIT binary patch literal 28212 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 literal 0 HcmV?d00001 From 218f2d597f4ea060ae113660b1851ae87786fe59 Mon Sep 17 00:00:00 2001 From: "tiago.kayaya" Date: Mon, 14 Mar 2022 08:09:33 +0100 Subject: [PATCH 09/16] save, work in progress! --- android/app/capacitor.build.gradle | 1 + android/app/src/main/res/xml/config.xml | 4 ++ src/app/app.module.ts | 3 -- .../pages/chat/messages/messages.module.ts | 4 +- .../pages/chat/messages/messages.page.html | 19 +++---- .../pages/chat/messages/messages.page.scss | 1 - src/app/pages/chat/messages/messages.page.ts | 31 ++++++++---- src/app/pipes/pipes.module.ts | 5 +- src/app/pipes/safehtml.pipe.spec.ts | 8 +++ src/app/pipes/safehtml.pipe.ts | 14 ++++++ src/app/services/chat/room.service.ts | 50 +++++++++---------- src/plugin/player.js | 19 +++++++ 12 files changed, 109 insertions(+), 50 deletions(-) create mode 100644 src/app/pipes/safehtml.pipe.spec.ts create mode 100644 src/app/pipes/safehtml.pipe.ts create mode 100644 src/plugin/player.js diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 0e5e194e7..a29486a74 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -25,6 +25,7 @@ dependencies { implementation project(':capacitor-storage') implementation project(':capacitor-voice-recorder') implementation "com.soundcloud.android:android-crop:1.0.0@aar" + implementation "com.android.support:support-v4:27.+" implementation "com.squareup.okhttp:okhttp-urlconnection:2+" } apply from: "../../node_modules/com-sarriaroman-photoviewer/src/android/photoviewer.gradle" diff --git a/android/app/src/main/res/xml/config.xml b/android/app/src/main/res/xml/config.xml index ce530bfc9..7720d5031 100644 --- a/android/app/src/main/res/xml/config.xml +++ b/android/app/src/main/res/xml/config.xml @@ -10,6 +10,10 @@ + + + + diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 056b7423d..ed93e7c49 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -69,8 +69,6 @@ import {NgxImageCompressService} from 'ngx-image-compress'; import { CustomImageCachePageRoutingModule } from './services/file/custom-image-cache/custom-image-cache-routing.module'; import { IonicImageLoaderComponent, IonicImageLoaderModule } from 'ionic-image-loader-v5'; -import { FileOpener } from '@ionic-native/file-opener/ngx'; - /* import { FCM } from '@ionic-native/fcm/ngx'; import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ //import { FCM } from 'cordova-plugin-fcm-with-dependecy-updated/ionic/ngx'; @@ -146,7 +144,6 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ StreamingMedia, PhotoViewer, NgxImageCompressService, - FileOpener ], bootstrap: [AppComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/src/app/pages/chat/messages/messages.module.ts b/src/app/pages/chat/messages/messages.module.ts index 98fb7cae3..83d0d168c 100644 --- a/src/app/pages/chat/messages/messages.module.ts +++ b/src/app/pages/chat/messages/messages.module.ts @@ -12,6 +12,7 @@ import { BtnModalDismissPage } from 'src/app/shared/btn-modal-dismiss/btn-modal- import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { MatMenuModule } from '@angular/material/menu'; import { LettersAvatarModule } from "ngx-letters-avatar"; +import { PipesModule } from 'src/app/pipes/pipes.module'; @NgModule({ imports: [ @@ -21,7 +22,8 @@ import { LettersAvatarModule } from "ngx-letters-avatar"; FontAwesomeModule, MessagesPageRoutingModule, MatMenuModule, - LettersAvatarModule + LettersAvatarModule, + PipesModule, ], declarations: [MessagesPage] }) diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html index 3b9b95fb8..15646ae73 100644 --- a/src/app/pages/chat/messages/messages.page.html +++ b/src/app/pages/chat/messages/messages.page.html @@ -87,7 +87,7 @@
-
+
@@ -98,11 +98,14 @@ {{file.title}}
+
+ +
{{file.description}} • - {{msg.displayType}} + {{msg.displayType}}
@@ -180,18 +183,16 @@ - - -