/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import "FBOrientationCommands.h" #import "XCUIDevice+FBRotation.h" #import "FBRouteRequest.h" #import "FBMacros.h" #import "FBSession.h" #import "FBApplication.h" #import "XCUIDevice.h" extern const struct FBWDOrientationValues { FBLiteralString portrait; FBLiteralString landscapeLeft; FBLiteralString landscapeRight; FBLiteralString portraitUpsideDown; } FBWDOrientationValues; const struct FBWDOrientationValues FBWDOrientationValues = { .portrait = @"PORTRAIT", .landscapeLeft = @"LANDSCAPE", .landscapeRight = @"UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT", .portraitUpsideDown = @"UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN", }; @implementation FBOrientationCommands #pragma mark - + (NSArray *)routes { return @[ [[FBRoute GET:@"/orientation"] respondWithTarget:self action:@selector(handleGetOrientation:)], [[FBRoute POST:@"/orientation"] respondWithTarget:self action:@selector(handleSetOrientation:)], [[FBRoute GET:@"/rotation"] respondWithTarget:self action:@selector(handleGetRotation:)], [[FBRoute POST:@"/rotation"] respondWithTarget:self action:@selector(handleSetRotation:)], ]; } #pragma mark - Commands + (id)handleGetOrientation:(FBRouteRequest *)request { FBSession *session = request.session; return FBResponseWithStatus(FBCommandStatusNoError, [self.class interfaceOrientationForApplication:session.application]); } + (id)handleSetOrientation:(FBRouteRequest *)request { FBSession *session = request.session; if ([self.class setDeviceOrientation:request.arguments[@"orientation"] forApplication:session.application]) { return FBResponseWithOK(); } return FBResponseWithStatus(FBCommandStatusRotationNotAllowed, @"Unable To Rotate Device"); } + (id)handleGetRotation:(FBRouteRequest *)request { XCUIDevice *device = [XCUIDevice sharedDevice]; UIDeviceOrientation orientation = device.orientation; return FBResponseWithStatus(FBCommandStatusNoError, device.fb_rotationMapping[@(orientation)]); } + (id)handleSetRotation:(FBRouteRequest *)request { FBSession *session = request.session; if ([self.class setDeviceRotation:request.arguments forApplication:session.application]) { return FBResponseWithOK(); } return FBResponseWithStatus(FBCommandStatusRotationNotAllowed, [NSString stringWithFormat:@"Rotation not supported: %@", request.arguments[@"rotation"]]); } #pragma mark - Helpers + (NSString *)interfaceOrientationForApplication:(FBApplication *)application { NSNumber *orientation = @(application.interfaceOrientation); NSSet *keys = [[self _orientationsMapping] keysOfEntriesPassingTest:^BOOL(id key, NSNumber *obj, BOOL *stop) { return [obj isEqualToNumber:orientation]; }]; if (keys.count == 0) { return @"Unknown orientation"; } return keys.anyObject; } + (BOOL)setDeviceRotation:(NSDictionary *)rotationObj forApplication:(FBApplication *)application { return [[XCUIDevice sharedDevice] fb_setDeviceRotation:rotationObj]; } + (BOOL)setDeviceOrientation:(NSString *)orientation forApplication:(FBApplication *)application { NSNumber *orientationValue = [[self _orientationsMapping] objectForKey:[orientation uppercaseString]]; if (orientationValue == nil) { return NO; } return [[XCUIDevice sharedDevice] fb_setDeviceInterfaceOrientation:orientationValue.integerValue]; } + (NSDictionary *)_orientationsMapping { static NSDictionary *orientationMap; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ orientationMap = @{ FBWDOrientationValues.portrait : @(UIDeviceOrientationPortrait), FBWDOrientationValues.portraitUpsideDown : @(UIDeviceOrientationPortraitUpsideDown), FBWDOrientationValues.landscapeLeft : @(UIDeviceOrientationLandscapeLeft), FBWDOrientationValues.landscapeRight : @(UIDeviceOrientationLandscapeRight), }; }); return orientationMap; } @end