mirror of
https://github.com/scratchfoundation/scratchjr.git
synced 2024-11-26 00:58:09 -05:00
2da2fad26c
ScratchJr.m: runtime: UI API called from background thread: -[UIView removeFromSuperview] must be used from main thread only IO.m: runtime: UI API called from background thread: -[UIWebView stringByEvaluatingJavaScriptFromString:] must be used from main thread only
142 lines
4.8 KiB
Objective-C
142 lines
4.8 KiB
Objective-C
#import "ScratchJr.h"
|
|
#import "AppDelegate.h"
|
|
|
|
ViewFinder* viewFinder;
|
|
CameraView* cameraView;
|
|
CameraMask* cameraMask;
|
|
NSString *cameraAvailable;
|
|
|
|
AVCaptureVideoPreviewLayer* captureVideoPreviewLayer;
|
|
|
|
@implementation ScratchJr : NSObject
|
|
|
|
NSString *oncomplete;
|
|
|
|
//////////////////////////
|
|
// Init functions
|
|
/////////////////////////
|
|
|
|
|
|
+ (NSString *) hideSplash :(NSString *)body{
|
|
UIImageView* splashScreen = [ViewController splashScreen];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[splashScreen removeFromSuperview];
|
|
});
|
|
return @"1";
|
|
}
|
|
|
|
//////////////////////////
|
|
// camera open and close
|
|
/////////////////////////
|
|
|
|
+ (void)cameraInit{
|
|
viewFinder = [[ViewFinder alloc] init];
|
|
[viewFinder setDelegate:[ViewController self]];
|
|
cameraAvailable = [NSString stringWithFormat:@"%d", [viewFinder setupSession]];
|
|
NSLog(@"camera init %@", cameraAvailable);
|
|
};
|
|
|
|
+ (void)cameraClose{
|
|
if (viewFinder != nil) [viewFinder closeSession];
|
|
}
|
|
|
|
//////////////////////////
|
|
// camera API
|
|
/////////////////////////
|
|
|
|
|
|
+ (NSString *)cameracheck{ return cameraAvailable; }
|
|
|
|
|
|
+ (NSString *)startfeed:(NSString *)body{
|
|
NSData* nsdata = [body dataUsingEncoding:NSUTF8StringEncoding];
|
|
NSDictionary* data = [NSJSONSerialization JSONObjectWithData:nsdata options:NSJSONReadingMutableLeaves error:nil];
|
|
// NSLog(@" data %@", data);
|
|
NSURL *url = [NSURL URLWithString:[data valueForKey:@"image"]];
|
|
NSData *imageData = [NSData dataWithContentsOfURL:url];
|
|
|
|
CGRect r = CGRectMake ([[data valueForKey:@"x"] floatValue],[[data valueForKey:@"y"] floatValue],
|
|
[[data valueForKey:@"width"] floatValue], [[data valueForKey:@"height"] floatValue]);
|
|
|
|
CGRect r2 = CGRectMake ([[data valueForKey:@"mx"] floatValue],[[data valueForKey:@"my"] floatValue],
|
|
[[data valueForKey:@"mw"] floatValue], [[data valueForKey:@"mh"] floatValue]);
|
|
|
|
[self openfeed:r withScale:[[data valueForKey:@"scale"] floatValue] mask:imageData maskrect:r2];
|
|
return @"1";
|
|
};
|
|
|
|
+ (void)openfeed:(CGRect)rect withScale:(float)scale mask:(NSData *)imageData maskrect:(CGRect)rect2{
|
|
UIView* HTML = (UIView*)[ViewController webview];
|
|
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[viewFinder session]];
|
|
cameraView = [[CameraView alloc] initWithFrame:rect withScale:scale];
|
|
[HTML addSubview:cameraView];
|
|
cameraMask = [[CameraMask alloc]initWithFrame:rect2 withScale:scale mask:imageData];
|
|
[HTML addSubview: cameraMask];
|
|
[cameraView switchOrientation:[UIApplication sharedApplication].statusBarOrientation];
|
|
CALayer *viewLayer = [cameraView layer];
|
|
[viewLayer setMasksToBounds:YES];
|
|
CGRect bounds = [cameraView bounds];
|
|
[captureVideoPreviewLayer setFrame:bounds];
|
|
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
|
|
captureVideoPreviewLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
|
|
[viewLayer insertSublayer:captureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
|
|
// Start the session. This is done asychronously since -startRunning doesn't return until the session is running.
|
|
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
[viewFinder setCamera:@"front"];
|
|
[[viewFinder session] startRunning];
|
|
[viewFinder continuousFocusAtPoint:CGPointMake(.5f, .5f)];
|
|
// });
|
|
}
|
|
|
|
+ (NSString *)stopfeed{
|
|
[self closefeed];
|
|
return @"1";
|
|
}
|
|
|
|
+ (NSString *)choosecamera:(NSString *)body{
|
|
if (viewFinder == nil) return @"-1";
|
|
NSArray *args = [body componentsSeparatedByString: @"\n"];
|
|
[cameraView setCameraTo: [args objectAtIndex:0]];
|
|
BOOL res = [viewFinder setCamera:[args objectAtIndex:0]];
|
|
return res ? @"1" : @"-1";
|
|
};
|
|
|
|
+ (NSString *)captureimage:(NSString *)oc{
|
|
[viewFinder captureStillImage];
|
|
oncomplete = oc;
|
|
return @"1";
|
|
}
|
|
|
|
//////////////////////////
|
|
// camera callback
|
|
/////////////////////////
|
|
|
|
+ (void)reportImageError {
|
|
NSString *callback = [NSString stringWithFormat: @"%@('error getting a still');",oncomplete];
|
|
UIWebView *webview = [ViewController webview];
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[webview stringByEvaluatingJavaScriptFromString: callback];
|
|
});
|
|
}
|
|
|
|
+ (void)sendBase64Image:(NSData *)imagedata {
|
|
NSString *base64img = [cameraView getImageBase64:imagedata];
|
|
[self closefeed];
|
|
NSString *callback = [NSString stringWithFormat: @"%@('%@');",oncomplete, base64img];
|
|
UIWebView *webview = [ViewController webview];
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[webview stringByEvaluatingJavaScriptFromString: callback];
|
|
});
|
|
}
|
|
|
|
+ (void)closefeed{
|
|
[[viewFinder session] stopRunning];
|
|
[cameraView removeFromSuperview];
|
|
[cameraMask removeFromSuperview];
|
|
captureVideoPreviewLayer = nil;
|
|
cameraView = nil;
|
|
cameraMask = nil;
|
|
}
|
|
|
|
@end
|