// // YouTubePlayer.m // // Created by Robert on 18/12/2009. // #import "YouTubePlayer.h" #import "SystemConfiguration/SCNetworkReachability.h" #import NSString * template = @"
"
					   ""
					   ""
					   "
" "" "" "" "
"; @interface YouTubePlayer (PrivateMethods) - (UIButton *)findButtonInView:(UIView *)view; - (Boolean) connectedToNetwork; @end @implementation YouTubePlayer #pragma mark --------------------------------------------------------- #pragma mark === End Constructor / Destructor Functions === #pragma mark --------------------------------------------------------- // ------------------------------------------------------------------- // Initialization // ------------------------------------------------------------------- - (id) init { if ( self = [super init] ) { background = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [background setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5f]]; [background setOpaque:TRUE]; [background setUserInteractionEnabled:FALSE]; [background setClipsToBounds:FALSE]; webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [webView setHidden:TRUE]; [webView setDelegate:self]; activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; [activityIndicator setHidesWhenStopped:FALSE]; [activityIndicator setCenter:CGPointMake(160, 240)]; [background addSubview:webView]; [background addSubview:activityIndicator]; } return self; } // ------------------------------------------------------------------- // dealloc // ------------------------------------------------------------------- - (void)dealloc { [background release]; [webView release]; [activityIndicator release]; [super dealloc]; } #pragma mark --------------------------------------------------------- #pragma mark === End Constructor / Destructor Functions === #pragma mark --------------------------------------------------------- #pragma mark --------------------------------------------------------- #pragma mark === Public Functions === #pragma mark --------------------------------------------------------- // ------------------------------------------------------------------- // trigger the video to playback // ------------------------------------------------------------------- - (void) playbackVideo:(NSString*)_videoID InView:(UIView*)_view { [[_view window] addSubview:background]; if ( [self connectedToNetwork] ) { NSString * htmlString = [NSString stringWithFormat:template, _videoID, _videoID, nil]; [webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"http://youtube.com"]]; } else { UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Unable to download Movie." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert autorelease]; } } #pragma mark --------------------------------------------------------- #pragma mark === End Public Functions === #pragma mark --------------------------------------------------------- #pragma mark --------------------------------------------------------- #pragma mark === Private Functions === #pragma mark --------------------------------------------------------- // ------------------------------------------------------------------- // find the button in the view // ------------------------------------------------------------------- - (UIButton *)findButtonInView:(UIView *)view { UIButton *button = nil; if ([view isMemberOfClass:[UIButton class]]) { return (UIButton *)view; } if (view.subviews && [view.subviews count] > 0) { for (UIView *subview in view.subviews) { button = [self findButtonInView:subview]; if (button) return button; } } return button; } // ------------------------------------------------------------------- // Check to see if we are connected to a network // ------------------------------------------------------------------- - (Boolean) connectedToNetwork { // Create zero addy struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; // Recover reachability flags SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); SCNetworkReachabilityFlags flags; BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) { printf("Error. Could not recover network reachability flags\n"); return NO; } BOOL isReachable = flags & kSCNetworkFlagsReachable; BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; return (isReachable && !needsConnection) ? YES : NO; } #pragma mark --------------------------------------------------------- #pragma mark === End Private Functions === #pragma mark --------------------------------------------------------- #pragma mark --------------------------------------------------------- #pragma mark === UIWebViewDelegate Functions === #pragma mark --------------------------------------------------------- // ------------------------------------------------------------------- // Sent before a web view begins loading content // ------------------------------------------------------------------- - (BOOL)webView:(UIWebView *)_webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSLog( [[request mainDocumentURL] absoluteString] ); return TRUE; } // ------------------------------------------------------------------- // Sent if a web view failed to load content. // ------------------------------------------------------------------- - (void)webView:(UIWebView *)_webView didFailLoadWithError:(NSError *)error { UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = NO; [activityIndicator stopAnimating]; // alert the user of the fail UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert autorelease]; } // ------------------------------------------------------------------- // Sent after a web view starts loading content. // ------------------------------------------------------------------- - (void)webViewDidStartLoad:(UIWebView *)_webView { UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO [activityIndicator startAnimating]; } // ------------------------------------------------------------------- // web view had finished loading // ------------------------------------------------------------------- - (void)webViewDidFinishLoad:(UIWebView *)_webView { // remove the background [background removeFromSuperview]; // stop the activity indicators UIApplication* app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = NO; [activityIndicator stopAnimating]; // trigger the youtube video to play UIButton *b = [self findButtonInView:_webView]; [b sendActionsForControlEvents:UIControlEventTouchUpInside]; } #pragma mark --------------------------------------------------------- #pragma mark === End UIWebViewDelegate Functions === #pragma mark --------------------------------------------------------- #pragma mark --------------------------------------------------------- #pragma mark === UIAlertViewDelegate Functions === #pragma mark --------------------------------------------------------- // ------------------------------------------------------------------- // Deal with the alert view responce // ------------------------------------------------------------------- - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { [background removeFromSuperview]; } #pragma mark --------------------------------------------------------- #pragma mark === End UIAlertViewDelegate Functions === #pragma mark --------------------------------------------------------- @end