Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion android/app/src/main/AndroidManifest.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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'],
Expand All @@ -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,
Expand All @@ -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,
Comment thread
gruble marked this conversation as resolved.
width: settings.images.size,
height: settings.images.size,
correctOrientation: true,
};
}

Expand All @@ -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<string[]> {
private async getAlbumImageUrls(): Promise<string[]> {
let imageUrls: string[] = [];
let galleryPhotos: GalleryPhotos;
let permissionState = await Camera.checkPermissions();
Expand All @@ -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 {
Expand All @@ -329,59 +331,74 @@ export class EditImagesComponent implements OnInit {
return imageUrls;
}

private async takePhotoAndReturnImageUrl(options: ImageOptions): Promise<string[]> {
private async takePhotoAndReturnImageUrl(options: TakePhotoOptions): Promise<string[]> {
let permissionState = await Camera.checkPermissions();
this.logger.debug('takePhotoAndReturnImageUrl Camera.checkPermissions', DEBUG_TAG, { permissionState });
if (permissionState?.camera !== 'granted') {
permissionState = await Camera.requestPermissions({ permissions: ['camera'] });
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');
}
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);
Comment thread
gruble marked this conversation as resolved.
}
} 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;
}

Expand Down
Loading