FBSimulatorControl/Commands/FBSimulatorVideoRecordingCommands.m (74 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import "FBSimulatorVideoRecordingCommands.h"
#import <CoreSimulator/SimDevice.h>
#import <CoreSimulator/SimDeviceSet.h>
#import "FBSimulator.h"
#import "FBSimulatorError.h"
#import "FBSimulatorSet.h"
#import "FBFramebuffer.h"
#import "FBSimulatorVideo.h"
#import "FBSimulatorVideoStream.h"
@interface FBSimulatorVideoRecordingCommands ()
@property (nonatomic, weak, readonly) FBSimulator *simulator;
@property (nonatomic, strong, nullable, readwrite) FBSimulatorVideo *video;
@end
@implementation FBSimulatorVideoRecordingCommands
+ (instancetype)commandsWithTarget:(FBSimulator *)target
{
return [[self alloc] initWithSimulator:target];
}
- (instancetype)initWithSimulator:(FBSimulator *)simulator
{
self = [super init];
if (!self) {
return nil;
}
_simulator = simulator;
return self;
}
#pragma mark FBVideoRecordingCommands Implementation
- (FBFuture<id<FBiOSTargetOperation>> *)startRecordingToFile:(NSString *)filePath
{
if (self.video) {
return [[FBSimulatorError
describe:@"Cannot create a new video recording session, one is already active"]
failFuture];
}
return [[FBSimulatorVideoRecordingCommands
videoImplementationForSimulator:self.simulator filePath:filePath]
onQueue:self.simulator.workQueue fmap:^(FBSimulatorVideo *video) {
return [[video
startRecording]
onQueue:self.simulator.workQueue map:^(id _) {
self.video = video;
return video;
}];
}];
}
- (FBFuture<NSNull *> *)stopRecording
{
FBSimulatorVideo *video = self.video;
self.video = nil;
if (!video) {
return [[FBSimulatorError
describeFormat:@"There was no existing video instance for %@", self.simulator]
failFuture];
}
return [video stopRecording];
}
#pragma mark FBSimulatorStreamingCommands
- (FBFuture<FBSimulatorVideoStream *> *)createStreamWithConfiguration:(FBVideoStreamConfiguration *)configuration
{
id<FBControlCoreLogger> logger = self.simulator.logger;
return [[self.simulator
connectToFramebuffer]
onQueue:self.simulator.workQueue map:^ FBSimulatorVideoStream * (FBFramebuffer *framebuffer) {
return [FBSimulatorVideoStream streamWithFramebuffer:framebuffer configuration:configuration logger:logger];
}];
}
#pragma mark Private
+ (FBFuture<FBSimulatorVideo *> *)videoImplementationForSimulator:(FBSimulator *)simulator filePath:(NSString *)filePath
{
FBSimulatorVideo *video = [FBSimulatorVideo videoWithSimctlExecutor:simulator.simctlExecutor filePath:filePath logger:simulator.logger];
return [FBFuture futureWithResult:video];
}
@end