diff --git a/plugin.xml b/plugin.xml index 82ece87..935d689 100644 --- a/plugin.xml +++ b/plugin.xml @@ -57,6 +57,9 @@ + + + diff --git a/src/ios/classes/AVCamViewController.h b/src/ios/classes/AVCamViewController.h index b587ecb..0ad4aaf 100644 --- a/src/ios/classes/AVCamViewController.h +++ b/src/ios/classes/AVCamViewController.h @@ -1,4 +1,5 @@ #import +#import "CameraParameter.h" @interface AVCamViewController : UIViewController { @@ -9,8 +10,12 @@ CGRect frameBtnThumb; - UIImage *capturedImage; - NSData *capturedImageData; + UIImage *capturedImage; + NSData *capturedImageData; + + BOOL isRotated; + + CGFloat fDist; } @@ -23,9 +28,13 @@ @property (weak, nonatomic) IBOutlet UISlider *opacitySlider; +@property (nonatomic, retain) CameraParameter *params; -- (id) initWithPhoto:(NSString *)sttPhoto WithCallback:(void(^)(UIImage*))callback; + + + +- (id) initWithParams:(CameraParameter *)parameter WithCallback:(void(^)(UIImage*))callback; diff --git a/src/ios/classes/AVCamViewController.m b/src/ios/classes/AVCamViewController.m index cc718ad..50961d6 100644 --- a/src/ios/classes/AVCamViewController.m +++ b/src/ios/classes/AVCamViewController.m @@ -26,7 +26,7 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic @property (nonatomic, weak) IBOutlet UIImageView *imgSmallThumbNail; @property (nonatomic, weak) IBOutlet UIImageView *imgBigThumbNail; -@property (nonatomic, retain) NSString *strPhotoName; + - (IBAction)onTapThumb:(id)sender; - (IBAction)onTapCameraFlash:(id)sender; @@ -54,6 +54,7 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic @end @implementation AVCamViewController +@synthesize params; - (BOOL)isSessionRunningAndDeviceAuthorized { @@ -69,10 +70,9 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic -- (id) initWithPhoto:(NSString *)sttPhoto WithCallback:(void(^)(UIImage*))callback { +- (id) initWithParams:(CameraParameter *)parameter WithCallback:(void(^)(UIImage*))callback { self = [super initWithNibName:nil bundle:nil]; - - self.strPhotoName = sttPhoto; + self.params = parameter; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self = [super initWithNibName:@"AVCamViewController_iPad" bundle:nil]; @@ -92,12 +92,6 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic { [super viewDidLoad]; - UIImage* defaultImage = [UIImage imageNamed:self.strPhotoName]; - -// defaultImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.strPhotoName]]]; - - self.imgBigThumbNail.image = defaultImage; - self.imgSmallThumbNail.image = defaultImage; // Create the AVCaptureSession @@ -121,18 +115,24 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic [self setBackgroundRecordingID:UIBackgroundTaskInvalid]; NSError *error = nil; - - AVCaptureDevice *videoDevice = [AVCamViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack]; - AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; + AVCaptureDevice *videoDevice; + if(params.nDefaultCamera == 0) + { + videoDevice = [AVCamViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack]; + } + else{ + videoDevice = [AVCamViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionFront]; + } + AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; dispatch_async(dispatch_get_main_queue(), ^{ if(![videoDevice hasTorch]) { self.btnFlash.hidden = YES; - self.cameraButton.center = self.btnThumb.center; - self.btnThumb.center = self.btnFlash.center; +// self.cameraButton.center = self.btnThumb.center; +// self.btnThumb.center = self.btnFlash.center; } }); @@ -195,6 +195,8 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic + + } @@ -242,10 +244,11 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic return YES; } + - (BOOL)shouldAutorotate { // Disable autorotation of the interface when recording is in progress. - return ![self lockInterfaceRotation]; + return ![self lockInterfaceRotation]; } - (NSUInteger)supportedInterfaceOrientations @@ -374,6 +377,38 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic AVCaptureDevice *videoDevice = [AVCamViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:preferredPosition]; AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self.btnFlash setImage:[UIImage imageNamed:@"icon_flash_auto.png"] forState:UIControlStateNormal]; + self.btnFlash.tag = 0; + + if ([videoDevice hasTorch] && [videoDevice hasFlash]){ + [videoDevice lockForConfiguration:nil]; + [videoDevice setTorchMode:NO]; + [videoDevice setFlashMode:AVCaptureFlashModeOn]; + [videoDevice unlockForConfiguration]; + + + [self.btnFlash setImage:[UIImage imageNamed:@"icon_flash_auto.png"] forState:UIControlStateNormal]; + self.btnFlash.tag = 0; + self.btnFlash.hidden = NO; + return; + } + if(![videoDevice hasTorch]) + { + self.btnFlash.hidden = YES; +// self.cameraButton.center = self.btnThumb.center; +// self.btnThumb.center = self.btnFlash.center; + } + else if([videoDevice hasTorch] && params.bSwitchFlash) + { + self.btnFlash.hidden = NO; +// self.btnThumb.center = self.cameraButton.center; +// self.cameraButton.center = CGPointMake(self.cameraButton.center.x - fDist, self.cameraButton.center.y); + + } + }); + [[self session] beginConfiguration]; @@ -622,21 +657,14 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic self.opacitySlider.transform = trans; [self.opacitySlider addTarget:self action:@selector(onChangeOpacitySlider) forControlEvents:UIControlEventValueChanged]; - -// CGRect bounds = [[UIScreen mainScreen] bounds]; -// float fX = bounds.size.width - opacitySlider.frame.size.width; -// float fHeight = bounds.size.width * 2 / 3; -// float fY = (bounds.size.height - fHeight) / 2; -// float fWidth = opacitySlider.frame.size.width; -// -// -// -// opacitySlider.frame = CGRectMake(fX, fY, fWidth, fHeight); self.opacitySlider.value = 1; } -(void) initialize { + + fDist = self.btnThumb.center.x - self.cameraButton.center.x; + capturedImage = [[UIImage alloc] init]; capturedImageData = [[NSData alloc] init]; [self addOpacitySlider]; @@ -646,9 +674,81 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic self.saveBgPanel.hidden = YES; self.btnDeletePicture.hidden = YES; self.btnSaveImage.hidden = YES; + + + self.imgBigThumbNail.image = [UIImage imageWithData:self.params.bgImageData]; + self.imgSmallThumbNail.image = [UIImage imageWithData:self.params.bgImageData]; + + self.btnThumb.hidden = !params.bMiniature; + self.btnFlash.hidden = !params.bSwitchFlash; + self.cameraButton.hidden = !params.bSwitchCamera; + self.opacitySlider.hidden = !params.bOpacity; + + if (!params.bgImageData) { + self.imgBigThumbNail.hidden = YES; + self.imgSmallThumbNail.hidden = YES; + } + + AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + if(params.nDefaultFlash == 1) + { + [self.btnFlash setImage:[UIImage imageNamed:@"icon_flash.png"] forState:UIControlStateNormal]; + self.btnFlash.tag = 1; + + if ([device hasTorch] && [device hasFlash]){ + [device lockForConfiguration:nil]; + [device setTorchMode:YES]; + [device setFlashMode:AVCaptureFlashModeOn]; + [device unlockForConfiguration]; + } + } + else{ + [self.btnFlash setImage:[UIImage imageNamed:@"icon_flash_auto.png"] forState:UIControlStateNormal]; + self.btnFlash.tag = 0; + + if ([device hasTorch] && [device hasFlash]){ + [device lockForConfiguration:nil]; + [device setTorchMode:NO]; + [device setFlashMode:AVCaptureFlashModeOn]; + [device unlockForConfiguration]; + } + } + +// if(!params.bSwitchFlash) +// { +// self.cameraButton.center = self.btnThumb.center; +// self.btnThumb.center = self.btnFlash.center; +// } +// if(!params.bMiniature) +// { +// self.cameraButton.center = self.btnThumb.center; +// } + + } +- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation +{ + if(params.bgImageData1) + { + isRotated = !isRotated; + if(isRotated) + { + self.imgBigThumbNail.image = [UIImage imageWithData:params.bgImageData1]; + self.imgSmallThumbNail.image = [UIImage imageWithData:params.bgImageData1]; + } + else{ + self.imgBigThumbNail.image = [UIImage imageWithData:params.bgImageData]; + self.imgSmallThumbNail.image = [UIImage imageWithData:params.bgImageData]; + } + } + +} + + + + - (void) takePicture { [self setLockInterfaceRotation:YES]; @@ -694,7 +794,11 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic [self.view addSubview:activityIndicator]; [activityIndicator startAnimating]; - [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[capturedImage CGImage] orientation:(ALAssetOrientation)[capturedImage imageOrientation] completionBlock:nil]; + if(params.bSaveInGallery) + { + [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[capturedImage CGImage] orientation:(ALAssetOrientation)[capturedImage imageOrientation] completionBlock:nil]; + } + [self.view setUserInteractionEnabled:NO]; _callback([UIImage imageWithData:capturedImageData]); @@ -715,7 +819,6 @@ static void * SessionRunningAndDeviceAuthorizedContext = &SessionRunningAndDevic return; } - AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; CGFloat fMaxZoomFactor = device.activeFormat.videoMaxZoomFactor; if(fMaxZoomFactor > 5) diff --git a/src/ios/classes/CameraParameter.h b/src/ios/classes/CameraParameter.h new file mode 100644 index 0000000..4f60623 --- /dev/null +++ b/src/ios/classes/CameraParameter.h @@ -0,0 +1,31 @@ +#import +#import + +@interface CameraParameter : NSObject +{ + +} + +@property(nonatomic, retain) NSData *bgImageData; +@property(nonatomic, retain) NSData *bgImageData1; +@property(nonatomic, assign) BOOL bMiniature; +@property(nonatomic, assign) BOOL bSaveInGallery; +@property(nonatomic, assign) int nCameraFlashMode; + + +@property(nonatomic, retain) NSString* strCameraBGColor; +@property(nonatomic, retain) NSString* strCameraPressedBG; +@property(nonatomic, assign) CGFloat fQuality; +@property(nonatomic, assign) BOOL bOpacity; + +@property(nonatomic, assign) int nDefaultFlash; +@property(nonatomic, assign) BOOL bSwitchFlash; + +@property(nonatomic, assign) int nDefaultCamera; +@property(nonatomic, assign) BOOL bSwitchCamera; + +-(id) initWithCommand :(CDVInvokedUrlCommand *)command; + + + +@end diff --git a/src/ios/classes/CameraParameter.m b/src/ios/classes/CameraParameter.m new file mode 100644 index 0000000..64edc60 --- /dev/null +++ b/src/ios/classes/CameraParameter.m @@ -0,0 +1,77 @@ +#import "CameraParameter.h" + +@implementation CameraParameter +{ + +} + +@synthesize bgImageData; +@synthesize bgImageData1; +@synthesize bMiniature; +@synthesize bSaveInGallery; +@synthesize nCameraFlashMode; +@synthesize strCameraBGColor; +@synthesize strCameraPressedBG; +@synthesize fQuality; +@synthesize bOpacity; +@synthesize nDefaultFlash; +@synthesize bSwitchFlash; +@synthesize nDefaultCamera; +@synthesize bSwitchCamera; + +-(id) initWithCommand :(CDVInvokedUrlCommand *)command +{ + if(self = [super init]) + { + +// imgBackgroundBase64: null, // background picture in base64. +// imgBackgroundBase64OtherOrientation: null, // background picture in base64 for second orientation. If it's not defined, imgBackgroundBase64 is used. +// miniature: true, // active or disable the miniature function. +// saveInGallery: false, // save or not the picture in gallery. +// cameraBackgroundColor: "#e26760", // color of the camera button. +// cameraBackgroundColorPressed: "#dc453d", // color of the pressed camera button. +// // To get supported color formats, go to see method parseColor : http://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String) +// quality: 100, // picture's quality : range 0 - 100 : http://developer.android.com/reference/android/graphics/Bitmap.html#compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream) (parameter "quality") +// opacity: true, // active or disable the opacity function. +// defaultFlash: this.FlashModes.DISABLE, // default state for flash. See CustomCamera.FlashModes for corrects values. +// switchFlash: true, // active or disable the switch flash button. +// defaultCamera: this.CameraFacings.BACK, // default camera used. See CustomCamera.CameraFacings for corrects values. +// switchCamera: true // active or disable the switch camera button. + + + NSString *strData = [command argumentAtIndex:0]; + if(strData) + { + bgImageData = [[NSData alloc] initWithBase64Encoding:strData]; + } + else{ + bgImageData = nil; + } + + + NSString *strData1 = [command argumentAtIndex:1]; + if(strData1) + { + bgImageData1 = [[NSData alloc] initWithBase64Encoding:strData1]; + } + else{ + bgImageData1 = nil; + } + + + bMiniature = [[command argumentAtIndex:2] boolValue]; + bSaveInGallery = [[command argumentAtIndex:3] boolValue]; + strCameraBGColor = [command argumentAtIndex:4]; + strCameraPressedBG = [command argumentAtIndex:5]; + + fQuality = [[command argumentAtIndex:6] intValue]; + bOpacity = [[command argumentAtIndex:7] boolValue]; + nDefaultFlash = [[command argumentAtIndex:8] intValue]; + bSwitchFlash = [[command argumentAtIndex:9] boolValue]; + nDefaultCamera = [[command argumentAtIndex:10] intValue]; + bSwitchCamera = [[command argumentAtIndex:11] boolValue]; + } + return self; +} + +@end diff --git a/src/ios/classes/CustomCamera.h b/src/ios/classes/CustomCamera.h index da1a111..948f9e0 100644 --- a/src/ios/classes/CustomCamera.h +++ b/src/ios/classes/CustomCamera.h @@ -4,14 +4,36 @@ { CDVInvokedUrlCommand *lastCommand; - NSString *filename; - CGFloat quality; - CGFloat targetWidth; - CGFloat targetHeight; - int nDestType; int nSourceType; - NSString* strPhotoName; + int nDestType; + + + NSData *bgImageData; + NSData *bgImageData1; + BOOL miniature; + BOOL saveInGallery; + int nCameraFlashMode; + + + NSString* clrCameraBG; + NSString* clrCameraPressedBG; + CGFloat quality; + BOOL opacity; + + int defaultFlash; + BOOL switchFlash; + + int defaultCamera; + BOOL switchCamera; + + NSString *filename; + + + + + + } - (void)startCamera:(CDVInvokedUrlCommand*)command; diff --git a/src/ios/classes/CustomCamera.m b/src/ios/classes/CustomCamera.m index b041b42..4017c53 100644 --- a/src/ios/classes/CustomCamera.m +++ b/src/ios/classes/CustomCamera.m @@ -1,23 +1,26 @@ #import "CustomCamera.h" #import "AVCamViewController.h" +#import "CameraParameter.h" @implementation CustomCamera - (void)startCamera:(CDVInvokedUrlCommand*)command { + lastCommand = command; NSString *guid = [[NSUUID new] UUIDString]; NSString *uniqueFileName = [NSString stringWithFormat:@"%@.jpg", guid]; - filename = uniqueFileName; //[command argumentAtIndex:0]; - quality = [[command argumentAtIndex:1] floatValue]; - targetWidth = [[command argumentAtIndex:2] floatValue]; - targetHeight = [[command argumentAtIndex:3] floatValue]; - nDestType = [[command argumentAtIndex:4] intValue]; - nSourceType = [[command argumentAtIndex:5] intValue]; + filename = uniqueFileName; + nSourceType = 1; + nDestType = 0; - strPhotoName = [command argumentAtIndex:0]; + CameraParameter *param = [[CameraParameter alloc] initWithCommand:lastCommand]; + + + +// NSString * strPhotoName = @"sample.png"; if(nSourceType == 0) { UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; @@ -32,13 +35,12 @@ CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Camera is not accessible"]; [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; } else { - AVCamViewController *cameraViewController = [[AVCamViewController alloc] initWithPhoto:strPhotoName WithCallback:^(UIImage *image) { + AVCamViewController *cameraViewController = [[AVCamViewController alloc] initWithParams:param WithCallback:^(UIImage *image) { @autoreleasepool { if(nDestType == 0) { - UIImage *scaledImage = [self scaleImage:image toSize:CGSizeMake(targetWidth, targetHeight)]; - NSData *scaledImageData = UIImageJPEGRepresentation(scaledImage, quality / 100); - NSString* strEncodeData = [scaledImageData base64EncodedStringWithOptions:0]; + NSData *imageData = UIImageJPEGRepresentation(image, quality / 100); + NSString* strEncodeData = [imageData base64EncodedStringWithOptions:0]; CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:strEncodeData]; [self.viewController dismissViewControllerAnimated:YES completion:nil]; @@ -46,10 +48,9 @@ } else { NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:filename]; - UIImage *scaledImage = [self scaleImage:image toSize:CGSizeMake(targetWidth, targetHeight)]; - NSData *scaledImageData = UIImageJPEGRepresentation(scaledImage, quality / 100); + NSData *imageData = UIImageJPEGRepresentation(image, quality / 100); //[self deleteFileWithName:imagePath]; - [scaledImageData writeToFile:imagePath atomically:YES]; + [imageData writeToFile:imagePath atomically:YES]; CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[[NSURL fileURLWithPath:imagePath] absoluteString]]; [self.viewController dismissViewControllerAnimated:YES completion:nil]; @@ -76,10 +77,9 @@ @autoreleasepool { if(nDestType == 0) { - UIImage *scaledImage = [self scaleImage:image toSize:CGSizeMake(targetWidth, targetHeight)]; - NSData *scaledImageData = UIImageJPEGRepresentation(scaledImage, quality / 100); + NSData *imageData = UIImageJPEGRepresentation(image, quality / 100); - NSString* strEncodeData = [scaledImageData base64EncodedStringWithOptions:0]; + NSString* strEncodeData = [imageData base64EncodedStringWithOptions:0]; CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:strEncodeData]; [self.commandDelegate sendPluginResult:result callbackId:lastCommand.callbackId]; @@ -87,10 +87,9 @@ } else { NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:filename]; - UIImage *scaledImage = [self scaleImage:image toSize:CGSizeMake(targetWidth, targetHeight)]; - NSData *scaledImageData = UIImageJPEGRepresentation(scaledImage, quality / 100); + NSData *imageData = UIImageJPEGRepresentation(image, quality / 100); //[self deleteFileWithName:imagePath]; - [scaledImageData writeToFile:imagePath atomically:YES]; + [imageData writeToFile:imagePath atomically:YES]; CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[[NSURL fileURLWithPath:imagePath] absoluteString]]; [self.commandDelegate sendPluginResult:result callbackId:lastCommand.callbackId];