VLCMiniPlaybackView.m 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*****************************************************************************
  2. * VLCMiniPlaybackView.m
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2015 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Author: Felix Paul Kühne <fkuehne # videolan.org>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. #import "VLCMiniPlaybackView.h"
  13. #import "VLCPlaybackController.h"
  14. #import "VLCAppDelegate.h"
  15. #import "VLCPlaylistViewController.h"
  16. @interface VLCMiniPlaybackView () <VLCPlaybackControllerDelegate>
  17. {
  18. UIImageView *_artworkView;
  19. UIView *_videoView;
  20. UIButton *_previousButton;
  21. UIButton *_playPauseButton;
  22. UIButton *_nextButton;
  23. UIButton *_expandButton;
  24. UILabel *_metaDataLabel;
  25. }
  26. @end
  27. @implementation VLCMiniPlaybackView
  28. - (instancetype)initWithFrame:(CGRect)viewFrame
  29. {
  30. self = [super initWithFrame:viewFrame];
  31. if (!self)
  32. return self;
  33. CGRect previousRect;
  34. CGFloat buttonSize = 44.;
  35. _artworkView = [[UIImageView alloc] initWithFrame:CGRectMake(0., 0., 60., 60.)];
  36. _artworkView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
  37. _artworkView.backgroundColor = [UIColor VLCDarkBackgroundColor];
  38. _artworkView.opaque = YES;
  39. [self addSubview:_artworkView];
  40. /* build buttons from right to left */
  41. _expandButton = [UIButton buttonWithType:UIButtonTypeCustom];
  42. [_expandButton setImage:[UIImage imageNamed:@"ratioIcon"] forState:UIControlStateNormal];
  43. _expandButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  44. [_expandButton addTarget:self action:@selector(pushFullPlaybackView:) forControlEvents:UIControlEventTouchUpInside];
  45. _expandButton.frame = previousRect = CGRectMake(viewFrame.size.width - buttonSize, (viewFrame.size.height - buttonSize) / 2., buttonSize, buttonSize);
  46. [self addSubview:_expandButton];
  47. _nextButton = [UIButton buttonWithType:UIButtonTypeCustom];
  48. [_nextButton setImage:[UIImage imageNamed:@"forwardIcon"] forState:UIControlStateNormal];
  49. [_nextButton sizeToFit];
  50. _nextButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  51. [_nextButton addTarget:self action:@selector(nextAction:) forControlEvents:UIControlEventTouchUpInside];
  52. _nextButton.frame = previousRect = CGRectMake(previousRect.origin.x - buttonSize, (viewFrame.size.height - buttonSize) / 2., buttonSize, buttonSize);
  53. [self addSubview:_nextButton];
  54. _playPauseButton = [UIButton buttonWithType:UIButtonTypeCustom];
  55. [_playPauseButton setImage:[UIImage imageNamed:@"playIcon"] forState:UIControlStateNormal];
  56. [_playPauseButton sizeToFit];
  57. _playPauseButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  58. [_playPauseButton addTarget:self action:@selector(playPauseAction:) forControlEvents:UIControlEventTouchUpInside];
  59. _playPauseButton.frame = previousRect = CGRectMake(previousRect.origin.x - buttonSize, (viewFrame.size.height - buttonSize) / 2., buttonSize, buttonSize);
  60. [self addSubview:_playPauseButton];
  61. _previousButton = [UIButton buttonWithType:UIButtonTypeCustom];
  62. [_previousButton setImage:[UIImage imageNamed:@"backIcon"] forState:UIControlStateNormal];
  63. [_previousButton sizeToFit];
  64. _previousButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  65. [_previousButton addTarget:self action:@selector(previousAction:) forControlEvents:UIControlEventTouchUpInside];
  66. _previousButton.frame = previousRect = CGRectMake(previousRect.origin.x - buttonSize, (viewFrame.size.height - buttonSize) / 2., buttonSize, buttonSize);
  67. [self addSubview:_previousButton];
  68. CGFloat artworkViewWidth = _artworkView.frame.size.width;
  69. _metaDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(artworkViewWidth + 10., 0., previousRect.origin.x - artworkViewWidth - 10., viewFrame.size.height)];
  70. _metaDataLabel.font = [UIFont systemFontOfSize:12.];
  71. _metaDataLabel.textColor = [UIColor VLCLightTextColor];
  72. _metaDataLabel.numberOfLines = 0;
  73. _metaDataLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  74. [self addSubview:_metaDataLabel];
  75. return self;
  76. }
  77. - (void)previousAction:(id)sender
  78. {
  79. [[VLCPlaybackController sharedInstance] backward];
  80. }
  81. - (void)playPauseAction:(id)sender
  82. {
  83. [[VLCPlaybackController sharedInstance] playPause];
  84. }
  85. - (void)nextAction:(id)sender
  86. {
  87. [[VLCPlaybackController sharedInstance] forward];
  88. }
  89. - (void)pushFullPlaybackView:(id)sender
  90. {
  91. [VLCPlaybackController sharedInstance].videoOutputView = nil;
  92. VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
  93. [appDelegate presentMovieViewController];
  94. }
  95. - (void)setupForWork
  96. {
  97. VLCPlaybackController *playbackController = [VLCPlaybackController sharedInstance];
  98. if (playbackController.isPlaying)
  99. [_playPauseButton setImage:[UIImage imageNamed:@"pauseIcon"] forState:UIControlStateNormal];
  100. else
  101. [_playPauseButton setImage:[UIImage imageNamed:@"playIcon"] forState:UIControlStateNormal];
  102. playbackController.delegate = self;
  103. [playbackController recoverDisplayedMetadata];
  104. }
  105. - (void)mediaPlayerStateChanged:(VLCMediaPlayerState)currentState
  106. isPlaying:(BOOL)isPlaying
  107. currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
  108. currentMediaHasChapters:(BOOL)currentMediaHasChapters
  109. forPlaybackController:(VLCPlaybackController *)controller
  110. {
  111. UIImage *playPauseImage = isPlaying ? [UIImage imageNamed:@"pauseIcon"] : [UIImage imageNamed:@"playIcon"];
  112. [_playPauseButton setImage:playPauseImage forState:UIControlStateNormal];
  113. }
  114. - (void)displayMetadataForPlaybackController:(VLCPlaybackController *)controller
  115. title:(NSString *)title
  116. artwork:(UIImage *)artwork
  117. artist:(NSString *)artist
  118. album:(NSString *)album
  119. audioOnly:(BOOL)audioOnly
  120. {
  121. if (audioOnly) {
  122. _artworkView.contentMode = UIViewContentModeScaleAspectFill;
  123. _artworkView.image = artwork ? artwork : [UIImage imageNamed:@"no-artwork"];
  124. if (_videoView) {
  125. [_videoView removeFromSuperview];
  126. _videoView = nil;
  127. }
  128. } else {
  129. _artworkView.image = nil;
  130. if (_videoView) {
  131. [_videoView removeFromSuperview];
  132. _videoView = nil;
  133. }
  134. _videoView = [[UIView alloc] initWithFrame:_artworkView.frame];
  135. [_videoView setClipsToBounds:YES];
  136. [self addSubview:_videoView];
  137. if (!controller.presentingMovieViewController)
  138. controller.videoOutputView = _videoView;
  139. }
  140. NSString *metaDataString;
  141. if (artist)
  142. metaDataString = artist;
  143. if (album)
  144. metaDataString = [metaDataString stringByAppendingFormat:@" — %@", album];
  145. if (metaDataString)
  146. metaDataString = [metaDataString stringByAppendingFormat:@"\n%@", title];
  147. else
  148. metaDataString = title;
  149. _metaDataLabel.text = metaDataString;
  150. }
  151. - (void)presentingViewControllerShouldBeClosed:(VLCPlaybackController *)controller
  152. {
  153. VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
  154. [appDelegate.playlistViewController displayMiniPlaybackViewIfNeeded];
  155. }
  156. - (void)presentingViewControllerShouldBeClosedAfterADelay:(VLCPlaybackController *)controller
  157. {
  158. [self presentingViewControllerShouldBeClosed:controller];
  159. }
  160. @end