Created
February 5, 2021 18:28
-
-
Save EyMaddis/273d365e78dfff112a3eed07ab07c55b to your computer and use it in GitHub Desktop.
React Native Google Cast MiniPlayer Base Implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function ExampleComp() { | |
// height is necessary otherwise it will be 0 | |
return <View style={{ height: 60 }}> | |
<RNGoogleCastMiniPlayer style={{ flex: 1 }} /> | |
</View> | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <React/RCTView.h> | |
@interface RNGoogleCastMiniPlayer : RCTView | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <GoogleCast/GoogleCast.h> | |
#import "RNGoogleCastMiniPlayer.h" | |
#import "RNGoogleCastMiniPlayerControllerViewController.h" | |
#import <React/RCTView.h> | |
@implementation RNGoogleCastMiniPlayer : RCTView | |
{ | |
RNGoogleCastMiniPlayerControllerViewController *_viewController; | |
} | |
- (instancetype)init | |
{ | |
self = [super init]; | |
if (self) { | |
_viewController = [[RNGoogleCastMiniPlayerControllerViewController alloc] init]; | |
_viewController.view.frame = self.bounds; | |
[self addSubview:_viewController.view]; | |
} | |
return self; | |
} | |
-(void)layoutSubviews { | |
// GCKCastContext *castContext = [GCKCastContext sharedInstance]; | |
// GCKUIMiniMediaControlsViewController *miniPlayer = [castContext createMiniMediaControlsViiewController]; | |
// _miniplayer = [[GCKUIMiniMediaControlsViewController alloc] initWithFrame:self.bounds]; | |
_viewController.view.frame = self.bounds; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { requireNativeComponent, View } from 'react-native' | |
const RNGoogleCastMiniPlayer: typeof View = requireNativeComponent( | |
'RNGoogleCastMiniPlayer' | |
) | |
if (!RNGoogleCastMiniPlayer) { | |
throw new Error('RNGoogleCastMiniPlayer not accessible') | |
} | |
export { RNGoogleCastMiniPlayer } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <UIKit/UIKit.h> | |
NS_ASSUME_NONNULL_BEGIN | |
@interface RNGoogleCastMiniPlayerControllerViewController : UIViewController | |
@end | |
NS_ASSUME_NONNULL_END |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "RNGoogleCastMiniPlayerControllerViewController.h" | |
#import <GoogleCast/GoogleCast.h> | |
static const NSTimeInterval kCastControlBarsAnimationDuration = 0.20; | |
@interface RNGoogleCastMiniPlayerControllerViewController () <GCKUIMiniMediaControlsViewControllerDelegate> { | |
__weak IBOutlet UIView *_miniMediaControlsContainerView; | |
__weak IBOutlet NSLayoutConstraint *_miniMediaControlsHeightConstraint; | |
GCKUIMiniMediaControlsViewController *_miniMediaControlsViewController; | |
} | |
@property(nonatomic, weak, readwrite) UINavigationController *navigationController; | |
@property(nonatomic, assign, readwrite) BOOL miniMediaControlsViewEnabled; | |
@property(nonatomic, assign, readwrite) BOOL miniMediaControlsItemEnabled; | |
@end | |
@implementation RNGoogleCastMiniPlayerControllerViewController | |
- (void)viewDidLoad { | |
[super viewDidLoad]; | |
// this line in missing in the docs from Google Cast | |
_miniMediaControlsContainerView = self.view; | |
self.miniMediaControlsViewEnabled = YES; | |
GCKCastContext *castContext = [GCKCastContext sharedInstance]; | |
_miniMediaControlsViewController = | |
[castContext createMiniMediaControlsViewController]; | |
_miniMediaControlsViewController.delegate = self; | |
[self updateControlBarsVisibility]; | |
[self installViewController:_miniMediaControlsViewController | |
inContainerView:_miniMediaControlsContainerView]; | |
} | |
- (void)setMiniMediaControlsViewEnabled:(BOOL)miniMediaControlsViewEnabled { | |
_miniMediaControlsViewEnabled = miniMediaControlsViewEnabled; | |
if (self.isViewLoaded) { | |
[self updateControlBarsVisibility]; | |
} | |
} | |
- (void)updateControlBarsVisibility { | |
if (self.miniMediaControlsViewEnabled && | |
_miniMediaControlsViewController.active) { | |
_miniMediaControlsHeightConstraint.constant = | |
_miniMediaControlsViewController.minHeight; | |
[self.view bringSubviewToFront:_miniMediaControlsContainerView]; | |
} else { | |
_miniMediaControlsHeightConstraint.constant = 0; | |
} | |
[UIView animateWithDuration:kCastControlBarsAnimationDuration | |
animations:^{ | |
[self.view layoutIfNeeded]; | |
}]; | |
[self.view setNeedsLayout]; | |
} | |
- (void)installViewController:(UIViewController *)viewController | |
inContainerView:(UIView *)containerView { | |
if (viewController) { | |
[self addChildViewController:viewController]; | |
viewController.view.frame = containerView.bounds; | |
[containerView addSubview:viewController.view]; | |
[viewController didMoveToParentViewController:self]; | |
} | |
} | |
- (void)uninstallViewController:(UIViewController *)viewController { | |
[viewController willMoveToParentViewController:nil]; | |
[viewController.view removeFromSuperview]; | |
[viewController removeFromParentViewController]; | |
} | |
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | |
if ([segue.identifier isEqualToString:@"NavigationVCEmbedSegue"]) { | |
self.navigationController = | |
(UINavigationController *)segue.destinationViewController; | |
} | |
} | |
- (void)miniMediaControlsViewController:(nonnull GCKUIMiniMediaControlsViewController *)miniMediaControlsViewController shouldAppear:(BOOL)shouldAppear { | |
[self updateControlBarsVisibility]; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "RNGoogleCastMiniPlayer.h" | |
#import <GoogleCast/GoogleCast.h> | |
#import <GoogleCast/GCKCastContext.h> | |
#import <React/RCTViewManager.h> | |
@interface RNGoogleCastMiniPlayerManager : RCTViewManager | |
@end | |
@implementation RNGoogleCastMiniPlayerManager | |
{ | |
GCKUIMiniMediaControlsViewController *_miniplayer; | |
} | |
RCT_EXPORT_MODULE(RNGoogleCastMiniPlayer) | |
- (UIView *)view { | |
return [[RNGoogleCastMiniPlayer alloc] init]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment