/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ #import "YoikScreenOrientation.h" #import "CDVViewController+UpdateSupportedOrientations.h" @implementation YoikScreenOrientation -(void)screenOrientation:(CDVInvokedUrlCommand *)command { [self.commandDelegate runInBackground:^{ if(self.originalSupportedOrientations == nil) { self.originalSupportedOrientations = [self.viewController valueForKey:@"supportedOrientations"]; } NSArray* arguments = command.arguments; NSString* orientationIn = [arguments objectAtIndex:1]; if ([orientationIn isEqual: @"unlocked"]) { [(CDVViewController*)self.viewController updateSupportedOrientations:self.originalSupportedOrientations]; self.originalSupportedOrientations = nil; return; } // grab the device orientation so we can pass it back to the js side. NSString *orientation; switch ([[UIDevice currentDevice] orientation]) { case UIDeviceOrientationLandscapeLeft: orientation = @"landscape-secondary"; break; case UIDeviceOrientationLandscapeRight: orientation = @"landscape-primary"; break; case UIDeviceOrientationPortrait: orientation = @"portrait-primary"; break; case UIDeviceOrientationPortraitUpsideDown: orientation = @"portrait-secondary"; break; default: orientation = @"portait"; break; } // we send the result prior to the view controller presentation so that the JS side // is ready for the unlock call. CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{@"device":orientation}]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; // SEE https://github.com/Adlotto/cordova-plugin-recheck-screen-orientation // HACK: Force rotate by changing the view hierarchy. ForcedViewController *vc = [[ForcedViewController alloc] init]; vc.calledWith = orientationIn; // backgound should be transparent as it is briefly visible // prior to closing. vc.view.backgroundColor = [UIColor clearColor]; // vc.view.alpha = 0.0; vc.view.opaque = YES; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 // This stops us getting the black application background flash, iOS8 vc.modalPresentationStyle = UIModalPresentationOverFullScreen; #endif dispatch_async(dispatch_get_main_queue(), ^{ [self.viewController presentViewController:vc animated:NO completion:nil]; }); }]; } @end @implementation ForcedViewController -(void) viewDidAppear:(BOOL)animated { CDVViewController *presenter = (CDVViewController*)self.presentingViewController; if ([self.calledWith rangeOfString:@"portrait"].location != NSNotFound) { [presenter updateSupportedOrientations:@[[NSNumber numberWithInt:UIInterfaceOrientationPortrait]]]; } else if([self.calledWith rangeOfString:@"landscape"].location != NSNotFound) { [presenter updateSupportedOrientations:@[[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft], [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]]]; } else { [presenter updateSupportedOrientations:@[[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft], [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight], [NSNumber numberWithInt:UIInterfaceOrientationPortrait]]]; } [presenter dismissViewControllerAnimated:NO completion:nil]; } - (UIInterfaceOrientationMask) supportedInterfaceOrientations { if ([self.calledWith rangeOfString:@"portrait"].location != NSNotFound) { return UIInterfaceOrientationMaskPortrait; } else if([self.calledWith rangeOfString:@"landscape"].location != NSNotFound) { return UIInterfaceOrientationMaskLandscape; } return UIInterfaceOrientationMaskAll; } @end