diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d51ba650b..f4dbd10c2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -45,7 +45,6 @@ - diff --git a/package-lock.json b/package-lock.json index 8028058c9..53d433e4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "@capacitor/android": "^8.3.1", "@capacitor/app": "^8.1.0", "@capacitor/browser": "^8.0.3", - "@capacitor/camera": "^8.1.0", + "@capacitor/camera": "^8.2.0", "@capacitor/clipboard": "^8.0.1", "@capacitor/core": "^8.3.1", "@capacitor/device": "^8.0.2", @@ -2437,9 +2437,9 @@ } }, "node_modules/@capacitor/camera": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-8.1.0.tgz", - "integrity": "sha512-ep12soG6c6HbfsEelLIM5Ip/YlWvd6H8pZsXg1gzjLNbTN6P/URUxO0Lv08bHyaDQVJkjLKthF7gaOG++TP4NQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-8.2.0.tgz", + "integrity": "sha512-hYfrT6xpL936qoEkIpJzSnb0fQCaTkOux1cXzGBfH8QLOGqr6gSLiWZlZz/fqMPmMKJMNRBqlTQkj5fuMhVZog==", "license": "MIT", "peerDependencies": { "@capacitor/core": ">=8.0.0" diff --git a/package.json b/package.json index 98bc29498..78a062b24 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@capacitor/android": "^8.3.1", "@capacitor/app": "^8.1.0", "@capacitor/browser": "^8.0.3", - "@capacitor/camera": "^8.1.0", + "@capacitor/camera": "^8.2.0", "@capacitor/clipboard": "^8.0.1", "@capacitor/core": "^8.3.1", "@capacitor/device": "^8.0.2", diff --git a/src/app/modules/registration/components/edit-images/edit-images.component.ts b/src/app/modules/registration/components/edit-images/edit-images.component.ts index 9d845faab..9f676c078 100644 --- a/src/app/modules/registration/components/edit-images/edit-images.component.ts +++ b/src/app/modules/registration/components/edit-images/edit-images.component.ts @@ -15,14 +15,7 @@ import { Platform, ToastController, } from '@ionic/angular/standalone'; -import { - Camera, - CameraResultType, - CameraSource, - GalleryImageOptions, - GalleryPhotos, - ImageOptions, -} from '@capacitor/camera'; +import { Camera, EncodingType, GalleryImageOptions, GalleryPhotos, TakePhotoOptions } from '@capacitor/camera'; import { settings } from '../../../../../settings'; import { AttachmentType, @@ -243,11 +236,11 @@ export class EditImagesComponent implements OnInit { buttons: [ { text: translations['REGISTRATION.GENERAL_COMMENT.TAKE_NEW_PHOTO'], - handler: () => this.getImages(CameraSource.Camera), + handler: () => this.takePhoto(), }, { text: translations['REGISTRATION.GENERAL_COMMENT.CHOOSE_FROM_LIBRARY'], - handler: () => this.getImages(CameraSource.Photos), + handler: () => this.chooseFromGallery(), }, { text: translations['DIALOGS.CANCEL'], @@ -258,14 +251,13 @@ export class EditImagesComponent implements OnInit { actionSheet.present(); } - private getImageOptions(source: CameraSource): ImageOptions { + private getImageOptions(): TakePhotoOptions { return { quality: settings.images.quality, - resultType: CameraResultType.Uri, - source: source, - height: settings.images.size, - width: settings.images.size, + targetHeight: settings.images.size, + targetWidth: settings.images.size, correctOrientation: true, + encodingType: EncodingType.JPEG, // Lagrer appen alltid til bibliotek? // Etter test på iOS: Nei, appen spør faktisk om å få lov til å lagre bilder i biblioteket, @@ -282,7 +274,16 @@ export class EditImagesComponent implements OnInit { // kamerabilder i bilioteket selv om man opprinnelig svarte nei. Dette kan være forvirrende for brukerne. // Bør vi heller ha et valg i innstillingene for dette, kan være irriterende at appen alltid lagrer bilder i // biblioteket? - saveToGallery: source === CameraSource.Camera, + saveToGallery: true, + }; + } + + private getChooseFromGalleryOptions(): GalleryImageOptions { + return { + quality: settings.images.quality, + width: settings.images.size, + height: settings.images.size, + correctOrientation: true, }; } @@ -300,7 +301,7 @@ export class EditImagesComponent implements OnInit { * opp to dialoger der man må velge bilder rett etter hverandre. Men dette skal kun skje første gang man spør om lov * til å hente bilder fra bildebiblioteket, så det bør ikke være noe stort problem. */ - private async getAlbumImageUrls(options: GalleryImageOptions): Promise { + private async getAlbumImageUrls(): Promise { let imageUrls: string[] = []; let galleryPhotos: GalleryPhotos; let permissionState = await Camera.checkPermissions(); @@ -311,6 +312,7 @@ export class EditImagesComponent implements OnInit { } if (['granted', 'limited'].includes(permissionState?.photos)) { this.logger.debug('getAlbumImageUrls pickImages', DEBUG_TAG); + const options = this.getChooseFromGalleryOptions(); galleryPhotos = await Camera.pickImages(options); this.logger.debug('getAlbumImageUrls pickImages result', DEBUG_TAG, { galleryPhotos }); } else { @@ -329,7 +331,7 @@ export class EditImagesComponent implements OnInit { return imageUrls; } - private async takePhotoAndReturnImageUrl(options: ImageOptions): Promise { + private async takePhotoAndReturnImageUrl(options: TakePhotoOptions): Promise { let permissionState = await Camera.checkPermissions(); this.logger.debug('takePhotoAndReturnImageUrl Camera.checkPermissions', DEBUG_TAG, { permissionState }); if (permissionState?.camera !== 'granted') { @@ -337,17 +339,14 @@ export class EditImagesComponent implements OnInit { this.logger.debug('takePhotoAndReturnImageUrl Camera.requestPermissions', DEBUG_TAG, { permissionState }); } if (permissionState?.camera === 'granted') { - const photo = await Camera.getPhoto(options); - this.logger.debug('takePhotoAndReturnImageUrl Camera.getPhoto', DEBUG_TAG, { + const photo = await Camera.takePhoto(options); + this.logger.debug('takePhotoAndReturnImageUrl Camera.takePhoto', DEBUG_TAG, { options, permissionState, - format: photo.format, saved: photo.saved, }); - if (photo) { - if (photo.path && this.checkAndNotifyIfUnsupportedImageFormat([photo.format])) { - return [photo.path]; - } + if (photo?.uri) { + return [photo.uri]; } } else { this.showErrorToast('REGISTRATION.IMAGE_ERROR.CAMERA_PERMISSION_MISSING'); @@ -355,33 +354,51 @@ export class EditImagesComponent implements OnInit { return []; } - private async getImages(source: CameraSource) { - this.logger.debug('getImages', DEBUG_TAG, { source }); + private async takePhoto() { + this.logger.debug('takePhoto', DEBUG_TAG); if (!this.platform.is('hybrid')) { //TODO: Gjøre som vi gjør på web for å hente bilde enten fra kamera eller album return true; } let imageUrls: string[] = []; try { - const options = this.getImageOptions(source); - if (source === CameraSource.Photos) { - imageUrls = await this.getAlbumImageUrls(options); - } else { - imageUrls = await this.takePhotoAndReturnImageUrl(options); + imageUrls = await this.takePhotoAndReturnImageUrl(this.getImageOptions()); + for (const imageUrl of imageUrls) { + this.logger.debug(`Got image url from camera plugin: ${imageUrl}`, DEBUG_TAG); + await this.attachImageFileToDraft(imageUrl, MIME_TYPE); } + } catch (err) { + const hasMessage = err instanceof Error && err.message != null; + if (!hasMessage || !ERRORS_TO_IGNORE.includes(err.message)) { + this.logger.log('Unknown error when taking photo', err, LogLevel.Warning, DEBUG_TAG, imageUrls); + this.showErrorToast('REGISTRATION.IMAGE_ERROR.UNKNOWN'); + } + } + this.logger.debug('takePhoto return', DEBUG_TAG, { nImages: imageUrls.length }); + return true; + } + + private async chooseFromGallery() { + this.logger.debug('chooseFromGallery', DEBUG_TAG); + if (!this.platform.is('hybrid')) { + //TODO: Gjøre som vi gjør på web for å hente bilde enten fra kamera eller album + return true; + } + let imageUrls: string[] = []; + try { + imageUrls = await this.getAlbumImageUrls(); for (const imageUrl of imageUrls) { this.logger.debug(`Got image url from camera plugin: ${imageUrl}`, DEBUG_TAG); await this.attachImageFileToDraft(imageUrl, MIME_TYPE); } } catch (err) { const hasMessage = err instanceof Error && err.message != null; - // we ignore errors we get if user cancels taking photo or gallery selection if (!hasMessage || !ERRORS_TO_IGNORE.includes(err.message)) { - this.logger.log('Unknown error when adding image', err, LogLevel.Warning, DEBUG_TAG, imageUrls); + this.logger.log('Unknown error when choosing from gallery', err, LogLevel.Warning, DEBUG_TAG, imageUrls); this.showErrorToast('REGISTRATION.IMAGE_ERROR.UNKNOWN'); } } - this.logger.debug('getImages return', DEBUG_TAG, { source, nImages: imageUrls.length }); + this.logger.debug('chooseFromGallery return', DEBUG_TAG, { nImages: imageUrls.length }); return true; }