From 45fb3a50037175979f54ac498062d75f34658f94 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 20 Apr 2023 16:27:02 -0700 Subject: [PATCH 01/19] remove seek accuracy --- .../ios/Classes/FLTVideoPlayerPlugin.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 586d6555bef..47dbd28caa7 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -421,8 +421,6 @@ - (int64_t)duration { - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { [_player seekToTime:CMTimeMake(location, 1000) - toleranceBefore:kCMTimeZero - toleranceAfter:kCMTimeZero completionHandler:completionHandler]; } From 426c067a30059d76c8a9902e0533a03dd2f10271 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 20 Apr 2023 16:53:28 -0700 Subject: [PATCH 02/19] minimal tolerance --- .../ios/Classes/FLTVideoPlayerPlugin.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 47dbd28caa7..c3639c68b25 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -421,6 +421,8 @@ - (int64_t)duration { - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { [_player seekToTime:CMTimeMake(location, 1000) + toleranceBefore:CMTimeMake(1, 1000) + toleranceAfter:CMTimeMake(1, 1000) completionHandler:completionHandler]; } From 7d167e22b9d62efb88b4653e8f4df7b7bc7ad7a8 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 20 Apr 2023 16:57:40 -0700 Subject: [PATCH 03/19] tolerance only when seeking to duration --- .../ios/Classes/FLTVideoPlayerPlugin.m | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index c3639c68b25..9948fe8d8a2 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -420,9 +420,19 @@ - (int64_t)duration { } - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { - [_player seekToTime:CMTimeMake(location, 1000) - toleranceBefore:CMTimeMake(1, 1000) - toleranceAfter:CMTimeMake(1, 1000) + CMTime locationCMT = CMTimeMake(location, 1000); + CMTimeValue duration = _player.currentItem.asset.duration.value; + CMTimeValue locationCM = locationCMT.value; + if (duration == locationCM) { + [_player seekToTime:_player.currentItem.currentTime + toleranceBefore:CMTimeMake(1, 1000) + toleranceAfter:CMTimeMake(1, 1000) + completionHandler:completionHandler]; + return; + } + [_player seekToTime:locationCMT + toleranceBefore:kCMTimeZero + toleranceAfter:kCMTimeZero completionHandler:completionHandler]; } From b78ae9be7e60d96d2e2c4462f481230071c7121c Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 20 Apr 2023 17:03:28 -0700 Subject: [PATCH 04/19] format --- .../ios/Classes/FLTVideoPlayerPlugin.m | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 9948fe8d8a2..fdfb9b8d180 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -420,16 +420,16 @@ - (int64_t)duration { } - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { - CMTime locationCMT = CMTimeMake(location, 1000); - CMTimeValue duration = _player.currentItem.asset.duration.value; - CMTimeValue locationCM = locationCMT.value; - if (duration == locationCM) { - [_player seekToTime:_player.currentItem.currentTime - toleranceBefore:CMTimeMake(1, 1000) - toleranceAfter:CMTimeMake(1, 1000) - completionHandler:completionHandler]; - return; - } + CMTime locationCMT = CMTimeMake(location, 1000); + CMTimeValue duration = _player.currentItem.asset.duration.value; + CMTimeValue locationCM = locationCMT.value; + if (duration == locationCM) { + [_player seekToTime:_player.currentItem.currentTime + toleranceBefore:CMTimeMake(1, 1000) + toleranceAfter:CMTimeMake(1, 1000) + completionHandler:completionHandler]; + return; + } [_player seekToTime:locationCMT toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero From cc5b173bb5999f12b0a804b0d224f7ec0ea37337 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 20 Apr 2023 17:12:17 -0700 Subject: [PATCH 05/19] changelog and comment --- packages/video_player/video_player_avfoundation/CHANGELOG.md | 4 ++++ .../ios/Classes/FLTVideoPlayerPlugin.m | 2 ++ packages/video_player/video_player_avfoundation/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index 8c1e2bc3426..da0972395e9 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.4.5 + +* Fixes hang when seeking to end of video. + ## 2.4.4 * Updates pigeon to fix warnings with clang 15. diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index fdfb9b8d180..579b75ac3ee 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -424,6 +424,8 @@ - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler CMTimeValue duration = _player.currentItem.asset.duration.value; CMTimeValue locationCM = locationCMT.value; if (duration == locationCM) { + // Without adding tolerance when seeking to duration, + // seekToTime will never complete, and this call will hang. [_player seekToTime:_player.currentItem.currentTime toleranceBefore:CMTimeMake(1, 1000) toleranceAfter:CMTimeMake(1, 1000) diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index c579ee0be2e..53bbe63fce3 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avfoundation description: iOS implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.4.4 +version: 2.4.5 environment: sdk: ">=2.18.0 <4.0.0" From aa9fbbd8cf9aa9e3af7e21cdb520ca21a068efe1 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Fri, 21 Apr 2023 12:04:29 -0700 Subject: [PATCH 06/19] tests? --- .../integration_test/video_player_test.dart | 11 +++++++++ .../integration_test/video_player_test.dart | 24 +++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 6676da525aa..17aa681ee8c 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -102,6 +102,17 @@ void main() { }, ); + testWidgets( + 'can seek to end', + (WidgetTester tester) async { + await controller.initialize(); + + await controller.seekTo(controller.value.duration); + + expect(controller.value.duration, controller.value.position); + }, + ); + testWidgets( 'can be paused', (WidgetTester tester) async { diff --git a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart index ae3cd7e3ea8..d8a73b09d24 100644 --- a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart @@ -71,13 +71,27 @@ void main() { expect(await controller.position, greaterThan(Duration.zero)); }); - testWidgets('can seek', (WidgetTester tester) async { - await controller.initialize(); + testWidgets( + 'can seek', + (WidgetTester tester) async { + await controller.initialize(); - await controller.seekTo(const Duration(seconds: 3)); + await controller.seekTo(const Duration(seconds: 3)); - expect(await controller.position, const Duration(seconds: 3)); - }); + expect(controller.value.position, const Duration(seconds: 3)); + }, + ); + + testWidgets( + 'can seek to end', + (WidgetTester tester) async { + await controller.initialize(); + + await controller.seekTo(controller.value.duration); + + expect(controller.value.duration, controller.value.position); + }, + ); testWidgets('can be paused', (WidgetTester tester) async { await controller.initialize(); From 041dcb33111a558a9f148236666dac2a77c4d7d2 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Mon, 24 Apr 2023 09:27:20 -0700 Subject: [PATCH 07/19] clean up --- .../integration_test/video_player_test.dart | 11 ----------- .../ios/Classes/FLTVideoPlayerPlugin.m | 16 +++++----------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 17aa681ee8c..6676da525aa 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -102,17 +102,6 @@ void main() { }, ); - testWidgets( - 'can seek to end', - (WidgetTester tester) async { - await controller.initialize(); - - await controller.seekTo(controller.value.duration); - - expect(controller.value.duration, controller.value.position); - }, - ); - testWidgets( 'can be paused', (WidgetTester tester) async { diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 579b75ac3ee..e35c7571ccb 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -422,20 +422,14 @@ - (int64_t)duration { - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { CMTime locationCMT = CMTimeMake(location, 1000); CMTimeValue duration = _player.currentItem.asset.duration.value; - CMTimeValue locationCM = locationCMT.value; - if (duration == locationCM) { // Without adding tolerance when seeking to duration, // seekToTime will never complete, and this call will hang. - [_player seekToTime:_player.currentItem.currentTime - toleranceBefore:CMTimeMake(1, 1000) - toleranceAfter:CMTimeMake(1, 1000) + // see issue https://github.com/flutter/flutter/issues/124475. + CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero; + [_player seekToTime:locationCMT + toleranceBefore:tolerance + toleranceAfter:tolerance completionHandler:completionHandler]; - return; - } - [_player seekToTime:locationCMT - toleranceBefore:kCMTimeZero - toleranceAfter:kCMTimeZero - completionHandler:completionHandler]; } - (void)setIsLooping:(BOOL)isLooping { From c6861f4da1f883a1bb7f2b3bd581760b63c3ac58 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Mon, 24 Apr 2023 09:45:22 -0700 Subject: [PATCH 08/19] format --- .../ios/Classes/FLTVideoPlayerPlugin.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index e35c7571ccb..a9a87989665 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -422,14 +422,14 @@ - (int64_t)duration { - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler { CMTime locationCMT = CMTimeMake(location, 1000); CMTimeValue duration = _player.currentItem.asset.duration.value; - // Without adding tolerance when seeking to duration, - // seekToTime will never complete, and this call will hang. - // see issue https://github.com/flutter/flutter/issues/124475. - CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero; - [_player seekToTime:locationCMT - toleranceBefore:tolerance - toleranceAfter:tolerance - completionHandler:completionHandler]; + // Without adding tolerance when seeking to duration, + // seekToTime will never complete, and this call will hang. + // see issue https://github.com/flutter/flutter/issues/124475. + CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero; + [_player seekToTime:locationCMT + toleranceBefore:tolerance + toleranceAfter:tolerance + completionHandler:completionHandler]; } - (void)setIsLooping:(BOOL)isLooping { From 747a4211c40cdec3f6a1e15432dad2d1b2450b6d Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Tue, 2 May 2023 17:09:41 -0700 Subject: [PATCH 09/19] DI --- .../ios/Classes/FLTVideoPlayerPlugin.m | 49 +++++++++++++++---- .../ios/Classes/FLTVideoPlayerPlugin_test.h | 20 ++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index a9a87989665..10d8f501eff 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -3,6 +3,7 @@ // found in the LICENSE file. #import "FLTVideoPlayerPlugin.h" +#import "FLTVideoPlayerPlugin_test.h" #import #import @@ -52,7 +53,8 @@ @interface FLTVideoPlayer : NSObject @property(nonatomic, readonly) BOOL isInitialized; - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater - httpHeaders:(nonnull NSDictionary *)headers; + httpHeaders:(nonnull NSDictionary *)headers + playerFactory:(AVPlayerFactory *)playerFactory; @end static void *timeRangeContext = &timeRangeContext; @@ -65,9 +67,14 @@ - (instancetype)initWithURL:(NSURL *)url static void *rateContext = &rateContext; @implementation FLTVideoPlayer -- (instancetype)initWithAsset:(NSString *)asset frameUpdater:(FLTFrameUpdater *)frameUpdater { +- (instancetype)initWithAsset:(NSString *)asset + frameUpdater:(FLTFrameUpdater *)frameUpdater + playerFactory:(AVPlayerFactory *)playerFactory { NSString *path = [[NSBundle mainBundle] pathForResource:asset ofType:nil]; - return [self initWithURL:[NSURL fileURLWithPath:path] frameUpdater:frameUpdater httpHeaders:@{}]; + return [self initWithURL:[NSURL fileURLWithPath:path] + frameUpdater:frameUpdater + httpHeaders:@{} + playerFactory:playerFactory]; } - (void)addObserversForItem:(AVPlayerItem *)item player:(AVPlayer *)player { @@ -203,18 +210,20 @@ - (void)createVideoOutputAndDisplayLink:(FLTFrameUpdater *)frameUpdater { - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater - httpHeaders:(nonnull NSDictionary *)headers { + httpHeaders:(nonnull NSDictionary *)headers + playerFactory:(AVPlayerFactory *)playerFactory { NSDictionary *options = nil; if ([headers count] != 0) { options = @{@"AVURLAssetHTTPHeaderFieldsKey" : headers}; } AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:url options:options]; AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:urlAsset]; - return [self initWithPlayerItem:item frameUpdater:frameUpdater]; + return [self initWithPlayerItem:item frameUpdater:frameUpdater playerFactory:playerFactory]; } - (instancetype)initWithPlayerItem:(AVPlayerItem *)item - frameUpdater:(FLTFrameUpdater *)frameUpdater { + frameUpdater:(FLTFrameUpdater *)frameUpdater + playerFactory:(AVPlayerFactory *)playerFactory { self = [super init]; NSAssert(self, @"super init cannot be nil"); @@ -247,7 +256,7 @@ - (instancetype)initWithPlayerItem:(AVPlayerItem *)item } }; - _player = [AVPlayer playerWithPlayerItem:item]; + _player = [playerFactory playerWithPlayerItem:item]; _player.actionAtItemEnd = AVPlayerActionAtItemEndNone; // This is to fix 2 bugs: 1. blank video for encrypted video streams on iOS 16 @@ -428,7 +437,7 @@ - (void)seekTo:(int)location completionHandler:(void (^)(BOOL))completionHandler CMTime tolerance = location == duration ? CMTimeMake(1, 1000) : kCMTimeZero; [_player seekToTime:locationCMT toleranceBefore:tolerance - toleranceAfter:tolerance + toleranceAfter:tolerance completionHandler:completionHandler]; } @@ -529,6 +538,7 @@ @interface FLTVideoPlayerPlugin () @property(readonly, strong, nonatomic) NSMutableDictionary *playersByTextureId; @property(readonly, strong, nonatomic) NSObject *registrar; +@property(nonatomic, strong) AVPlayerFactory *playerFactory; @end @implementation FLTVideoPlayerPlugin @@ -541,9 +551,18 @@ + (void)registerWithRegistrar:(NSObject *)registrar { - (instancetype)initWithRegistrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); + AVPlayerFactory *playerFactory = [[AVPlayerFactory alloc] init]; + return [self initWithAVPlayerFactory:playerFactory registrar:registrar]; +} + +- (instancetype)initWithAVPlayerFactory:(AVPlayerFactory *)playerFactory + registrar:(NSObject *)registrar { + self = [super init]; + NSAssert(self, @"super init cannot be nil"); _registry = [registrar textures]; _messenger = [registrar messenger]; _registrar = registrar; + _playerFactory = playerFactory; _playersByTextureId = [NSMutableDictionary dictionaryWithCapacity:1]; return self; } @@ -594,12 +613,15 @@ - (FLTTextureMessage *)create:(FLTCreateMessage *)input error:(FlutterError **)e } else { assetPath = [_registrar lookupKeyForAsset:input.asset]; } - player = [[FLTVideoPlayer alloc] initWithAsset:assetPath frameUpdater:frameUpdater]; + player = [[FLTVideoPlayer alloc] initWithAsset:assetPath + frameUpdater:frameUpdater + playerFactory:_playerFactory]; return [self onPlayerSetup:player frameUpdater:frameUpdater]; } else if (input.uri) { player = [[FLTVideoPlayer alloc] initWithURL:[NSURL URLWithString:input.uri] frameUpdater:frameUpdater - httpHeaders:input.httpHeaders]; + httpHeaders:input.httpHeaders + playerFactory:_playerFactory]; return [self onPlayerSetup:player frameUpdater:frameUpdater]; } else { *error = [FlutterError errorWithCode:@"video_player" message:@"not implemented" details:nil]; @@ -685,3 +707,10 @@ - (void)setMixWithOthers:(FLTMixWithOthersMessage *)input } @end + +@implementation AVPlayerFactory +- (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { + return [AVPlayer playerWithPlayerItem:playerItem]; +} + +@end diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h new file mode 100644 index 00000000000..ed8811d5110 --- /dev/null +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h @@ -0,0 +1,20 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "FLTVideoPlayerPlugin.h" + +#import + +@protocol AVPlayerFactoryProtocol +- (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem; +@end + +@interface AVPlayerFactory : NSObject +@end + +@interface FLTVideoPlayerPlugin () + +- (instancetype)initWithAVPlayerFactory:(AVPlayerFactory *)playerFactory + registrar:(NSObject *)registrar; +@end From 2e12e1a5c149f67fdd6d14a17c971c9d74a6845c Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Fri, 5 May 2023 02:12:55 -0700 Subject: [PATCH 10/19] test set up --- .../ios/RunnerTests/VideoPlayerTests.m | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 1ec18e762ae..431f32cfa7e 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -8,6 +8,7 @@ #import #import +#import @interface FLTVideoPlayer : NSObject @property(readonly, nonatomic) AVPlayer *player; @@ -61,6 +62,29 @@ - (CGAffineTransform)preferredTransform { @interface VideoPlayerTests : XCTestCase @end +@interface AVPlayerMock : AVPlayer + +@end + +@implementation AVPlayerMock + +- (void)seekToTime:(CMTime)time + toleranceBefore:(CMTime)toleranceBefore + toleranceAfter:(CMTime)toleranceAfter + completionHandler:(void (^)(BOOL finished))completionHandler { + // something needs to happen to validate tolerances + completionHandler(YES); + } + +@end + +@implementation AVPlayerFactory +- (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { + return [AVPlayerMock playerWithPlayerItem:playerItem]; +} + +@end + @implementation VideoPlayerTests - (void)testBlankVideoBugWithEncryptedVideoStreamAndInvertedAspectRatioBugForSomeVideoStream { @@ -226,6 +250,39 @@ - (void)testTransformFix { [self validateTransformFixForOrientation:UIImageOrientationRightMirrored]; } +- (void)testSeekToleranceWhenSeekingToEndFix { + NSObject *registry = + (NSObject *)[[UIApplication sharedApplication] delegate]; + NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; + FLTVideoPlayerPlugin *pluginWithMockAVPlayer = [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:[[AVPlayerFactory alloc] init] registrar: registrar]; + + FlutterError *error; + [pluginWithMockAVPlayer initialize:&error]; + XCTAssertNil(error); + + FLTCreateMessage *create = [FLTCreateMessage + makeWithAsset:nil + uri:@"https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8" + packageName:nil + formatHint:nil + httpHeaders:@{}]; + FLTTextureMessage *textureMessage = [pluginWithMockAVPlayer create:create error:&error]; + NSNumber *textureId = textureMessage.textureId; + + + XCTestExpectation *initializedExpectation = [self expectationWithDescription:@"seekTo has correct tolerance"]; + FLTPositionMessage *message = [FLTPositionMessage makeWithTextureId:textureId position:@1234]; + [pluginWithMockAVPlayer seekTo:message + completion:^(FlutterError *_Nullable error) { + // validate tolerance somehow + XCTAssert(YES); + [initializedExpectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:30.0 handler:nil]; + +} + + - (NSDictionary *)testPlugin:(FLTVideoPlayerPlugin *)videoPlayerPlugin uri:(NSString *)uri { FlutterError *error; From d130337bf774aa0bbb057939165afb8892bf848e Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Fri, 5 May 2023 13:53:02 -0700 Subject: [PATCH 11/19] move interface --- .../ios/RunnerTests/VideoPlayerTests.m | 11 +++++--- .../ios/Classes/FLTVideoPlayerPlugin.m | 27 ++++++++++--------- ...gin_test.h => FLTVideoPlayerPlugin_Test.h} | 5 +--- 3 files changed, 24 insertions(+), 19 deletions(-) rename packages/video_player/video_player_avfoundation/ios/Classes/{FLTVideoPlayerPlugin_test.h => FLTVideoPlayerPlugin_Test.h} (76%) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 431f32cfa7e..9c6dc797144 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -8,7 +8,7 @@ #import #import -#import +#import @interface FLTVideoPlayer : NSObject @property(readonly, nonatomic) AVPlayer *player; @@ -78,7 +78,12 @@ - (void)seekToTime:(CMTime)time @end -@implementation AVPlayerFactory + +@interface AVPlayerFactoryFake : NSObject + +@end + +@implementation AVPlayerFactoryFake - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { return [AVPlayerMock playerWithPlayerItem:playerItem]; } @@ -254,7 +259,7 @@ - (void)testSeekToleranceWhenSeekingToEndFix { NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; - FLTVideoPlayerPlugin *pluginWithMockAVPlayer = [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:[[AVPlayerFactory alloc] init] registrar: registrar]; + FLTVideoPlayerPlugin *pluginWithMockAVPlayer = [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:[[AVPlayerFactoryFake alloc] init] registrar: registrar]; FlutterError *error; [pluginWithMockAVPlayer initialize:&error]; diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 10d8f501eff..ccb0fae161f 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -3,7 +3,7 @@ // found in the LICENSE file. #import "FLTVideoPlayerPlugin.h" -#import "FLTVideoPlayerPlugin_test.h" +#import "FLTVideoPlayerPlugin_Test.h" #import #import @@ -34,6 +34,16 @@ - (void)onDisplayLink:(CADisplayLink *)link { } @end +@interface AVPlayerFactory : NSObject +@end + +@implementation AVPlayerFactory +- (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { + return [AVPlayer playerWithPlayerItem:playerItem]; +} + +@end + @interface FLTVideoPlayer : NSObject @property(readonly, nonatomic) AVPlayer *player; @property(readonly, nonatomic) AVPlayerItemVideoOutput *videoOutput; @@ -54,7 +64,7 @@ @interface FLTVideoPlayer : NSObject - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(AVPlayerFactory *)playerFactory; + playerFactory:(id *)playerFactory; @end static void *timeRangeContext = &timeRangeContext; @@ -69,7 +79,7 @@ - (instancetype)initWithURL:(NSURL *)url @implementation FLTVideoPlayer - (instancetype)initWithAsset:(NSString *)asset frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(AVPlayerFactory *)playerFactory { + playerFactory:(id *)playerFactory { NSString *path = [[NSBundle mainBundle] pathForResource:asset ofType:nil]; return [self initWithURL:[NSURL fileURLWithPath:path] frameUpdater:frameUpdater @@ -211,7 +221,7 @@ - (void)createVideoOutputAndDisplayLink:(FLTFrameUpdater *)frameUpdater { - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(AVPlayerFactory *)playerFactory { + playerFactory:(id *)playerFactory { NSDictionary *options = nil; if ([headers count] != 0) { options = @{@"AVURLAssetHTTPHeaderFieldsKey" : headers}; @@ -223,7 +233,7 @@ - (instancetype)initWithURL:(NSURL *)url - (instancetype)initWithPlayerItem:(AVPlayerItem *)item frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(AVPlayerFactory *)playerFactory { + playerFactory:(id *)playerFactory { self = [super init]; NSAssert(self, @"super init cannot be nil"); @@ -707,10 +717,3 @@ - (void)setMixWithOthers:(FLTMixWithOthersMessage *)input } @end - -@implementation AVPlayerFactory -- (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { - return [AVPlayer playerWithPlayerItem:playerItem]; -} - -@end diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h similarity index 76% rename from packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h rename to packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h index ed8811d5110..abbdcbd96e0 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_test.h +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h @@ -10,11 +10,8 @@ - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem; @end -@interface AVPlayerFactory : NSObject -@end - @interface FLTVideoPlayerPlugin () -- (instancetype)initWithAVPlayerFactory:(AVPlayerFactory *)playerFactory +- (instancetype)initWithAVPlayerFactory:(id)playerFactory registrar:(NSObject *)registrar; @end From 7e8fadaf06e948a335c83579ccbf7d3b615f3c72 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Fri, 5 May 2023 14:01:39 -0700 Subject: [PATCH 12/19] Pesky *, I'm sure I'll revert this before it lands --- .../ios/Classes/FLTVideoPlayerPlugin.m | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index ccb0fae161f..cb254646454 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -64,7 +64,7 @@ @interface FLTVideoPlayer : NSObject - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id *)playerFactory; + playerFactory:(id)playerFactory; @end static void *timeRangeContext = &timeRangeContext; @@ -79,7 +79,7 @@ - (instancetype)initWithURL:(NSURL *)url @implementation FLTVideoPlayer - (instancetype)initWithAsset:(NSString *)asset frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id *)playerFactory { + playerFactory:(id)playerFactory { NSString *path = [[NSBundle mainBundle] pathForResource:asset ofType:nil]; return [self initWithURL:[NSURL fileURLWithPath:path] frameUpdater:frameUpdater @@ -221,7 +221,7 @@ - (void)createVideoOutputAndDisplayLink:(FLTFrameUpdater *)frameUpdater { - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id *)playerFactory { + playerFactory:(id)playerFactory { NSDictionary *options = nil; if ([headers count] != 0) { options = @{@"AVURLAssetHTTPHeaderFieldsKey" : headers}; @@ -233,7 +233,7 @@ - (instancetype)initWithURL:(NSURL *)url - (instancetype)initWithPlayerItem:(AVPlayerItem *)item frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id *)playerFactory { + playerFactory:(id)playerFactory { self = [super init]; NSAssert(self, @"super init cannot be nil"); @@ -548,7 +548,7 @@ @interface FLTVideoPlayerPlugin () @property(readonly, strong, nonatomic) NSMutableDictionary *playersByTextureId; @property(readonly, strong, nonatomic) NSObject *registrar; -@property(nonatomic, strong) AVPlayerFactory *playerFactory; +@property(nonatomic, strong) id playerFactory; @end @implementation FLTVideoPlayerPlugin @@ -561,11 +561,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { - (instancetype)initWithRegistrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); - AVPlayerFactory *playerFactory = [[AVPlayerFactory alloc] init]; + id playerFactory = [[AVPlayerFactory alloc] init]; return [self initWithAVPlayerFactory:playerFactory registrar:registrar]; } -- (instancetype)initWithAVPlayerFactory:(AVPlayerFactory *)playerFactory +- (instancetype)initWithAVPlayerFactory:(id)playerFactory registrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); From b61eace0b3ad545050309f5ec0da74b7a8256e73 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Mon, 8 May 2023 14:56:44 -0700 Subject: [PATCH 13/19] no tolerance test --- .../ios/RunnerTests/VideoPlayerTests.m | 80 ++++++++++++++----- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 9c6dc797144..cd66ce951ac 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -63,29 +63,58 @@ @interface VideoPlayerTests : XCTestCase @end @interface AVPlayerMock : AVPlayer +@property(assign) NSMutableArray *beforeToleranceArray; +@property(assign) NSMutableArray *afterToleranceArray; @end @implementation AVPlayerMock -- (void)seekToTime:(CMTime)time - toleranceBefore:(CMTime)toleranceBefore - toleranceAfter:(CMTime)toleranceAfter - completionHandler:(void (^)(BOOL finished))completionHandler { - // something needs to happen to validate tolerances - completionHandler(YES); - } +- (instancetype)initWithBeforeArray:(NSMutableArray *)beforeArray + afterArray:(NSMutableArray *)afterArray + playerItem:(AVPlayerItem *)playerItem { + self = [super init]; + if (self) { + _beforeToleranceArray = beforeArray; + _afterToleranceArray = afterArray; + } -@end + return self; +} + +- (void)seekToTime:(CMTime)time + toleranceBefore:(CMTime)toleranceBefore + toleranceAfter:(CMTime)toleranceAfter + completionHandler:(void (^)(BOOL finished))completionHandler { + [_beforeToleranceArray addObject:[NSNumber numberWithLong:toleranceBefore.value]]; + [_afterToleranceArray addObject:[NSNumber numberWithLong:toleranceAfter.value]]; + completionHandler(YES); +} +@end @interface AVPlayerFactoryFake : NSObject +@property(assign) NSMutableArray *beforeToleranceArray; +@property(assign) NSMutableArray *afterToleranceArray; + +- (instancetype)initWithBeforeArray:(NSMutableArray *)array afterArray:(NSMutableArray *)afterArray; @end @implementation AVPlayerFactoryFake + +- (instancetype)initWithBeforeArray:(NSMutableArray *)beforeArray + afterArray:(NSMutableArray *)afterArray { + self = [super init]; + _beforeToleranceArray = beforeArray; + _afterToleranceArray = afterArray; + return self; +} + - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { - return [AVPlayerMock playerWithPlayerItem:playerItem]; + return [[AVPlayerMock alloc] initWithBeforeArray:_beforeToleranceArray + afterArray:_afterToleranceArray + playerItem:playerItem]; } @end @@ -259,13 +288,22 @@ - (void)testSeekToleranceWhenSeekingToEndFix { NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; - FLTVideoPlayerPlugin *pluginWithMockAVPlayer = [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:[[AVPlayerFactoryFake alloc] init] registrar: registrar]; - FlutterError *error; + NSMutableArray *beforeToleranceArray = [[NSMutableArray alloc] init]; + NSMutableArray *afterToleranceArray = [[NSMutableArray alloc] init]; + + AVPlayerFactoryFake *avPlayerFactoryFake = + [[AVPlayerFactoryFake alloc] initWithBeforeArray:beforeToleranceArray + afterArray:afterToleranceArray]; + FLTVideoPlayerPlugin *pluginWithMockAVPlayer = + [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:avPlayerFactoryFake + registrar:registrar]; + + FlutterError *error; [pluginWithMockAVPlayer initialize:&error]; XCTAssertNil(error); - FLTCreateMessage *create = [FLTCreateMessage + FLTCreateMessage *create = [FLTCreateMessage makeWithAsset:nil uri:@"https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8" packageName:nil @@ -274,20 +312,18 @@ - (void)testSeekToleranceWhenSeekingToEndFix { FLTTextureMessage *textureMessage = [pluginWithMockAVPlayer create:create error:&error]; NSNumber *textureId = textureMessage.textureId; - - XCTestExpectation *initializedExpectation = [self expectationWithDescription:@"seekTo has correct tolerance"]; + XCTestExpectation *initializedExpectation = + [self expectationWithDescription:@"seekTo has zero tolerance when seeking not to end"]; FLTPositionMessage *message = [FLTPositionMessage makeWithTextureId:textureId position:@1234]; [pluginWithMockAVPlayer seekTo:message - completion:^(FlutterError *_Nullable error) { - // validate tolerance somehow - XCTAssert(YES); - [initializedExpectation fulfill]; - }]; - [self waitForExpectationsWithTimeout:30.0 handler:nil]; - + completion:^(FlutterError *_Nullable error) { + XCTAssertEqual(0, [[beforeToleranceArray objectAtIndex:0] intValue]); + XCTAssertEqual(0, [[afterToleranceArray objectAtIndex:0] intValue]); + [initializedExpectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:30.0 handler:nil]; } - - (NSDictionary *)testPlugin:(FLTVideoPlayerPlugin *)videoPlayerPlugin uri:(NSString *)uri { FlutterError *error; From 6a586d11437b0146f34aa384a8dcc89831f84827 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Tue, 9 May 2023 02:10:17 -0700 Subject: [PATCH 14/19] Finish tests --- .../example/ios/RunnerTests/VideoPlayerTests.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index cd66ce951ac..e0042cf0591 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -305,7 +305,7 @@ - (void)testSeekToleranceWhenSeekingToEndFix { FLTCreateMessage *create = [FLTCreateMessage makeWithAsset:nil - uri:@"https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8" + uri:@"https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4" packageName:nil formatHint:nil httpHeaders:@{}]; @@ -321,6 +321,17 @@ - (void)testSeekToleranceWhenSeekingToEndFix { XCTAssertEqual(0, [[afterToleranceArray objectAtIndex:0] intValue]); [initializedExpectation fulfill]; }]; + + XCTestExpectation *initializedExpectationEnd = + [self expectationWithDescription:@"seekTo has non-zero tolerance when seeking to end"]; + // The duration of this video is "0" due to the non standard initiliatazion process. + FLTPositionMessage *messageEnd = [FLTPositionMessage makeWithTextureId:textureId position:@0]; + [pluginWithMockAVPlayer seekTo:messageEnd + completion:^(FlutterError *_Nullable error) { + XCTAssertGreaterThan([[beforeToleranceArray objectAtIndex:1] intValue], 0); + XCTAssertGreaterThan([[afterToleranceArray objectAtIndex:1] intValue], 0); + [initializedExpectationEnd fulfill]; + }]; [self waitForExpectationsWithTimeout:30.0 handler:nil]; } From ce41a1f622a8413a7f3dcb1f07f91e0e035ee272 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Wed, 10 May 2023 01:03:26 -0700 Subject: [PATCH 15/19] review changes --- .../ios/RunnerTests/VideoPlayerTests.m | 61 ++++++++----------- .../ios/Classes/FLTVideoPlayerPlugin.m | 21 +++---- .../ios/Classes/FLTVideoPlayerPlugin_Test.h | 5 +- .../video_player_avfoundation/pubspec.yaml | 2 +- 4 files changed, 38 insertions(+), 51 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index e0042cf0591..5124649dc07 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -62,23 +62,19 @@ - (CGAffineTransform)preferredTransform { @interface VideoPlayerTests : XCTestCase @end -@interface AVPlayerMock : AVPlayer -@property(assign) NSMutableArray *beforeToleranceArray; -@property(assign) NSMutableArray *afterToleranceArray; - +@interface StubAVPlayer : AVPlayer +@property(readonly) NSMutableArray *beforeTolerances; +@property(readonly) NSMutableArray *afterTolerances; @end -@implementation AVPlayerMock +@implementation StubAVPlayer -- (instancetype)initWithBeforeArray:(NSMutableArray *)beforeArray - afterArray:(NSMutableArray *)afterArray - playerItem:(AVPlayerItem *)playerItem { +- (instancetype)init { self = [super init]; if (self) { - _beforeToleranceArray = beforeArray; - _afterToleranceArray = afterArray; + _beforeTolerances = [[NSMutableArray alloc] init]; + _afterTolerances = [[NSMutableArray alloc] init]; } - return self; } @@ -86,35 +82,31 @@ - (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter completionHandler:(void (^)(BOOL finished))completionHandler { - [_beforeToleranceArray addObject:[NSNumber numberWithLong:toleranceBefore.value]]; - [_afterToleranceArray addObject:[NSNumber numberWithLong:toleranceAfter.value]]; + [_beforeTolerances addObject:[NSNumber numberWithLong:toleranceBefore.value]]; + [_afterTolerances addObject:[NSNumber numberWithLong:toleranceAfter.value]]; completionHandler(YES); } @end -@interface AVPlayerFactoryFake : NSObject -@property(assign) NSMutableArray *beforeToleranceArray; -@property(assign) NSMutableArray *afterToleranceArray; +@interface StubFVPAVPlayerFactory : NSObject -- (instancetype)initWithBeforeArray:(NSMutableArray *)array afterArray:(NSMutableArray *)afterArray; +@property(copy) StubAVPlayer *stubAVPlayer; + +- (instancetype)initWithPlayer:(StubAVPlayer *)stubAVPlayer; @end -@implementation AVPlayerFactoryFake +@implementation StubFVPAVPlayerFactory -- (instancetype)initWithBeforeArray:(NSMutableArray *)beforeArray - afterArray:(NSMutableArray *)afterArray { +- (instancetype)initWithPlayer:(StubAVPlayer *)stubAVPlayer { self = [super init]; - _beforeToleranceArray = beforeArray; - _afterToleranceArray = afterArray; + _stubAVPlayer = stubAVPlayer; return self; } - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { - return [[AVPlayerMock alloc] initWithBeforeArray:_beforeToleranceArray - afterArray:_afterToleranceArray - playerItem:playerItem]; + return _stubAVPlayer; } @end @@ -289,14 +281,11 @@ - (void)testSeekToleranceWhenSeekingToEndFix { (NSObject *)[[UIApplication sharedApplication] delegate]; NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; - NSMutableArray *beforeToleranceArray = [[NSMutableArray alloc] init]; - NSMutableArray *afterToleranceArray = [[NSMutableArray alloc] init]; - - AVPlayerFactoryFake *avPlayerFactoryFake = - [[AVPlayerFactoryFake alloc] initWithBeforeArray:beforeToleranceArray - afterArray:afterToleranceArray]; + StubAVPlayer *stubAVPlayer = [[StubAVPlayer alloc] init]; + StubFVPAVPlayerFactory *stubFVPAVPlayerFactory = + [[StubFVPAVPlayerFactory alloc] initWithPlayer:stubAVPlayer]; FLTVideoPlayerPlugin *pluginWithMockAVPlayer = - [[FLTVideoPlayerPlugin alloc] initWithAVPlayerFactory:avPlayerFactoryFake + [[FLTVideoPlayerPlugin alloc] initWithFVPAVPlayerFactory:stubFVPAVPlayerFactory registrar:registrar]; FlutterError *error; @@ -317,8 +306,6 @@ - (void)testSeekToleranceWhenSeekingToEndFix { FLTPositionMessage *message = [FLTPositionMessage makeWithTextureId:textureId position:@1234]; [pluginWithMockAVPlayer seekTo:message completion:^(FlutterError *_Nullable error) { - XCTAssertEqual(0, [[beforeToleranceArray objectAtIndex:0] intValue]); - XCTAssertEqual(0, [[afterToleranceArray objectAtIndex:0] intValue]); [initializedExpectation fulfill]; }]; @@ -328,11 +315,13 @@ - (void)testSeekToleranceWhenSeekingToEndFix { FLTPositionMessage *messageEnd = [FLTPositionMessage makeWithTextureId:textureId position:@0]; [pluginWithMockAVPlayer seekTo:messageEnd completion:^(FlutterError *_Nullable error) { - XCTAssertGreaterThan([[beforeToleranceArray objectAtIndex:1] intValue], 0); - XCTAssertGreaterThan([[afterToleranceArray objectAtIndex:1] intValue], 0); [initializedExpectationEnd fulfill]; }]; [self waitForExpectationsWithTimeout:30.0 handler:nil]; + XCTAssertEqual([[stubAVPlayer.beforeTolerances objectAtIndex:0] intValue], 0); + XCTAssertEqual([[stubAVPlayer.afterTolerances objectAtIndex:0] intValue], 0); + XCTAssertGreaterThan([[stubAVPlayer.beforeTolerances objectAtIndex:1] intValue], 0); + XCTAssertGreaterThan([[stubAVPlayer.afterTolerances objectAtIndex:1] intValue], 0); } - (NSDictionary *)testPlugin:(FLTVideoPlayerPlugin *)videoPlayerPlugin diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 6e6a73c1d2e..f35cdde1a0f 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -34,10 +34,10 @@ - (void)onDisplayLink:(CADisplayLink *)link { } @end -@interface AVPlayerFactory : NSObject +@interface FVPDefaultAVPlayerFactory : NSObject @end -@implementation AVPlayerFactory +@implementation FVPDefaultAVPlayerFactory - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { return [AVPlayer playerWithPlayerItem:playerItem]; } @@ -64,7 +64,7 @@ @interface FLTVideoPlayer : NSObject - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id)playerFactory; + playerFactory:(id)playerFactory; @end static void *timeRangeContext = &timeRangeContext; @@ -79,7 +79,7 @@ - (instancetype)initWithURL:(NSURL *)url @implementation FLTVideoPlayer - (instancetype)initWithAsset:(NSString *)asset frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { NSString *path = [[NSBundle mainBundle] pathForResource:asset ofType:nil]; return [self initWithURL:[NSURL fileURLWithPath:path] frameUpdater:frameUpdater @@ -221,7 +221,7 @@ - (void)createVideoOutputAndDisplayLink:(FLTFrameUpdater *)frameUpdater { - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { NSDictionary *options = nil; if ([headers count] != 0) { options = @{@"AVURLAssetHTTPHeaderFieldsKey" : headers}; @@ -233,7 +233,7 @@ - (instancetype)initWithURL:(NSURL *)url - (instancetype)initWithPlayerItem:(AVPlayerItem *)item frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { self = [super init]; NSAssert(self, @"super init cannot be nil"); @@ -548,7 +548,7 @@ @interface FLTVideoPlayerPlugin () @property(readonly, strong, nonatomic) NSMutableDictionary *playersByTextureId; @property(readonly, strong, nonatomic) NSObject *registrar; -@property(nonatomic, strong) id playerFactory; +@property(nonatomic, strong) id playerFactory; @end @implementation FLTVideoPlayerPlugin @@ -559,13 +559,10 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (instancetype)initWithRegistrar:(NSObject *)registrar { - self = [super init]; - NSAssert(self, @"super init cannot be nil"); - id playerFactory = [[AVPlayerFactory alloc] init]; - return [self initWithAVPlayerFactory:playerFactory registrar:registrar]; + return [self initWithFVPAVPlayerFactory:[[FVPDefaultAVPlayerFactory alloc] init] registrar:registrar]; } -- (instancetype)initWithAVPlayerFactory:(id)playerFactory +- (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory registrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h index abbdcbd96e0..8b4eb523883 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h @@ -6,12 +6,13 @@ #import -@protocol AVPlayerFactoryProtocol +// Protocol for an AVPlayer instance factory. Used for injecting players in tests. +@protocol FVPAVPlayerFactoryProtocol - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem; @end @interface FLTVideoPlayerPlugin () -- (instancetype)initWithAVPlayerFactory:(id)playerFactory +- (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory registrar:(NSObject *)registrar; @end diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index 53bbe63fce3..093f5ebbb51 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avfoundation description: iOS implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.4.5 +version: 2.4.6 environment: sdk: ">=2.18.0 <4.0.0" From 3ef8801a6b101fb38c062835ba2ca8116f434b33 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Wed, 10 May 2023 01:06:53 -0700 Subject: [PATCH 16/19] format --- .../example/ios/RunnerTests/VideoPlayerTests.m | 2 +- .../ios/Classes/FLTVideoPlayerPlugin.m | 5 +++-- .../ios/Classes/FLTVideoPlayerPlugin_Test.h | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 5124649dc07..5bffee725e3 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -286,7 +286,7 @@ - (void)testSeekToleranceWhenSeekingToEndFix { [[StubFVPAVPlayerFactory alloc] initWithPlayer:stubAVPlayer]; FLTVideoPlayerPlugin *pluginWithMockAVPlayer = [[FLTVideoPlayerPlugin alloc] initWithFVPAVPlayerFactory:stubFVPAVPlayerFactory - registrar:registrar]; + registrar:registrar]; FlutterError *error; [pluginWithMockAVPlayer initialize:&error]; diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index f35cdde1a0f..df6e57d7c86 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -559,11 +559,12 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (instancetype)initWithRegistrar:(NSObject *)registrar { - return [self initWithFVPAVPlayerFactory:[[FVPDefaultAVPlayerFactory alloc] init] registrar:registrar]; + return [self initWithFVPAVPlayerFactory:[[FVPDefaultAVPlayerFactory alloc] init] + registrar:registrar]; } - (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory - registrar:(NSObject *)registrar { + registrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); _registry = [registrar textures]; diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h index 8b4eb523883..10caec9ee33 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h @@ -14,5 +14,5 @@ @interface FLTVideoPlayerPlugin () - (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory - registrar:(NSObject *)registrar; + registrar:(NSObject *)registrar; @end From 46f3c7dbe5b09fd6a305898fa0b85227e18e0999 Mon Sep 17 00:00:00 2001 From: tarrinneal Date: Thu, 11 May 2023 02:43:17 -0700 Subject: [PATCH 17/19] Nits and stub change --- .../ios/RunnerTests/VideoPlayerTests.m | 75 ++++++++++++------- .../ios/Classes/FLTVideoPlayerPlugin.m | 21 +++--- .../ios/Classes/FLTVideoPlayerPlugin_Test.h | 6 +- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 5bffee725e3..b83eec66ed3 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -63,41 +63,32 @@ @interface VideoPlayerTests : XCTestCase @end @interface StubAVPlayer : AVPlayer -@property(readonly) NSMutableArray *beforeTolerances; -@property(readonly) NSMutableArray *afterTolerances; +@property(readonly, nonatomic) NSNumber *beforeTolerance; +@property(readonly, nonatomic) NSNumber *afterTolerance; @end @implementation StubAVPlayer -- (instancetype)init { - self = [super init]; - if (self) { - _beforeTolerances = [[NSMutableArray alloc] init]; - _afterTolerances = [[NSMutableArray alloc] init]; - } - return self; -} - - (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter completionHandler:(void (^)(BOOL finished))completionHandler { - [_beforeTolerances addObject:[NSNumber numberWithLong:toleranceBefore.value]]; - [_afterTolerances addObject:[NSNumber numberWithLong:toleranceAfter.value]]; + _beforeTolerance = [NSNumber numberWithLong:toleranceBefore.value]; + _afterTolerance = [NSNumber numberWithLong:toleranceAfter.value]; completionHandler(YES); } @end -@interface StubFVPAVPlayerFactory : NSObject +@interface StubFVPPlayerFactory : NSObject -@property(copy) StubAVPlayer *stubAVPlayer; +@property(nonatomic, strong) StubAVPlayer *stubAVPlayer; - (instancetype)initWithPlayer:(StubAVPlayer *)stubAVPlayer; @end -@implementation StubFVPAVPlayerFactory +@implementation StubFVPPlayerFactory - (instancetype)initWithPlayer:(StubAVPlayer *)stubAVPlayer { self = [super init]; @@ -276,17 +267,16 @@ - (void)testTransformFix { [self validateTransformFixForOrientation:UIImageOrientationRightMirrored]; } -- (void)testSeekToleranceWhenSeekingToEndFix { +- (void)testSeekToleranceWhenNotSeekingToEnd { NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; StubAVPlayer *stubAVPlayer = [[StubAVPlayer alloc] init]; - StubFVPAVPlayerFactory *stubFVPAVPlayerFactory = - [[StubFVPAVPlayerFactory alloc] initWithPlayer:stubAVPlayer]; + StubFVPPlayerFactory *stubFVPPlayerFactory = + [[StubFVPPlayerFactory alloc] initWithPlayer:stubAVPlayer]; FLTVideoPlayerPlugin *pluginWithMockAVPlayer = - [[FLTVideoPlayerPlugin alloc] initWithFVPAVPlayerFactory:stubFVPAVPlayerFactory - registrar:registrar]; + [[FLTVideoPlayerPlugin alloc] initWithPlayerFactory:stubFVPPlayerFactory registrar:registrar]; FlutterError *error; [pluginWithMockAVPlayer initialize:&error]; @@ -309,19 +299,46 @@ - (void)testSeekToleranceWhenSeekingToEndFix { [initializedExpectation fulfill]; }]; - XCTestExpectation *initializedExpectationEnd = + [self waitForExpectationsWithTimeout:30.0 handler:nil]; + XCTAssertEqual([stubAVPlayer.beforeTolerance intValue], 0); + XCTAssertEqual([stubAVPlayer.afterTolerance intValue], 0); +} + +- (void)testSeekToleranceWhenSeekingToEnd { + NSObject *registry = + (NSObject *)[[UIApplication sharedApplication] delegate]; + NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; + + StubAVPlayer *stubAVPlayer = [[StubAVPlayer alloc] init]; + StubFVPPlayerFactory *stubFVPPlayerFactory = + [[StubFVPPlayerFactory alloc] initWithPlayer:stubAVPlayer]; + FLTVideoPlayerPlugin *pluginWithMockAVPlayer = + [[FLTVideoPlayerPlugin alloc] initWithPlayerFactory:stubFVPPlayerFactory registrar:registrar]; + + FlutterError *error; + [pluginWithMockAVPlayer initialize:&error]; + XCTAssertNil(error); + + FLTCreateMessage *create = [FLTCreateMessage + makeWithAsset:nil + uri:@"https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4" + packageName:nil + formatHint:nil + httpHeaders:@{}]; + FLTTextureMessage *textureMessage = [pluginWithMockAVPlayer create:create error:&error]; + NSNumber *textureId = textureMessage.textureId; + + XCTestExpectation *initializedExpectation = [self expectationWithDescription:@"seekTo has non-zero tolerance when seeking to end"]; // The duration of this video is "0" due to the non standard initiliatazion process. - FLTPositionMessage *messageEnd = [FLTPositionMessage makeWithTextureId:textureId position:@0]; - [pluginWithMockAVPlayer seekTo:messageEnd + FLTPositionMessage *message = [FLTPositionMessage makeWithTextureId:textureId position:@0]; + [pluginWithMockAVPlayer seekTo:message completion:^(FlutterError *_Nullable error) { - [initializedExpectationEnd fulfill]; + [initializedExpectation fulfill]; }]; [self waitForExpectationsWithTimeout:30.0 handler:nil]; - XCTAssertEqual([[stubAVPlayer.beforeTolerances objectAtIndex:0] intValue], 0); - XCTAssertEqual([[stubAVPlayer.afterTolerances objectAtIndex:0] intValue], 0); - XCTAssertGreaterThan([[stubAVPlayer.beforeTolerances objectAtIndex:1] intValue], 0); - XCTAssertGreaterThan([[stubAVPlayer.afterTolerances objectAtIndex:1] intValue], 0); + XCTAssertGreaterThan([stubAVPlayer.beforeTolerance intValue], 0); + XCTAssertGreaterThan([stubAVPlayer.afterTolerance intValue], 0); } - (NSDictionary *)testPlugin:(FLTVideoPlayerPlugin *)videoPlayerPlugin diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index df6e57d7c86..ccece112769 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -34,10 +34,10 @@ - (void)onDisplayLink:(CADisplayLink *)link { } @end -@interface FVPDefaultAVPlayerFactory : NSObject +@interface FVPDefaultPlayerFactory : NSObject @end -@implementation FVPDefaultAVPlayerFactory +@implementation FVPDefaultPlayerFactory - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem { return [AVPlayer playerWithPlayerItem:playerItem]; } @@ -64,7 +64,7 @@ @interface FLTVideoPlayer : NSObject - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id)playerFactory; + playerFactory:(id)playerFactory; @end static void *timeRangeContext = &timeRangeContext; @@ -79,7 +79,7 @@ - (instancetype)initWithURL:(NSURL *)url @implementation FLTVideoPlayer - (instancetype)initWithAsset:(NSString *)asset frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { NSString *path = [[NSBundle mainBundle] pathForResource:asset ofType:nil]; return [self initWithURL:[NSURL fileURLWithPath:path] frameUpdater:frameUpdater @@ -221,7 +221,7 @@ - (void)createVideoOutputAndDisplayLink:(FLTFrameUpdater *)frameUpdater { - (instancetype)initWithURL:(NSURL *)url frameUpdater:(FLTFrameUpdater *)frameUpdater httpHeaders:(nonnull NSDictionary *)headers - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { NSDictionary *options = nil; if ([headers count] != 0) { options = @{@"AVURLAssetHTTPHeaderFieldsKey" : headers}; @@ -233,7 +233,7 @@ - (instancetype)initWithURL:(NSURL *)url - (instancetype)initWithPlayerItem:(AVPlayerItem *)item frameUpdater:(FLTFrameUpdater *)frameUpdater - playerFactory:(id)playerFactory { + playerFactory:(id)playerFactory { self = [super init]; NSAssert(self, @"super init cannot be nil"); @@ -548,7 +548,7 @@ @interface FLTVideoPlayerPlugin () @property(readonly, strong, nonatomic) NSMutableDictionary *playersByTextureId; @property(readonly, strong, nonatomic) NSObject *registrar; -@property(nonatomic, strong) id playerFactory; +@property(nonatomic, strong) id playerFactory; @end @implementation FLTVideoPlayerPlugin @@ -559,12 +559,11 @@ + (void)registerWithRegistrar:(NSObject *)registrar { } - (instancetype)initWithRegistrar:(NSObject *)registrar { - return [self initWithFVPAVPlayerFactory:[[FVPDefaultAVPlayerFactory alloc] init] - registrar:registrar]; + return [self initWithPlayerFactory:[[FVPDefaultPlayerFactory alloc] init] registrar:registrar]; } -- (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory - registrar:(NSObject *)registrar { +- (instancetype)initWithPlayerFactory:(id)playerFactory + registrar:(NSObject *)registrar { self = [super init]; NSAssert(self, @"super init cannot be nil"); _registry = [registrar textures]; diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h index 10caec9ee33..4c52ba00f96 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin_Test.h @@ -7,12 +7,12 @@ #import // Protocol for an AVPlayer instance factory. Used for injecting players in tests. -@protocol FVPAVPlayerFactoryProtocol +@protocol FVPPlayerFactory - (AVPlayer *)playerWithPlayerItem:(AVPlayerItem *)playerItem; @end @interface FLTVideoPlayerPlugin () -- (instancetype)initWithFVPAVPlayerFactory:(id)playerFactory - registrar:(NSObject *)registrar; +- (instancetype)initWithPlayerFactory:(id)playerFactory + registrar:(NSObject *)registrar; @end From fb9b9b8a001a0e3d12a7f893c4a4d0547ea30c23 Mon Sep 17 00:00:00 2001 From: Tarrin Neal Date: Thu, 11 May 2023 10:33:20 -0700 Subject: [PATCH 18/19] rename plugin registrar --- .../example/ios/RunnerTests/VideoPlayerTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index b83eec66ed3..042ac158f1a 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -307,7 +307,7 @@ - (void)testSeekToleranceWhenNotSeekingToEnd { - (void)testSeekToleranceWhenSeekingToEnd { NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; - NSObject *registrar = [registry registrarForPlugin:@"TestSeekTolerance"]; + NSObject *registrar = [registry registrarForPlugin:@"TestSeekToEndTolerance"]; StubAVPlayer *stubAVPlayer = [[StubAVPlayer alloc] init]; StubFVPPlayerFactory *stubFVPPlayerFactory = From 7aeb3db7eb14f2d60a93dbc523a38cd0fe85b382 Mon Sep 17 00:00:00 2001 From: Tarrin Neal Date: Thu, 11 May 2023 10:49:34 -0700 Subject: [PATCH 19/19] format --- .../example/ios/RunnerTests/VideoPlayerTests.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 042ac158f1a..a9d7eac073d 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -307,7 +307,8 @@ - (void)testSeekToleranceWhenNotSeekingToEnd { - (void)testSeekToleranceWhenSeekingToEnd { NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; - NSObject *registrar = [registry registrarForPlugin:@"TestSeekToEndTolerance"]; + NSObject *registrar = + [registry registrarForPlugin:@"TestSeekToEndTolerance"]; StubAVPlayer *stubAVPlayer = [[StubAVPlayer alloc] init]; StubFVPPlayerFactory *stubFVPPlayerFactory =