From 8413ae5518fe4a345db3bc57b71401d4a6de71ba Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Thu, 9 Sep 2021 10:20:34 +0200 Subject: [PATCH] Added basic video playback on recordings (similar to Android) --- Classes/Base.lproj/RecordingsListView.xib | 47 +++++++++++++------- Classes/LinphoneUI/UILinphoneAudioPlayer.m | 10 ++++- Classes/LinphoneUI/UILinphoneAudioPlayer.xib | 18 ++++---- Classes/LinphoneUI/UIRecordingCell.m | 1 + Classes/LinphoneUI/UIRecordingCell.xib | 14 ++++-- Classes/RecordingsListView.h | 1 + Classes/RecordingsListView.m | 39 ++++++++++++++++ 7 files changed, 99 insertions(+), 31 deletions(-) diff --git a/Classes/Base.lproj/RecordingsListView.xib b/Classes/Base.lproj/RecordingsListView.xib index b3eeea75d..5132e66cd 100644 --- a/Classes/Base.lproj/RecordingsListView.xib +++ b/Classes/Base.lproj/RecordingsListView.xib @@ -1,8 +1,11 @@ - + + - + + + @@ -13,20 +16,21 @@ + - + - + - + - + - + + - - + + @@ -148,5 +157,11 @@ + + + + + + diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.m b/Classes/LinphoneUI/UILinphoneAudioPlayer.m index a52a66fbe..b1dcb41d7 100644 --- a/Classes/LinphoneUI/UILinphoneAudioPlayer.m +++ b/Classes/LinphoneUI/UILinphoneAudioPlayer.m @@ -19,6 +19,7 @@ #import "UILinphoneAudioPlayer.h" #import "Utils.h" +#import "PhoneMainView.h" @implementation UILinphoneAudioPlayer { @private @@ -40,7 +41,7 @@ - (instancetype)initWithFilePath:(NSString *)filePath { if (self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]]) { - player = linphone_core_create_local_player(LC, NULL, NULL, NULL); + player = linphone_core_create_local_player(LC, NULL, "IOSDisplay", NULL); cbs = linphone_player_get_callbacks(player); linphone_player_set_user_data(player, (__bridge void *)self); linphone_player_cbs_set_eof_reached(cbs, on_eof_reached); @@ -91,6 +92,12 @@ [_playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; [_stopButton setTitle:@"" forState:UIControlStateNormal]; [_stopButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemRefresh:[UIColor blackColor]] forState:UIControlStateNormal]; + if (linphone_player_get_is_video_available(player)) { + linphone_player_set_window_id(player, (__bridge void *)VIEW(RecordingsListView).videoView); + VIEW(RecordingsListView).videoView.hidden = NO; + } else { + VIEW(RecordingsListView).videoView.hidden = YES; + } } - (BOOL)isOpened { @@ -116,6 +123,7 @@ void on_eof_reached(LinphonePlayer *pl) { [player.playButton setImage:[UIImage imageFromSystemBarButton:UIBarButtonSystemItemPlay:[UIColor blackColor]] forState:UIControlStateNormal]; }); player->eofReached = YES; + VIEW(RecordingsListView).videoView.hidden = YES; } #pragma mark - ViewController methods diff --git a/Classes/LinphoneUI/UILinphoneAudioPlayer.xib b/Classes/LinphoneUI/UILinphoneAudioPlayer.xib index 1349da0cf..3e7e29729 100644 --- a/Classes/LinphoneUI/UILinphoneAudioPlayer.xib +++ b/Classes/LinphoneUI/UILinphoneAudioPlayer.xib @@ -1,11 +1,9 @@ - - - - + + - + @@ -23,7 +21,7 @@ - - - + @@ -74,7 +72,7 @@ - + diff --git a/Classes/LinphoneUI/UIRecordingCell.m b/Classes/LinphoneUI/UIRecordingCell.m index 4f09a495e..32b3a4933 100644 --- a/Classes/LinphoneUI/UIRecordingCell.m +++ b/Classes/LinphoneUI/UIRecordingCell.m @@ -112,6 +112,7 @@ static UILinphoneAudioPlayer *player; [player close]; } + VIEW(RecordingsListView).videoView.hidden = YES; player = [UILinphoneAudioPlayer audioPlayerWithFilePath:[self recording]]; [player.view removeFromSuperview]; diff --git a/Classes/LinphoneUI/UIRecordingCell.xib b/Classes/LinphoneUI/UIRecordingCell.xib index 189d5fe37..4646c053d 100644 --- a/Classes/LinphoneUI/UIRecordingCell.xib +++ b/Classes/LinphoneUI/UIRecordingCell.xib @@ -1,10 +1,11 @@ - + - + + @@ -34,10 +35,10 @@ - + + - @@ -47,4 +48,9 @@ + + + + + diff --git a/Classes/RecordingsListView.h b/Classes/RecordingsListView.h index 0cb5c0085..aa7face6c 100644 --- a/Classes/RecordingsListView.h +++ b/Classes/RecordingsListView.h @@ -40,6 +40,7 @@ typedef enum _RecordingSelectionMode { RecordingSelectionModeNone, RecordingSele @property(weak, nonatomic) IBOutlet UIButton *deleteButton; @property (strong, nonatomic) IBOutlet UIButton *backButton; @property (weak, nonatomic) IBOutlet UIInterfaceStyleButton *toggleSelectionButton; +@property (weak, nonatomic) IBOutlet UIView *videoView; - (IBAction)onDeleteClick:(id)sender; - (IBAction)onEditionChangeClick:(id)sender; diff --git a/Classes/RecordingsListView.m b/Classes/RecordingsListView.m index 4583f59c9..7420a9e37 100644 --- a/Classes/RecordingsListView.m +++ b/Classes/RecordingsListView.m @@ -66,6 +66,10 @@ static UICompositeViewDescription *compositeDescription = nil; [super viewDidLoad]; tableController.tableView.accessibilityIdentifier = @"Recordings table"; tableController.tableView.tableFooterView = [[UIView alloc] init]; + UIPanGestureRecognizer *dragndrop = + [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveVideoView:)]; + dragndrop.minimumNumberOfTouches = 1; + [_videoView addGestureRecognizer:dragndrop]; } - (void)viewWillAppear:(BOOL)animated { @@ -111,4 +115,39 @@ static UICompositeViewDescription *compositeDescription = nil; [PhoneMainView.instance popCurrentView]; } +#pragma mark VideoViewMoving + +- (void)moveVideoView:(UIPanGestureRecognizer *)dragndrop { + CGPoint center = [dragndrop locationInView:_videoView.superview]; + _videoView.center = center; + if (dragndrop.state == UIGestureRecognizerStateEnded) { + [self previewTouchLift]; + } +} + +- (CGFloat)coerce:(CGFloat)value betweenMin:(CGFloat)min andMax:(CGFloat)max { + return MAX(min, MIN(value, max)); +} + +- (void)previewTouchLift { + CGRect previewFrame = _videoView.frame; + previewFrame.origin.x = [self coerce:previewFrame.origin.x + betweenMin:5 + andMax:(UIScreen.mainScreen.bounds.size.width - 5 - previewFrame.size.width)]; + previewFrame.origin.y = [self coerce:previewFrame.origin.y + betweenMin:5 + andMax:(UIScreen.mainScreen.bounds.size.height - 5 - previewFrame.size.height)]; + + if (!CGRectEqualToRect(previewFrame, _videoView.frame)) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [UIView animateWithDuration:0.3 + animations:^{ + LOGD(@"Recentering preview to %@", NSStringFromCGRect(previewFrame)); + _videoView.frame = previewFrame; + }]; + }); + } +} + + @end