From d7514e6bf3e9889ea8b41d1103d0772a0e15e5f4 Mon Sep 17 00:00:00 2001 From: Evan Chen Date: Wed, 28 Sep 2011 22:51:38 -0700 Subject: [PATCH 01/33] Added an open in external application link for when linking to doc files or pdfs. --- .../ChildBrowser/ChildBrowserViewController.h | 8 +- .../ChildBrowser/ChildBrowserViewController.m | 49 ++- .../ChildBrowserViewController.xib | 404 +++++------------- 3 files changed, 164 insertions(+), 297 deletions(-) diff --git a/iPhone/ChildBrowser/ChildBrowserViewController.h b/iPhone/ChildBrowser/ChildBrowserViewController.h index 87676142..1d629ed0 100644 --- a/iPhone/ChildBrowser/ChildBrowserViewController.h +++ b/iPhone/ChildBrowser/ChildBrowserViewController.h @@ -31,14 +31,18 @@ IBOutlet UIBarButtonItem* backBtn; IBOutlet UIBarButtonItem* fwdBtn; IBOutlet UIBarButtonItem* safariBtn; + IBOutlet UIBarButtonItem* documentBtn; IBOutlet UIActivityIndicatorView* spinner; + UIDocumentInteractionController* docController; BOOL scaleEnabled; BOOL isImage; NSString* imageURL; NSArray* supportedOrientations; id delegate; + id docControllerDelegate; } +@property (retain) UIDocumentInteractionController* docController; @property (nonatomic, retain)id delegate; @property (nonatomic, retain) NSArray* supportedOrientations; @property(retain) NSString* imageURL; @@ -48,7 +52,9 @@ - (ChildBrowserViewController*)initWithScale:(BOOL)enabled; - (IBAction)onDoneButtonPress:(id)sender; - (IBAction)onSafariButtonPress:(id)sender; +- (IBAction)onDocumentButtonPress:(id)sender; +- (UIDocumentInteractionController *)setupControllerWithURL:(NSURL *)fileURL usingDelegate:(id )interactionDelegate; - (void)loadURL:(NSString*)url; --(void)closeBrowser; +- (void)closeBrowser; @end diff --git a/iPhone/ChildBrowser/ChildBrowserViewController.m b/iPhone/ChildBrowser/ChildBrowserViewController.m index 6fc9cce4..3f4464b0 100644 --- a/iPhone/ChildBrowser/ChildBrowserViewController.m +++ b/iPhone/ChildBrowser/ChildBrowserViewController.m @@ -14,6 +14,7 @@ @implementation ChildBrowserViewController @synthesize supportedOrientations; @synthesize isImage; @synthesize delegate; +@synthesize docController; /* // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. @@ -94,8 +95,9 @@ - (void)dealloc { [backBtn release]; [fwdBtn release]; [safariBtn release]; + [documentBtn release]; [spinner release]; - [ supportedOrientations release]; + [supportedOrientations release]; [super dealloc]; } @@ -136,11 +138,52 @@ -(IBAction) onSafariButtonPress:(id)sender { NSURLRequest *request = webView.request; [[UIApplication sharedApplication] openURL:request.URL]; - } + } +} - + +- (IBAction)onDocumentButtonPress:(id)sender +{ + NSURLRequest *request = webView.request; + NSURL *url = request.URL; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *filePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0],@"child_browser_temp.pdf"]; + + NSData *urlData = [NSData dataWithContentsOfURL:url]; + [urlData writeToFile:filePath atomically:YES]; + + docController = [[self setupControllerWithURL:[NSURL fileURLWithPath:filePath] usingDelegate:docControllerDelegate] retain]; + + if (docController) + { + BOOL canOpen = [docController presentOpenInMenuFromBarButtonItem:documentBtn animated:NO]; + [docController dismissMenuAnimated:NO]; + + if (canOpen) + { + [docController presentOpenInMenuFromBarButtonItem:documentBtn animated:YES]; + } + else + { + UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Sorry!" message:@"No applications were found that support this filetype." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; + [message show]; + [message release]; + } + } } + +- (UIDocumentInteractionController *)setupControllerWithURL:(NSURL *)fileURL usingDelegate:(id )interactionDelegate { + + UIDocumentInteractionController *interactionController = + [UIDocumentInteractionController interactionControllerWithURL: fileURL]; + interactionController.delegate = interactionDelegate; + + return interactionController; +} + + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { BOOL autoRotate = [self.supportedOrientations count] > 1; // autorotate if only more than 1 orientation supported diff --git a/iPhone/ChildBrowser/ChildBrowserViewController.xib b/iPhone/ChildBrowser/ChildBrowserViewController.xib index cc8dd659..fb034046 100644 --- a/iPhone/ChildBrowser/ChildBrowserViewController.xib +++ b/iPhone/ChildBrowser/ChildBrowserViewController.xib @@ -2,16 +2,23 @@ 768 - 10K540 - 851 - 1038.36 - 461.00 + 11B26 + 1617 + 1138 + 566.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 141 + 534 - + YES + IBProxyObject + IBUIBarButtonItem + IBUILabel + IBUIToolbar + IBUIActivityIndicatorView + IBUIWebView + IBUIView YES @@ -22,9 +29,7 @@ YES - - YES - + YES @@ -37,16 +42,17 @@ IBCocoaTouchFramework - + 292 YES -2147483374 - {480, 229} + {{0, 71}, {480, 229}} - + + 1 MCAwIDAAA @@ -59,9 +65,10 @@ - 266 - {{0, 256}, {480, 44}} + 290 + {480, 44} + NO NO @@ -90,6 +97,10 @@ 5 + + NSImage + arrow_left.png + IBCocoaTouchFramework 32 @@ -100,6 +111,10 @@ 5 + + NSImage + arrow_right.png + IBCocoaTouchFramework 32 @@ -110,6 +125,10 @@ 5 + + NSImage + compass.png + IBCocoaTouchFramework 32 @@ -119,13 +138,19 @@ 5 + + IBCocoaTouchFramework + + 9 + - 270 - {{5, 230}, {418, 21}} + 294 + {{7, 46}, {418, 21}} + 4 @@ -153,8 +178,10 @@ -2147483383 - {{454, 231}, {20, 20}} + {{453, 47}, {20, 20}} + + NO NO NO @@ -162,7 +189,9 @@ {{0, 20}, {480, 300}} - + + + 3 MC41AA @@ -172,6 +201,7 @@ + 3 3 IBCocoaTouchFramework @@ -284,6 +314,22 @@ 40 + + + documentBtn + + + + 43 + + + + onDocumentButtonPress: + + + + 44 + @@ -337,6 +383,7 @@ + @@ -404,6 +451,14 @@ + + 42 + + + YES + + + @@ -411,24 +466,22 @@ YES -1.CustomClassName + -1.IBPluginDependency -2.CustomClassName - 1.IBEditorWindowLastContentRect + -2.IBPluginDependency 1.IBPluginDependency 10.IBPluginDependency 11.IBPluginDependency 13.IBPluginDependency - 13.IBViewBoundsToFrameTransform 14.IBPluginDependency 15.IBPluginDependency 32.IBPluginDependency - 32.IBViewBoundsToFrameTransform 37.IBPluginDependency 38.IBPluginDependency 39.IBPluginDependency 4.IBPluginDependency - 4.IBViewBoundsToFrameTransform + 42.IBPluginDependency 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform 7.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency @@ -436,32 +489,22 @@ YES ChildBrowserViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder - {{250, 643}, {480, 320}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAwygAAA - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABD5gAAw3kAAA - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB8AAAwwUAAA - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw10AAA - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -470,20 +513,16 @@ YES - - YES - + YES - - YES - + - 40 + 44 @@ -495,6 +534,7 @@ YES YES + onDocumentButtonPress: onDoneButtonPress: onSafariButtonPress: @@ -502,17 +542,23 @@ YES id id + id YES YES + onDocumentButtonPress: onDoneButtonPress: onSafariButtonPress: YES + + onDocumentButtonPress: + id + onDoneButtonPress: id @@ -530,7 +576,7 @@ addressLabel backBtn closeBtn - delegate + documentBtn fwdBtn refreshBtn safariBtn @@ -542,7 +588,7 @@ UILabel UIBarButtonItem UIBarButtonItem - id + UIBarButtonItem UIBarButtonItem UIBarButtonItem UIBarButtonItem @@ -557,7 +603,7 @@ addressLabel backBtn closeBtn - delegate + documentBtn fwdBtn refreshBtn safariBtn @@ -579,8 +625,8 @@ UIBarButtonItem - delegate - id + documentBtn + UIBarButtonItem fwdBtn @@ -606,249 +652,7 @@ IBProjectSource - Plugins/ChildBrowser/ChildBrowserViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIActivityIndicatorView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIActivityIndicatorView.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h + ./Classes/ChildBrowserViewController.h @@ -868,8 +672,22 @@ YES - 3 - 141 + + YES + + YES + arrow_left.png + arrow_right.png + compass.png + + + YES + {24, 24} + {24, 24} + {24, 24} + + + 534 From 58ca387de81c7ba88ae568729582be193c8557f6 Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 5 Oct 2011 00:08:22 -0700 Subject: [PATCH 02/33] Recommit of lost code from destroyed fork. --- iPhone/GoogleAnalytics/GoogSDK/GANTracker.h | 96 ++++++++++++++++++ .../GoogSDK/libGoogleAnalytics.a | Bin 0 -> 704332 bytes .../GoogleAnalytics/GoogleAnalyticsPlugin.h | 22 ++++ .../GoogleAnalytics/GoogleAnalyticsPlugin.js | 51 ++++++++++ .../GoogleAnalytics/GoogleAnalyticsPlugin.m | 81 +++++++++++++++ iPhone/GoogleAnalytics/README | 40 ++++++++ 6 files changed, 290 insertions(+) create mode 100644 iPhone/GoogleAnalytics/GoogSDK/GANTracker.h create mode 100644 iPhone/GoogleAnalytics/GoogSDK/libGoogleAnalytics.a create mode 100644 iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.h create mode 100755 iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.js create mode 100644 iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.m create mode 100755 iPhone/GoogleAnalytics/README diff --git a/iPhone/GoogleAnalytics/GoogSDK/GANTracker.h b/iPhone/GoogleAnalytics/GoogSDK/GANTracker.h new file mode 100644 index 00000000..23ad52d0 --- /dev/null +++ b/iPhone/GoogleAnalytics/GoogSDK/GANTracker.h @@ -0,0 +1,96 @@ +// +// GANTracker.h +// Google Analytics iPhone SDK. +// Version: 1.1 +// +// Copyright 2009 Google Inc. All rights reserved. +// + +extern NSString* const kGANTrackerErrorDomain; +extern NSInteger const kGANTrackerNotStartedError; +extern NSInteger const kGANTrackerInvalidInputError; +extern NSInteger const kGANTrackerEventsPerSessionLimitError; +extern NSUInteger const kGANMaxCustomVariables; +extern NSUInteger const kGANMaxCustomVariableLength; +extern NSUInteger const kGANVisitorScope; +extern NSUInteger const kGANSessionScope; +extern NSUInteger const kGANPageScope; + +@protocol GANTrackerDelegate; +typedef struct __GANTrackerPrivate GANTrackerPrivate; + +// Google Analytics tracker interface. Tracked pageviews and events are stored +// in a persistent store and dispatched in the background to the server. +@interface GANTracker : NSObject { + @private + GANTrackerPrivate *private_; +} + +// Singleton instance of this class for convenience. ++ (GANTracker *)sharedTracker; + +// Start the tracker by specifying a Google Analytics account ID and a +// dispatch period (in seconds) to dispatch events to the server +// (or -1 to dispatch manually). An optional delegate may be +// supplied. +- (void)startTrackerWithAccountID:(NSString *)accountID + dispatchPeriod:(NSInteger)dispatchPeriod + delegate:(id)delegate; + +// Stop the tracker. +- (void)stopTracker; + +// Track a page view. The pageURL must start with a forward +// slash '/'. Returns YES on success or NO on error (with outErrorOrNULL +// set to the specific error). +- (BOOL)trackPageview:(NSString *)pageURL + withError:(NSError **)error; + +// Track an event. The category and action are required. The label and +// value are optional (specify nil for no label and -1 or any negative integer +// for no value). Returns YES on success or NO on error (with outErrorOrNULL +// set to the specific error). +- (BOOL)trackEvent:(NSString *)category + action:(NSString *)action + label:(NSString *)label + value:(NSInteger)value + withError:(NSError **)error; + +// Set a custom variable. visitor and session scoped custom variables are stored +// for later use. Session and page scoped custom variables are attached to each +// event. Visitor scoped custom variables are sent only on the first event for +// a session. +- (BOOL)setCustomVariableAtIndex:(NSUInteger)index + name:(NSString *)name + value:(NSString *)value + scope:(NSUInteger)scope + withError:(NSError **)error; + +// Set a page scoped custom variable. The variable set is returned with the +// next event only. It will overwrite any existing visitor or session scoped +// custom variables. +- (BOOL)setCustomVariableAtIndex:(NSUInteger)index + name:(NSString *)name + value:(NSString *)value + withError:(NSError **)error; + +// Returns the value of the custom variable at the index requested. Returns +// nil if no variable is found or index is out of range. +- (NSString *) getVisitorCustomVarAtIndex:(NSUInteger)index; + +// Manually dispatch pageviews/events to the server. Returns YES if +// a new dispatch starts. +- (BOOL)dispatch; + +@end + +@protocol GANTrackerDelegate + +// Invoked when a dispatch completes. Reports the number of events +// dispatched and the number of events that failed to dispatch. Failed +// events will be retried on next dispatch. +- (void)trackerDispatchDidComplete:(GANTracker *)tracker + eventsDispatched:(NSUInteger)eventsDispatched + eventsFailedDispatch:(NSUInteger)eventsFailedDispatch; + +@end diff --git a/iPhone/GoogleAnalytics/GoogSDK/libGoogleAnalytics.a b/iPhone/GoogleAnalytics/GoogSDK/libGoogleAnalytics.a new file mode 100644 index 0000000000000000000000000000000000000000..358e0a543eb394e634aac2fcf4653212bd90fcb5 GIT binary patch literal 704332 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

#&8x?KB(jG+yF1Gd#s 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

    E*pPPYA{~arWkTOug_urOnsGSvlpx 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 XfnaNOF&64q%+jr3wEV)u^SE literal 0 HcmV?d00001 diff --git a/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.h b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.h new file mode 100644 index 00000000..6b7b53e5 --- /dev/null +++ b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.h @@ -0,0 +1,22 @@ +// +// GoogleAnalyticsPlugin.h +// Gapalytics +// +// Created by Jesse MacFadyen on 11-04-21. +// Copyright 2011 Nitobi. All rights reserved. +// + +#import +#import "PhoneGapCommand.h" +#import "GANTracker.h" + + +@interface GoogleAnalyticsPlugin : PhoneGapCommand { + +} + +- (void) startTrackerWithAccountID:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void) trackEvent:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void) trackPageview:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; + +@end diff --git a/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.js b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.js new file mode 100755 index 00000000..9c6bb84d --- /dev/null +++ b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.js @@ -0,0 +1,51 @@ + +function GoogleAnalyticsPlugin() +{ + +} + +GoogleAnalyticsPlugin.prototype.startTrackerWithAccountID = function(id) +{ + PhoneGap.exec("GoogleAnalyticsPlugin.startTrackerWithAccountID",id); +}; + +GoogleAnalyticsPlugin.prototype.trackPageview = function(pageUri) +{ + PhoneGap.exec("GoogleAnalyticsPlugin.trackPageview",pageUri); +}; + + +GoogleAnalyticsPlugin.prototype.trackEvent = function(category,action,label,value) +{ + var options = {category:category, + action:action, + label:label, + value:value}; + PhoneGap.exec("GoogleAnalyticsPlugin.trackEvent",options); +}; + +GoogleAnalyticsPlugin.prototype.trackerDispatchDidComplete = function(count) +{ + //console.log("trackerDispatchDidComplete :: " + count); +}; + +/** + * Install function + */ +GoogleAnalyticsPlugin.install = function() +{ + if ( !window.plugins ) + { + window.plugins = {}; + } + if ( !window.plugins.googleAnalyticsPlugin ) + { + window.plugins.googleAnalyticsPlugin = new GoogleAnalyticsPlugin(); + } +} + +/** + * Add to PhoneGap constructor + */ +PhoneGap.addConstructor(GoogleAnalyticsPlugin.install); + diff --git a/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.m b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.m new file mode 100644 index 00000000..ba3f3bfe --- /dev/null +++ b/iPhone/GoogleAnalytics/GoogleAnalyticsPlugin.m @@ -0,0 +1,81 @@ +// +// GoogleAnalyticsPlugin.m +// Gapalytics +// +// Created by Jesse MacFadyen on 11-04-21. +// Copyright 2011 Nitobi. All rights reserved. +// + +#import "GoogleAnalyticsPlugin.h" + + + +// Dispatch period in seconds +static const NSInteger kGANDispatchPeriodSec = 10; + + +@implementation GoogleAnalyticsPlugin + +- (void) startTrackerWithAccountID:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + NSString* accountId = [arguments objectAtIndex:0]; + + [[GANTracker sharedTracker] startTrackerWithAccountID:accountId + dispatchPeriod:kGANDispatchPeriodSec + delegate:self]; + +} + +- (void) trackEvent:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + + NSString* category = [options valueForKey:@"category"]; + NSString* action = [options valueForKey:@"action"]; + NSString* label = [options valueForKey:@"label"]; + int value = [[options valueForKey:@"value"] intValue]; + + NSError *error; + + if (![[GANTracker sharedTracker] trackEvent:category + action:action + label:label + value:value + withError:&error]) { + // Handle error here + NSLog(@"GoogleAnalyticsPlugin.trackEvent Error::",[error localizedDescription]); + } + + + NSLog(@"GoogleAnalyticsPlugin.trackEvent::%@, %@, %@, %d",category,action,label,value); + +} + +- (void) trackPageview:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + NSString* pageUri = [arguments objectAtIndex:0]; + NSError *error; + if (![[GANTracker sharedTracker] trackPageview:pageUri + withError:&error]) { + // TODO: Handle error here + } +} + + + +- (void)trackerDispatchDidComplete:(GANTracker *)tracker + eventsDispatched:(NSUInteger)eventsDispatched + eventsFailedDispatch:(NSUInteger)eventsFailedDispatch +{ + NSString* callback = [NSString stringWithFormat:@"window.plugins.googleAnalyticsPlugin.trackerDispatchDidComplete(%d);", + eventsDispatched]; + [ self.webView stringByEvaluatingJavaScriptFromString:callback]; + +} + +- (void) dealloc +{ + [[GANTracker sharedTracker] stopTracker]; + [ super dealloc ]; +} + +@end diff --git a/iPhone/GoogleAnalytics/README b/iPhone/GoogleAnalytics/README new file mode 100755 index 00000000..0714db10 --- /dev/null +++ b/iPhone/GoogleAnalytics/README @@ -0,0 +1,40 @@ + +iOS Plugin for adding Google Analytics to your PhoneGap application. + +Google instructions are here: +http://code.google.com/mobile/analytics/docs/ + +Supported Platforms: + +iOS: + Requirements : + - google lib is included in this repo. in iOS/GoogSDK/ + - Web property ID for analytics + + + Instructions : + - add all files under iOS to the plugins folder of your XCode project ( via XCode Project explorer ) + - add GoogleAnalyticsPlugin.js to your www folder ( via Finder ) + - include GoogleAnalyticsPlugin.js from index.html + + - Google's docs are here : http://code.google.com/mobile/analytics/docs/iphone/ + +Android : + TODO: + + + +Javascript Interface: + + // after device ready, create a local alias and start the tracker with your own id. + var googleAnalytics = window.plugins.googleAnalyticsPlugin; + googleAnalytics.startTrackerWithAccountID("UA-6369089-3"); + + // Track an event in your application + // more here : http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html + googleAnalytics.trackEvent("category","action","label goes here",666); + + // Track an pageview in your application + googleAnalytics.trackPageview(pageURI); + + \ No newline at end of file From c216d5715e8df24b15cecd5a6171dff8cfbcd4bc Mon Sep 17 00:00:00 2001 From: macdonst Date: Mon, 3 Oct 2011 08:25:02 +0800 Subject: [PATCH 03/33] Video Player Plugin --- Android/VideoPlayer/README.md | 118 ++++++++++++++++++ .../phonegap/plugins/video/VideoPlayer.java | 45 +++++++ Android/VideoPlayer/www/video.js | 30 +++++ 3 files changed, 193 insertions(+) create mode 100755 Android/VideoPlayer/README.md create mode 100644 Android/VideoPlayer/src/com/phonegap/plugins/video/VideoPlayer.java create mode 100644 Android/VideoPlayer/www/video.js diff --git a/Android/VideoPlayer/README.md b/Android/VideoPlayer/README.md new file mode 100755 index 00000000..9019c6b2 --- /dev/null +++ b/Android/VideoPlayer/README.md @@ -0,0 +1,118 @@ +# VideoPlayer plugin for Phonegap # + +The video player allows you to display videos from your PhoneGap application. + +This command fires an Intent to have your devices video player show the video. + +## Adding the Plugin to your project ## + +Using this plugin requires [Android PhoneGap](http://github.com/phonegap/phonegap-android). + +1. To install the plugin, move www/video to your project's www folder and include a reference to it in your html file after phonegap.js. + + <script type="text/javascript" charset="utf-8" src="phonegap.js"></script>
    + <script type="text/javascript" charset="utf-8" src="video.js"></script> + +2. Create a directory within your project called "src/com/phonegap/plugins/video" and move VideoPlayer.java into it. + +3. In your res/xml/plugins.xml file add the following line: + + <plugin name="VideoPlayer" value="com.phonegap.plugins.video.VideoPlayer"/> + +## Using the plugin ## + +The plugin creates the object `window.plugins.video`. To use, call the play() method: + +
    +  /**
    +	* Display an intent to play the video.
    +    *
    +    * @param url           The url to play
    +    */
    +  play(url)
    +
    + +Sample use: + + window.plugins.videoPlayer.play("http://path.to.my/video.mp4"); + window.plugins.videoPlayer.play("file:///path/to/my/video.mp4"); + +Note: You cannot play a video from the assets folder on Android. + +## RELEASE NOTES ## + +### October 2, 2011 ### + +* Initial release + + +## BUGS AND CONTRIBUTIONS ## + + +## LICENSE ## + +PhoneGap is available under *either* the terms of the modified BSD license *or* the +MIT License (2008). As a recipient of PhonegGap, you may choose which +license to receive this code under (except as noted in per-module LICENSE +files). Some modules may not be the copyright of Nitobi. These +modules contain explicit declarations of copyright in both the LICENSE files in +the directories in which they reside and in the code itself. No external +contributions are allowed under licenses which are fundamentally incompatible +with the MIT or BSD licenses that PhoneGap is distributed under. + +The text of the MIT and BSD licenses is reproduced below. + +--- + +### The "New" BSD License + +Copyright (c) 2005-2011, Nitobi Software Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Phonegap/Nitobi nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--- + +### The MIT License + +Copyright (c) <2011> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + \ No newline at end of file diff --git a/Android/VideoPlayer/src/com/phonegap/plugins/video/VideoPlayer.java b/Android/VideoPlayer/src/com/phonegap/plugins/video/VideoPlayer.java new file mode 100644 index 00000000..1bd7b4eb --- /dev/null +++ b/Android/VideoPlayer/src/com/phonegap/plugins/video/VideoPlayer.java @@ -0,0 +1,45 @@ +package com.phonegap.plugins.video; + +import java.io.File; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.Intent; +import android.net.Uri; + +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; + +public class VideoPlayer extends Plugin { + + @Override + public PluginResult execute(String action, JSONArray args, String callbackId) { + PluginResult.Status status = PluginResult.Status.OK; + String result = ""; + + try { + if (action.equals("playVideo")) { + playVideo(args.getString(0)); + } + else { + status = PluginResult.Status.INVALID_ACTION; + } + return new PluginResult(status, result); + } catch (JSONException e) { + return new PluginResult(PluginResult.Status.JSON_EXCEPTION); + } + } + + private void playVideo(String url) { + // Create URI + Uri uri = Uri.parse(url); + // Display video player + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, "video/*"); + + this.ctx.startActivity(intent); + } + +} diff --git a/Android/VideoPlayer/www/video.js b/Android/VideoPlayer/www/video.js new file mode 100644 index 00000000..3cd77277 --- /dev/null +++ b/Android/VideoPlayer/www/video.js @@ -0,0 +1,30 @@ +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2011, IBM Corporation + */ + +/** + * Constructor + */ +function VideoPlayer() { +}; + +/** + * Starts the video player intent + * + * @param url The url to play + */ +VideoPlayer.prototype.play = function(url) { + PhoneGap.exec(null, null, "VideoPlayer", "playVideo", [url]); +}; + + +/** + * Load VideoPlayer + */ +PhoneGap.addConstructor(function() { + PhoneGap.addPlugin("videoPlayer", new VideoPlayer()); +}); From cc1225032e7d0f88718bd38f0fa0657d885f7d41 Mon Sep 17 00:00:00 2001 From: macdonst Date: Wed, 5 Oct 2011 01:48:25 +0800 Subject: [PATCH 04/33] Fix for Issue #139: New Child Browser: can't get keyboard when show loc bar : true (android) --- .../plugins/childBrowser/ChildBrowser.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java index ad03231d..7c721865 100644 --- a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java +++ b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java @@ -15,6 +15,7 @@ import org.json.JSONObject; import android.app.Dialog; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; @@ -26,6 +27,7 @@ import android.view.Window; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; +import android.view.inputmethod.InputMethodManager; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.EditText; @@ -46,6 +48,7 @@ public class ChildBrowser extends Plugin { private Dialog dialog; private WebView webview; + private EditText edittext; private boolean showLocationBar = true; /** @@ -166,11 +169,15 @@ private void goForward() { * * @param url to load */ - private void navigate(String url) { + private void navigate(String url) { + InputMethodManager imm = (InputMethodManager)this.ctx.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(edittext.getWindowToken(), 0); + if (!url.startsWith("http")) { this.webview.loadUrl("http://" + url); } this.webview.loadUrl(url); + this.webview.requestFocus(); } @@ -255,7 +262,7 @@ public void onClick(View v) { } forward.setLayoutParams(forwardParams); - final EditText edittext = new EditText(ctx); + edittext = new EditText(ctx); edittext.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // If the event is a key-down event on the "enter" button @@ -270,7 +277,7 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { edittext.setSingleLine(true); edittext.setText(url); edittext.setLayoutParams(editParams); - + ImageButton close = new ImageButton(ctx); close.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -292,6 +299,7 @@ public void onClick(View v) { webview.loadUrl(url); webview.setId(5); webview.setLayoutParams(wvParams); + webview.requestFocus(); toolbar.addView(back); toolbar.addView(forward); From 9c9bdb6c5f9128e7245c677a8d30c60c19e465ce Mon Sep 17 00:00:00 2001 From: macdonst Date: Wed, 12 Oct 2011 23:17:56 +0800 Subject: [PATCH 05/33] Fix for Issue #179: Android ChildBrowser openExternal DroidGap option broken --- Android/ChildBrowser/www/childbrowser.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Android/ChildBrowser/www/childbrowser.js b/Android/ChildBrowser/www/childbrowser.js index 31468470..63719294 100644 --- a/Android/ChildBrowser/www/childbrowser.js +++ b/Android/ChildBrowser/www/childbrowser.js @@ -45,7 +45,12 @@ ChildBrowser.prototype.close = function() { * @param usePhoneGap Load url in PhoneGap webview [optional] */ ChildBrowser.prototype.openExternal = function(url, usePhoneGap) { - PhoneGap.exec(null, null, "ChildBrowser", "openExternal", [url, usePhoneGap]); + if (usePhoneGap === true) { + navigator.app.loadUrl(url); + } + else { + PhoneGap.exec(null, null, "ChildBrowser", "openExternal", [url, usePhoneGap]); + } }; /** From 3b57f444d5f44d36d1b629fd82789a7d1b5237c0 Mon Sep 17 00:00:00 2001 From: Markus Olsson Date: Mon, 3 Oct 2011 21:24:31 +0800 Subject: [PATCH 06/33] Since GetFunctionName was removed in https://github.com/shazron/phonegap-iphone/commit/5544b2a0664ae2714ec1df2b6e16aa97d3cfa9bc the BarcodePlugin stopped working. I've taken a note from the InAppPurchaseManager plugin and created a plugin map with proper disposal of callback methods. --- iPhone/BarcodeScanner/barcodescanner.js | 26 +++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/iPhone/BarcodeScanner/barcodescanner.js b/iPhone/BarcodeScanner/barcodescanner.js index 8d48d69d..fe10611f 100644 --- a/iPhone/BarcodeScanner/barcodescanner.js +++ b/iPhone/BarcodeScanner/barcodescanner.js @@ -7,6 +7,9 @@ var BarcodeScanner = function() { } +BarcodeScanner.prototype.callbackMap = {}; +BarcodeScanner.prototype.callbackIdx = 0; + /* That's your lot for the moment */ BarcodeScanner.Type = { @@ -16,12 +19,27 @@ BarcodeScanner.Type = { /* Types are ignored at the moment until I implement any other than QR Code */ BarcodeScanner.prototype.scan = function(types, success, fail) { - return PhoneGap.exec("BarcodeScanner.scan", GetFunctionName(success), GetFunctionName(fail), types); + + var plugin = window.plugins.barcodeScanner, + cbMap = plugin.callbackMap, + key = 'scan' + plugin.callbackIdx++; + + cbMap[key] = { + success: function(result) { + delete cbMap[key]; + success(result); + }, + fail: function(result) { + delete cbMap[key]; + fail(result); + } + }; + + var cbPrefix = 'window.plugins.barcodeScanner.callbackMap.' + key; + + return PhoneGap.exec("BarcodeScanner.scan", cbPrefix + ".success", cbPrefix + ".fail", types); }; - - - PhoneGap.addConstructor(function() { if(!window.plugins) From ca39b2c7a2d4ee40103f9754ece2331187703bd5 Mon Sep 17 00:00:00 2001 From: Mattias Wadman Date: Wed, 5 Oct 2011 04:23:43 +0800 Subject: [PATCH 07/33] Add step for line in plugins.xml and some format clenaup --- Android/BarcodeScanner/README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Android/BarcodeScanner/README.md b/Android/BarcodeScanner/README.md index cef0b24a..585ef5c1 100644 --- a/Android/BarcodeScanner/README.md +++ b/Android/BarcodeScanner/README.md @@ -5,14 +5,17 @@ By Matt Kane This plugin requires the end user to install [the ZXing Barcode Scanner app](http://code.google.com/p/zxing/) If the user doesn't have the app install they will be promped to install it the first time the plugin is used. -1. To install the plugin, move barcodescanner.js to your project's www folder and include a reference to it +1. To install the plugin, move `barcodescanner.js` to your project's www folder and include a reference to it in your html files. 2. Create a folder called 'src/com/beetight/barcodescanner' within your project's src/com/ folder. 3. And copy the java file into that new folder. -`mkdir /src/com/beetight/barcodescanner` + mkdir -p /src/com/beetight/barcodescanner + cp ./BarcodeScanner.java /src/com/beetight/barcodescanner + +4. Add a plugin line to `res/xml/plugins.xml` -`cp ./BarcodeScanner.java /src/com/beetight/barcodescanner` + `` ## Using the plugin ## The plugin creates the object `window.plugins.barcodeScanner` with one method `scan(types, success, fail, options)` @@ -67,12 +70,12 @@ Supported encoding types: A full example could be: - window.plugins.barcodeScanner.encode(BarcodeScanner.Encode.TEXT_TYPE, "http://www.nytimes.com", function(success) { - alert("encode success: " + success); - }, function(fail) { - alert("encoding failed: " + fail); - }, {yesString: "Install"} - ); + window.plugins.barcodeScanner.encode(BarcodeScanner.Encode.TEXT_TYPE, "http://www.nytimes.com", function(success) { + alert("encode success: " + success); + }, function(fail) { + alert("encoding failed: " + fail); + }, {yesString: "Install"} + ); ## BUGS AND CONTRIBUTIONS ## From 006689c7cdc79038757882ba1a36358a632b493f Mon Sep 17 00:00:00 2001 From: csaunders Date: Sun, 9 Oct 2011 03:16:56 +0800 Subject: [PATCH 08/33] PhoneGap wrapper around Shopify4J to make authenticated API calls to the Shopify API from Javascript --- Android/ShopGap/README.md | 100 +++++++++++++++++++++ Android/ShopGap/ShopGapPlugin.java | 138 +++++++++++++++++++++++++++++ Android/ShopGap/shopgap.js | 41 +++++++++ 3 files changed, 279 insertions(+) create mode 100644 Android/ShopGap/README.md create mode 100644 Android/ShopGap/ShopGapPlugin.java create mode 100644 Android/ShopGap/shopgap.js diff --git a/Android/ShopGap/README.md b/Android/ShopGap/README.md new file mode 100644 index 00000000..8e3f7983 --- /dev/null +++ b/Android/ShopGap/README.md @@ -0,0 +1,100 @@ +# ShopGap plugin for Android/Phonegap + +Chris Saunders // @csaunders + +## About + +ShopGap is a wrapper around [Shopify4J](http://github.com/shopify/Shopify4J) to allow you to make Authenticated API calls to the Shopify API. + +## Dependencies + +You will need to include Shopify4J and all of it's dependencies in your project in order for this tool to work. This should be as simple as adding Shopify4J as a Library in your Android configuration. + +## Using the plugin + +**This has been developed against PhoneGap 1.1.0** + +* Add java code to your projects source + +* Register the plugin in the plugins.xml file + +```xml + +``` + +* Setup your authenticated session with the Shopify API + +```javascript +window.plugins.shopGap.setup( + 'YOUR_API_KEY', + 'GENERATED_API_PASSWORD', + 'SHOP_NAME', + successFunctionOrNull, + failureFunctionOrNull +); +``` + +* Make calls to the Shopify API + +```javascript +var success = function(resultJson){ + console.log(JSON.stringify(resultJson)); +} + +window.plugins.shopGap.read( + 'products', // endpoint + null, // query -- not supported yet + null, // data -- not needed for GET requests + function(r){success(r);}, // success callback + function(e){console.log}); // failure callback +``` + +### Endpoints + +The plugin takes care of most of the work for the endpoints, all you need to +do is fill in a few missing pieces. + +```javascript +// get all products, +window.plugins.shopGap.read('products', null, null, s, f); + +// get product 1 +window.plugins.shopGap.read('products/1', null, null, s, f); + +// create product +window.plugins.shopGap.create('products', null, JSON.stringify(newProduct), s, f); + +// update product 1 +window.plugins.shopGap.update('products/1', null, JSON.stringify(updateProduct), s, f); + +// delete product 1 +window.plugins.shopGap.destry('products/1', null, null, s, f); +``` + +## Release Notes + +0.1.0 Initial Release + +## License + +The MIT License + +Copyright (c) 2011 Chris Saunders + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Android/ShopGap/ShopGapPlugin.java b/Android/ShopGap/ShopGapPlugin.java new file mode 100644 index 00000000..d4308d17 --- /dev/null +++ b/Android/ShopGap/ShopGapPlugin.java @@ -0,0 +1,138 @@ +package ca.christophersaunders.shopgap; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; +import com.phonegap.api.PluginResult.Status; +import com.shopify.api.client.ShopifyClient; +import com.shopify.api.credentials.Credential; +import com.shopify.api.endpoints.JsonPipeService; + +public class ShopGapPlugin extends Plugin { + private static final String API_KEY = "apikey"; + private static final String PASSWORD = "password"; + private static final String SHOPNAME = "shopname"; + private static final String CALL = "call"; + private static final String ENDPOINT = "endpoint"; + private static final String QUERY = "query"; + private static final String DATA = "data"; + + private ShopifyClient client; + private JsonPipeService service; + + enum Methods { CALL_API, SETUP }; + enum Call { READ, CREATE, UPDATE, DESTROY }; + + @Override + public PluginResult execute(String func, JSONArray arguments, String callbackId) { + try { + JSONObject argsMap = arguments.getJSONObject(0); + switch(determineMethod(func)) { + case CALL_API: + JSONObject results = callAPI(determineCall(argsMap.getString(CALL)), argsMap); + return new PluginResult(Status.OK, results); + case SETUP: + if(setupClient(argsMap)) { + return new PluginResult(Status.OK); + } + break; + default: + return new PluginResult(PluginResult.Status.INVALID_ACTION); + } + } catch (JSONException e) { + // Trololololololo + return new PluginResult(PluginResult.Status.JSON_EXCEPTION); + } + return null; + } + + private Methods determineMethod(String name){ + if(name.equals("callapi")) + return Methods.CALL_API; + if(name.equals("setup")) + return Methods.SETUP; + return null; + } + + private Call determineCall(String callname) { + if(callname.equals("read")) + return Call.READ; + if (callname.equals("update")) + return Call.UPDATE; + if (callname.equals("create")) + return Call.CREATE; + if (callname.equals("destroy")) + return Call.DESTROY; + return null; + } + + private boolean setupClient(JSONObject args) throws JSONException { + if (args.has(API_KEY) && args.has(PASSWORD) && args.has(SHOPNAME)) { + String apiKey = args.getString(API_KEY); + String passwd = args.getString(PASSWORD); + String shop = args.getString(SHOPNAME); + + Credential cred = new Credential(apiKey, "", shop, passwd); + client = new ShopifyClient(cred); + service = client.constructService(JsonPipeService.class); + return true; + } + return false; + } + + private JSONObject callAPI(Call call, JSONObject args) { + try { + String endpoint = null, data = null, query = null; + if(args.has(ENDPOINT)) + endpoint = args.getString(ENDPOINT); + if(args.has(QUERY)) + query = args.getString(QUERY); + if(args.has(DATA)) + data = args.getString(DATA); + + InputStream result = null; + + switch(call) { + case CREATE: + result = service.create(endpoint, data); + break; + case READ: + result = service.read(endpoint); + break; + case UPDATE: + result = service.update(endpoint, data); + break; + case DESTROY: + result = service.destroy(endpoint); + break; + } + + if( result != null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BufferedInputStream bis = new BufferedInputStream(result); + byte[] resultData = new byte[0x4000]; + int dataRead = 0; + while((dataRead = bis.read(resultData)) > 0) { + baos.write(resultData, 0, dataRead); + } + return new JSONObject(new String(baos.toByteArray())); + } + + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return new JSONObject(); + } + +} diff --git a/Android/ShopGap/shopgap.js b/Android/ShopGap/shopgap.js new file mode 100644 index 00000000..4da4a332 --- /dev/null +++ b/Android/ShopGap/shopgap.js @@ -0,0 +1,41 @@ +var ShopGap = function(){}; + +ShopGap.prototype.setup = function(apiKey, password, shopname, onSuccessFn, onFailureFn){ + var args = {'apikey': apiKey, 'password': password, 'shopname': shopname}; + return PhoneGap.exec(onSuccessFn, onFailureFn, 'ShopGapPlugin', 'setup', [args]); +}; + +ShopGap.prototype.consArgs = function(call, endpoint, query, data){ + return {call: call, endpoint: endpoint, query: query, data: data}; +}; + +ShopGap.prototype.read = function(endpoint, query, data, success, failure){ + return this.callapi(this.consArgs('read', endpoint, query, data), success, failure); +}; + +ShopGap.prototype.update = function(endpoint, query, data, success, failure){ + return this.callapi(this.consArgs('update', endpoint, query, data), success, failure); +}; + +ShopGap.prototype.create = function(endpoint, query, data, success, failure){ + return this.callapi(this.consArgs('create', endpoint, query, data), success, failure); +}; + +ShopGap.prototype.destroy = function(endpoint, query, data, success, failure){ + return this.callapi(this.consArgs('destroy', endpoint, query, data), success, failure); +}; + +ShopGap.prototype.callapi = function(args, onSuccessFn, onFailureFn){ + return PhoneGap.exec(onSuccessFn, onFailureFn, 'ShopGapPlugin', 'callapi', [args]); +}; + +/* +ShopGap.prototype.callapi = function(call, endpoint, query, data, onSuccessFn, onFailureFn){ + var args = {'endpoint': endpoint, 'data': data, 'query': query}; + return PhoneGap.exec(onSuccessFn, onFailureFn, 'ShopGapPlugin', 'callapi', [args]); +}; +*/ + +PhoneGap.addConstructor(function(){ + PhoneGap.addPlugin('shopGap', new ShopGap()); +}); From b97551fa64d11a32a1e07773145e6323d341b71d Mon Sep 17 00:00:00 2001 From: Arne de Bree Date: Wed, 19 Oct 2011 06:52:51 +0800 Subject: [PATCH 09/33] Phonegap plugin for Android to enable Torch functionality Initial commit of Phonegap plugin for Android to enable Torch functionality --- Android/Torch/README.md | 91 +++++++++++++++++++ Android/Torch/Torch.js | 61 +++++++++++++ Android/Torch/TorchPlugin.java | 154 +++++++++++++++++++++++++++++++++ 3 files changed, 306 insertions(+) create mode 100644 Android/Torch/README.md create mode 100644 Android/Torch/Torch.js create mode 100644 Android/Torch/TorchPlugin.java diff --git a/Android/Torch/README.md b/Android/Torch/README.md new file mode 100644 index 00000000..07e85657 --- /dev/null +++ b/Android/Torch/README.md @@ -0,0 +1,91 @@ +# Torch plugin for Phonegap (Android) # +By Arne de Bree + +## Adding the Plugin to your project ## +1. To install the plugin, move `Torch.js` to your project's www folder and include a reference to it +in your html files. + + <script src="Torch.js"></script> + +2. Create a folder called 'nl/debree/phonegap/plugin/torch' within your project's src folder. +3. And copy the java file into that new folder. + +
    +    mkdir -p /src/nl/debree/phonegap/plugin/torch/
    +    cp ./TorchPlugin.java /src/nl/debree/phonegap/plugin/torch/
    +
    + +4. Add a plugin line to `res/xml/plugins.xml` + + <plugin name="Torch" value="nl.debree.phonegap.plugin.torch.TorchPlugin" /> + +## Using the plugin ## +The plugin creates the object `window.plugins.Torch` within your DOM. This object +exposes the following functions: + +- isOn +- isCapable +- toggle +- turnOn +- turnOff + +
    +    window.plugins.Torch.isOn( 
    +        function( result ) { console.log( "isOn: " + result.on ) }      // success
    +    ,   function() { console.log( "error" ) }                           // error
    +    );
    +    
    +    window.plugins.Torch.isCapable( 
    +        function( result ) { console.log( "isCapable: " + result.capable ) }      // success
    +    ,   function() { console.log( "error" ) }                           // error
    +    );
    +    
    +    window.plugins.Torch.toggle( 
    +        function() { console.log( "toggle" ) }                          // success
    +    ,   function() { console.log( "error" ) }                           // error
    +    );
    +
    +    window.plugins.Torch.turnOn( 
    +        function() { console.log( "turnOn" ) }                          // success
    +    ,   function() { console.log( "error" ) }                           // error
    +    );
    +
    +    window.plugins.Torch.turnOff( 
    +        function() { console.log( "turnOff" ) }                         // success
    +    ,   function() { console.log( "error" ) }                           // error
    +    );
    +
    + + +## BUGS AND CONTRIBUTIONS ## +The latest bleeding-edge version is available [on GitHub](http://github.com/adebrees/phonegap-plugins/tree/master/Android/) +If you have a patch, fork my repo baby and send me a pull request. Submit bug reports on GitHub, please. + +## Licence ## + +The MIT License + +Copyright (c) 2011 Arne de Bree + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + + \ No newline at end of file diff --git a/Android/Torch/Torch.js b/Android/Torch/Torch.js new file mode 100644 index 00000000..54c730b1 --- /dev/null +++ b/Android/Torch/Torch.js @@ -0,0 +1,61 @@ +/** + * Phonegap Torch plugin + * Copyright (c) Arne de Bree 2011 + * + */ + +/** + * + * @return Object literal singleton instance of Torch + */ +var Torch = function() {}; + +/** + * @param success The callback for success + * @param error The callback for error + */ +Torch.prototype.isCapable = function( success, error ) +{ + return PhoneGap.exec( success, error, "Torch", "isCapable", [] ); +}; + +/** + * @param success The callback for success + * @param error The callback for error + */ +Torch.prototype.isOn = function( success, error ) +{ + return PhoneGap.exec( success, error, "Torch", "isOn", [] ); +}; + +/** + * @param success The callback for success + * @param error The callback for error + */ +Torch.prototype.turnOn = function( success, error ) +{ + return PhoneGap.exec( success, error, "Torch", "turnOn", [] ); +}; + +/** + * @param success The callback for success + * @param error The callback for error + */ +Torch.prototype.turnOff = function( success, error ) +{ + return PhoneGap.exec( success, error, "Torch", "turnOff", [] ); +}; + +/** + * @param success The callback for success + * @param error The callback for error + */ +Torch.prototype.toggle = function( success, error ) +{ + return PhoneGap.exec( success, error, "Torch", "toggle", [] ); +}; + +PhoneGap.addConstructor( function() +{ + PhoneGap.addPlugin( "Torch", new Torch() ); +} ); \ No newline at end of file diff --git a/Android/Torch/TorchPlugin.java b/Android/Torch/TorchPlugin.java new file mode 100644 index 00000000..09557dd7 --- /dev/null +++ b/Android/Torch/TorchPlugin.java @@ -0,0 +1,154 @@ +/** + * Phonegap Torch Plugin + * Copyright (c) Arne de Bree 2011 + * + */ +package nl.debree.phonegap.plugin.torch; + +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; +import com.phonegap.api.PluginResult.Status; + +import android.hardware.Camera; +import android.util.Log; + +/** + * Plugin to turn on or off the Camera Flashlight of an Android device + * after the capability is tested + */ +public class TorchPlugin extends Plugin { + + public static final String CMD_ON = "turnOn"; + public static final String CMD_OFF = "turnOff"; + public static final String CMD_TOGGLE = "toggle"; + public static final String CMD_IS_ON = "isOn"; + public static final String CMD_HAS_TORCH = "isCapable"; + + // Create camera and parameter objects + private Camera mCamera; + private Camera.Parameters mParameters; + private boolean mbTorchEnabled = false; + + /** + * Constructor + */ + public TorchPlugin() { + Log.d( "TorchPlugin", "Plugin created" ); + + mCamera = Camera.open(); + } + + /* + * Executes the request and returns PluginResult. + * + * @param action action to perform. Allowed values: turnOn, turnOff, toggle, isOn, isCapable + * @param data input data, currently not in use + * @param callbackId The callback id used when calling back into JavaScript. + * @return A PluginResult object with a status and message. + * + * @see com.phonegap.api.Plugin#execute(java.lang.String, + * org.json.JSONArray, java.lang.String) + */ + @Override + public PluginResult execute(String action, JSONArray data, String callbackId) { + Log.d( "TorchPlugin", "Plugin Called " + action ); + + PluginResult result = null; + JSONObject response = new JSONObject(); + + if (action.equals(CMD_ON)) { + + this.toggleTorch( true ); + result = new PluginResult( Status.OK ); + + } else if (action.equals(CMD_OFF)) { + + this.toggleTorch( false ); + result = new PluginResult( Status.OK ); + + } else if (action.equals(CMD_TOGGLE)) { + + this.toggleTorch(); + result = new PluginResult( Status.OK ); + + } else if (action.equals(CMD_IS_ON)) { + try { + response.put( "on", mbTorchEnabled ); + + result = new PluginResult( Status.OK, response ); + } catch( JSONException jsonEx ) { + result = new PluginResult(Status.JSON_EXCEPTION); + } + } else if (action.equals(CMD_HAS_TORCH)) { + try { + response.put( "capable", this.isCapable() ); + + result = new PluginResult( Status.OK, response ); + } catch( JSONException jsonEx ) { + result = new PluginResult(Status.JSON_EXCEPTION); + } + + } else { + result = new PluginResult(Status.INVALID_ACTION); + Log.d( "TorchPlugin", "Invalid action : " + action + " passed"); + } + + return result; + } + + /** + * Test if this device has a Flashlight we can use and put in Torch mode + * + * @return boolean + */ + protected boolean isCapable() { + boolean result = false; + + List flashModes = mParameters.getSupportedFlashModes(); + + if (flashModes != null && flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) { + result = true; + } + + return result; + } + + /** + * True toggle function, turns the torch on when off and vise versa + * + */ + protected void toggleTorch() { + toggleTorch( !mbTorchEnabled ); + } + + /** + * Toggle the torch in the requested state + * + * @param state The requested state + * + */ + protected void toggleTorch(boolean state) { + mParameters = mCamera.getParameters(); + + // Make sure that torch mode is supported + // + if ( this.isCapable() ) { + if (state) { + mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); + } else { + mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON); + } + + // Commit the camera parameters + // + mCamera.setParameters(mParameters); + + mbTorchEnabled = state; + } + } +} \ No newline at end of file From f3fdae6ce9c1f623cde502e86f588b400b87763c Mon Sep 17 00:00:00 2001 From: macdonst Date: Wed, 19 Oct 2011 09:26:50 +0800 Subject: [PATCH 10/33] Fixing zoom issue in child browser --- .../src/com/phonegap/plugins/childBrowser/ChildBrowser.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java index 7c721865..4be68044 100644 --- a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java +++ b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java @@ -294,12 +294,16 @@ public void onClick(View v) { webview = new WebView(ctx); webview.getSettings().setJavaScriptEnabled(true); + webview.getSettings().setBuiltInZoomControls(true); WebViewClient client = new ChildBrowserClient(ctx, edittext); webview.setWebViewClient(client); webview.loadUrl(url); webview.setId(5); + webview.setInitialScale(0); webview.setLayoutParams(wvParams); webview.requestFocus(); + webview.requestFocusFromTouch(); + toolbar.addView(back); toolbar.addView(forward); @@ -371,7 +375,7 @@ public ChildBrowserClient(PhonegapActivity mContext, EditText mEditText) { public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); String newloc; - if (url.startsWith("http")) { + if (url.startsWith("http:")) { newloc = url; } else { newloc = "http://" + url; From b63ba977186810a370aa8c3f29c44acdae25a8c3 Mon Sep 17 00:00:00 2001 From: Jos Shepherd Date: Fri, 5 Nov 2010 00:10:34 +0800 Subject: [PATCH 11/33] Facebook Android SDK plugin start --- Android/Facebook/README.md | 36 + .../facebook/android/AsyncFacebookRunner.java | 268 +++++++ .../src/com/facebook/android/DialogError.java | 51 ++ .../src/com/facebook/android/Facebook.java | 756 ++++++++++++++++++ .../com/facebook/android/FacebookError.java | 49 ++ .../src/com/facebook/android/FbDialog.java | 185 +++++ .../src/com/facebook/android/Util.java | 299 +++++++ .../plugins/facebook/FacebookAuth.java | 118 +++ Android/Facebook/www/facebook.js | 34 + 9 files changed, 1796 insertions(+) create mode 100644 Android/Facebook/README.md create mode 100644 Android/Facebook/src/com/facebook/android/AsyncFacebookRunner.java create mode 100644 Android/Facebook/src/com/facebook/android/DialogError.java create mode 100644 Android/Facebook/src/com/facebook/android/Facebook.java create mode 100644 Android/Facebook/src/com/facebook/android/FacebookError.java create mode 100644 Android/Facebook/src/com/facebook/android/FbDialog.java create mode 100644 Android/Facebook/src/com/facebook/android/Util.java create mode 100755 Android/Facebook/src/com/phonegap/plugins/facebook/FacebookAuth.java create mode 100755 Android/Facebook/www/facebook.js diff --git a/Android/Facebook/README.md b/Android/Facebook/README.md new file mode 100644 index 00000000..2602fc14 --- /dev/null +++ b/Android/Facebook/README.md @@ -0,0 +1,36 @@ +# Facebook for PhoneGap on Android # +by Jos Shepherd + +This is an attempt to make a PhoneGap plugin from the Facebook Android SDK: +https://github.com/facebook/facebook-android-sdk + +It is currently not functional (the login dialog is silently failing to appear) + + +## Licence ## + +The MIT License + +Copyright (c) 2010 Jos Shepherd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + diff --git a/Android/Facebook/src/com/facebook/android/AsyncFacebookRunner.java b/Android/Facebook/src/com/facebook/android/AsyncFacebookRunner.java new file mode 100644 index 00000000..d5d07efa --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/AsyncFacebookRunner.java @@ -0,0 +1,268 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.MalformedURLException; + +import android.content.Context; +import android.os.Bundle; + +/** + * A sample implementation of asynchronous API requests. This class provides + * the ability to execute API methods and have the call return immediately, + * without blocking the calling thread. This is necessary when accessing the + * API in the UI thread, for instance. The request response is returned to + * the caller via a callback interface, which the developer must implement. + * + * This sample implementation simply spawns a new thread for each request, + * and makes the API call immediately. This may work in many applications, + * but more sophisticated users may re-implement this behavior using a thread + * pool, a network thread, a request queue, or other mechanism. Advanced + * functionality could be built, such as rate-limiting of requests, as per + * a specific application's needs. + * + * @see RequestListener + * The callback interface. + * + * @author ssoneff@facebook.com + * + */ +public class AsyncFacebookRunner { + + Facebook fb; + + public AsyncFacebookRunner(Facebook fb) { + this.fb = fb; + } + + /** + * Invalidate the current user session by removing the access token in + * memory, clearing the browser cookies, and calling auth.expireSession + * through the API. The application will be notified when logout is + * complete via the callback interface. + * + * Note that this method is asynchronous and the callback will be invoked + * in a background thread; operations that affect the UI will need to be + * posted to the UI thread or an appropriate handler. + * + * @param context + * The Android context in which the logout should be called: it + * should be the same context in which the login occurred in + * order to clear any stored cookies + * @param listener + * Callback interface to notify the application when the request + * has completed. + */ + public void logout(final Context context, final RequestListener listener) { + new Thread() { + @Override public void run() { + try { + String response = fb.logout(context); + if (response.length() == 0 || response.equals("false")){ + listener.onFacebookError(new FacebookError( + "auth.expireSession failed")); + return; + } + listener.onComplete(response); + } catch (FileNotFoundException e) { + listener.onFileNotFoundException(e); + } catch (MalformedURLException e) { + listener.onMalformedURLException(e); + } catch (IOException e) { + listener.onIOException(e); + } + } + }.start(); + } + + /** + * Make a request to Facebook's old (pre-graph) API with the given + * parameters. One of the parameter keys must be "method" and its value + * should be a valid REST server API method. + * + * + * See http://developers.facebook.com/docs/reference/rest/ + * + * Note that this method is asynchronous and the callback will be invoked + * in a background thread; operations that affect the UI will need to be + * posted to the UI thread or an appropriate handler. + * + * Example: + * + * Bundle parameters = new Bundle(); + * parameters.putString("method", "auth.expireSession", new Listener()); + * String response = request(parameters); + * + * + * @param parameters + * Key-value pairs of parameters to the request. Refer to the + * documentation: one of the parameters must be "method". + * @param listener + * Callback interface to notify the application when the request + * has completed. + */ + public void request(Bundle parameters, + RequestListener listener) { + request(null, parameters, "GET", listener); + } + + /** + * Make a request to the Facebook Graph API without any parameters. + * + * See http://developers.facebook.com/docs/api + * + * Note that this method is asynchronous and the callback will be invoked + * in a background thread; operations that affect the UI will need to be + * posted to the UI thread or an appropriate handler. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param listener + * Callback interface to notify the application when the request + * has completed. + */ + public void request(String graphPath, + RequestListener listener) { + request(graphPath, new Bundle(), "GET", listener); + } + + /** + * Make a request to the Facebook Graph API with the given string parameters + * using an HTTP GET (default method). + * + * See http://developers.facebook.com/docs/api + * + * Note that this method is asynchronous and the callback will be invoked + * in a background thread; operations that affect the UI will need to be + * posted to the UI thread or an appropriate handler. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters "q" : "facebook" would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * @param listener + * Callback interface to notify the application when the request + * has completed. + */ + public void request(String graphPath, + Bundle parameters, + RequestListener listener) { + request(graphPath, parameters, "GET", listener); + } + + /** + * Make a request to the Facebook Graph API with the given HTTP method and + * string parameters. Note that binary data parameters (e.g. pictures) are + * not yet supported by this helper function. + * + * See http://developers.facebook.com/docs/api + * + * Note that this method is asynchronous and the callback will be invoked + * in a background thread; operations that affect the UI will need to be + * posted to the UI thread or an appropriate handler. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters {"q" : "facebook"} would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * @param httpMethod + * http verb, e.g. "POST", "DELETE" + * @param listener + * Callback interface to notify the application when the request + * has completed. + */ + public void request(final String graphPath, + final Bundle parameters, + final String httpMethod, + final RequestListener listener) { + new Thread() { + @Override public void run() { + try { + String resp = fb.request(graphPath, parameters, httpMethod); + listener.onComplete(resp); + } catch (FileNotFoundException e) { + listener.onFileNotFoundException(e); + } catch (MalformedURLException e) { + listener.onMalformedURLException(e); + } catch (IOException e) { + listener.onIOException(e); + } + } + }.start(); + } + + + /** + * Callback interface for API requests. + * + */ + public static interface RequestListener { + + /** + * Called when a request completes with the given response. + * + * Executed by a background thread: do not update the UI in this method. + */ + public void onComplete(String response); + + /** + * Called when a request has a network or request error. + * + * Executed by a background thread: do not update the UI in this method. + */ + public void onIOException(IOException e); + + /** + * Called when a request fails because the requested resource is + * invalid or does not exist. + * + * Executed by a background thread: do not update the UI in this method. + */ + public void onFileNotFoundException(FileNotFoundException e); + + /** + * Called if an invalid graph path is provided (which may result in a + * malformed URL). + * + * Executed by a background thread: do not update the UI in this method. + */ + public void onMalformedURLException(MalformedURLException e); + + /** + * Called when the server-side Facebook method fails. + * + * Executed by a background thread: do not update the UI in this method. + */ + public void onFacebookError(FacebookError e); + + } + +} diff --git a/Android/Facebook/src/com/facebook/android/DialogError.java b/Android/Facebook/src/com/facebook/android/DialogError.java new file mode 100644 index 00000000..ff50a940 --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/DialogError.java @@ -0,0 +1,51 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +/** + * Encapsulation of Dialog Error. + * + * @author ssoneff@facebook.com + */ +public class DialogError extends Throwable { + + private static final long serialVersionUID = 1L; + + /** + * The ErrorCode received by the WebView: see + * http://developer.android.com/reference/android/webkit/WebViewClient.html + */ + private int mErrorCode; + + /** The URL that the dialog was trying to load */ + private String mFailingUrl; + + public DialogError(String message, int errorCode, String failingUrl) { + super(message); + mErrorCode = errorCode; + mFailingUrl = failingUrl; + } + + int getErrorCode() { + return mErrorCode; + } + + String getFailingUrl() { + return mFailingUrl; + } + +} diff --git a/Android/Facebook/src/com/facebook/android/Facebook.java b/Android/Facebook/src/com/facebook/android/Facebook.java new file mode 100644 index 00000000..20ac15fd --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/Facebook.java @@ -0,0 +1,756 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.MalformedURLException; + +import android.Manifest; +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.content.pm.Signature; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.CookieSyncManager; + +/** + * Main Facebook object for interacting with the Facebook developer API. + * Provides methods to log in and log out a user, make requests using the REST + * and Graph APIs, and start user interface interactions with the API (such as + * pop-ups promoting for credentials, permissions, stream posts, etc.) + * + * @author Steven Soneff (ssoneff@facebook.com), Jim Brusstar + * (jimbru@facebook.com), Yariv Sadan (yariv@facebook.com), + * Luke Shepard (lshepard@facebook.com) + */ +public class Facebook { + + /* Strings used in the OAuth flow */ + public static final String REDIRECT_URI = "fbconnect://success"; + public static final String CANCEL_URI = "fbconnect://cancel"; + public static final String TOKEN = "access_token"; + public static final String EXPIRES = "expires_in"; + public static final String SINGLE_SIGN_ON_DISABLED = "service_disabled"; + + public static final int FORCE_DIALOG_AUTH = -1; + + private static final String LOGIN = "login"; + + // Used as default activityCode by authorize(). See authorize() below. + private static final int DEFAULT_AUTH_ACTIVITY_CODE = 32665; + + /* Facebook server endpoints: may be modified in a subclass for testing */ + protected static String OAUTH_ENDPOINT = + "https://www.facebook.com/dialog/oauth"; + protected static String UI_SERVER = + "https://www.facebook.com/connect/uiserver.php"; + protected static String GRAPH_BASE_URL = + "https://graph.facebook.com/"; + protected static String RESTSERVER_URL = + "https://api.facebook.com/restserver.php"; + + private String mAccessToken = null; + private long mAccessExpires = 0; + private String mAppId; + + private Activity mAuthActivity; + private String[] mAuthPermissions; + private int mAuthActivityCode; + private DialogListener mAuthDialogListener; + + public Facebook(String applicationId) { + if (applicationId == null) { + throw new IllegalArgumentException( + "You must specify your application ID when instantiating a Facebook " + + "object. See README for details."); + } + mAppId = applicationId; + } + + /** + * Default authorize method doesn't require any permissions. + */ + public void authorize(Activity activity, final DialogListener listener) { + authorize(activity, new String[] {}, DEFAULT_AUTH_ACTIVITY_CODE, + listener); + } + + /** + * Overloaded signature. See authorize() below. + */ + public void authorize(Activity activity, String[] permissions, + final DialogListener listener) { + authorize(activity, permissions, DEFAULT_AUTH_ACTIVITY_CODE, listener); + } + + /** + * Starts either an activity or a dialog which prompts the user to log in to + * Facebook and grant the requested permissions to the given application. + * + * This method will, when possible, use Facebook's single sign-on for + * Android to obtain an access token. This involves proxying a call through + * the Facebook for Android stand-alone application, which will handle the + * authentication flow, and return an OAuth access token for making API + * calls. + * + * Because this process will not be available for all users, if single + * sign-on is not possible, this method will automatically fall back to the + * OAuth 2.0 User-Agent flow. In this flow, the user credentials are handled + * by Facebook in an embedded WebView, not by the client application. As + * such, the dialog makes a network request and renders HTML content rather + * than a native UI. The access token is retrieved from a redirect to a + * special URL that the WebView handles. + * + * Note that User credentials could be handled natively using the OAuth 2.0 + * Username and Password Flow, but this is not supported by this SDK. + * + * See http://developers.facebook.com/docs/authentication/ and + * http://wiki.oauth.net/OAuth-2 for more details. + * + * Note that this method is asynchronous and the callback will be invoked in + * the original calling thread (not in a background thread). + * + * Also note that requests may be made to the API without calling authorize + * first, in which case only public information is returned. + * + * IMPORTANT: Note that single sign-on authentication will not function + * correctly if you do not include a call to the authorizeCallback() method + * in your onActivityResult() function! Please see below for more + * information. single sign-on may be disabled by passing FORCE_DIALOG_AUTH + * as the activityCode parameter in your call to authorize(). + * + * @param activity + * The Android activity in which we want to display the + * authorization dialog. + * @param applicationId + * The Facebook application identifier e.g. "350685531728" + * @param permissions + * A list of permissions required for this application: e.g. + * "read_stream", "publish_stream", "offline_access", etc. see + * http://developers.facebook.com/docs/authentication/permissions + * This parameter should not be null -- if you do not require any + * permissions, then pass in an empty String array. + * @param activityCode + * Single sign-on requires an activity result to be called back + * to the client application -- if you are waiting on other + * activities to return data, pass a custom activity code here to + * avoid collisions. If you would like to force the use of legacy + * dialog-based authorization, pass FORCE_DIALOG_AUTH for this + * parameter. Otherwise just omit this parameter and Facebook + * will use a suitable default. See + * http://developer.android.com/reference/android/ + * app/Activity.html for more information. + * @param listener + * Callback interface for notifying the calling application when + * the authentication dialog has completed, failed, or been + * canceled. + */ + public void authorize(Activity activity, String[] permissions, + int activityCode, final DialogListener listener) { + + boolean singleSignOnStarted = false; + + mAuthDialogListener = listener; + + // Prefer single sign-on, where available. + if (activityCode >= 0) { + singleSignOnStarted = startSingleSignOn(activity, mAppId, + permissions, activityCode); + } + // Otherwise fall back to traditional dialog. + if (!singleSignOnStarted) { + + startDialogAuth(activity, mAppId, permissions); + } + } + + /** + * Internal method to handle single sign-on backend for authorize(). + * + * @param activity + * The Android Activity that will parent the ProxyAuth Activity. + * @param applicationId + * The Facebook application identifier. + * @param permissions + * A list of permissions required for this application. If you do + * not require any permissions, pass an empty String array. + * @param activityCode + * Activity code to uniquely identify the result Intent in the + * callback. + */ + private boolean startSingleSignOn(Activity activity, String applicationId, + String[] permissions, int activityCode) { + boolean didSucceed = true; + Intent intent = new Intent(); + + intent.setClassName("com.facebook.katana", + "com.facebook.katana.ProxyAuth"); + intent.putExtra("client_id", applicationId); + if (permissions.length > 0) { + intent.putExtra("scope", TextUtils.join(",", permissions)); + } + + // Verify that the application whose package name is + // com.facebook.katana.ProxyAuth + // has the expected FB app signature. + if (!validateAppSignatureForIntent(activity, intent)) { + return false; + } + + mAuthActivity = activity; + mAuthPermissions = permissions; + mAuthActivityCode = activityCode; + try { + activity.startActivityForResult(intent, activityCode); + } catch (ActivityNotFoundException e) { + didSucceed = false; + } + + return didSucceed; + } + + /** + * Query the signature for the application that would be invoked by the + * given intent and verify that it matches the FB application's signature. + * + * @param activity + * @param intent + * @param validSignature + * @return true if the app's signature matches the expected signature. + */ + private boolean validateAppSignatureForIntent(Activity activity, + Intent intent) { + + ResolveInfo resolveInfo = activity.getPackageManager().resolveActivity( + intent, 0); + if (resolveInfo == null) { + return false; + } + + String packageName = resolveInfo.activityInfo.packageName; + PackageInfo packageInfo; + try { + packageInfo = activity.getPackageManager().getPackageInfo( + packageName, PackageManager.GET_SIGNATURES); + } catch (NameNotFoundException e) { + return false; + } + + for (Signature signature : packageInfo.signatures) { + if (signature.toCharsString().equals(FB_APP_SIGNATURE)) { + return true; + } + } + return false; + } + + /** + * Internal method to handle dialog-based authentication backend for + * authorize(). + * + * @param activity + * The Android Activity that will parent the auth dialog. + * @param applicationId + * The Facebook application identifier. + * @param permissions + * A list of permissions required for this application. If you do + * not require any permissions, pass an empty String array. + */ + private void startDialogAuth(Activity activity, String applicationId, + String[] permissions) { + Bundle params = new Bundle(); + params.putString("client_id", applicationId); + if (permissions.length > 0) { + params.putString("scope", TextUtils.join(",", permissions)); + } + + CookieSyncManager.createInstance(activity); + dialog(activity, LOGIN, params, new DialogListener() { + + public void onComplete(Bundle values) { + // ensure any cookies set by the dialog are saved + CookieSyncManager.getInstance().sync(); + setAccessToken(values.getString(TOKEN)); + setAccessExpiresIn(values.getString(EXPIRES)); + if (isSessionValid()) { + Log.d("Facebook-authorize", "Login Success! access_token=" + + getAccessToken() + " expires=" + + getAccessExpires()); + mAuthDialogListener.onComplete(values); + } else { + mAuthDialogListener.onFacebookError(new FacebookError( + "Failed to receive access token.")); + } + } + + public void onError(DialogError error) { + Log.d("Facebook-authorize", "Login failed: " + error); + mAuthDialogListener.onError(error); + } + + public void onFacebookError(FacebookError error) { + Log.d("Facebook-authorize", "Login failed: " + error); + mAuthDialogListener.onFacebookError(error); + } + + public void onCancel() { + Log.d("Facebook-authorize", "Login canceled"); + mAuthDialogListener.onCancel(); + } + }); + } + + /** + * IMPORTANT: This method must be invoked at the top of the calling + * activity's onActivityResult() function or Facebook authentication will + * not function properly! + * + * If your calling activity does not currently implement onActivityResult(), + * you must implement it and include a call to this method if you intend to + * use the authorize() method in this SDK. + * + * For more information, see + * http://developer.android.com/reference/android/app/ + * Activity.html#onActivityResult(int, int, android.content.Intent) + */ + public void authorizeCallback(int requestCode, int resultCode, Intent data) { + if (requestCode == mAuthActivityCode) { + + // Successfully redirected. + if (resultCode == Activity.RESULT_OK) { + + // Check OAuth 2.0/2.10 error code. + String error = data.getStringExtra("error"); + if (error == null) { + error = data.getStringExtra("error_type"); + } + + // A Facebook error occurred. + if (error != null) { + if (error.equals(SINGLE_SIGN_ON_DISABLED) + || error.equals("AndroidAuthKillSwitchException")) { + Log.d("Facebook-authorize", "Hosted auth currently " + + "disabled. Retrying dialog auth..."); + startDialogAuth(mAuthActivity, mAppId, + mAuthPermissions); + } else if (error.equals("access_denied") + || error.equals("OAuthAccessDeniedException")) { + Log.d("Facebook-authorize", "Login canceled by user."); + mAuthDialogListener.onCancel(); + } else { + Log.d("Facebook-authorize", "Login failed: " + error); + mAuthDialogListener.onFacebookError(new FacebookError( + error)); + } + + // No errors. + } else { + setAccessToken(data.getStringExtra(TOKEN)); + setAccessExpiresIn(data.getStringExtra(EXPIRES)); + if (isSessionValid()) { + Log.d("Facebook-authorize", + "Login Success! access_token=" + + getAccessToken() + " expires=" + + getAccessExpires()); + mAuthDialogListener.onComplete(data.getExtras()); + } else { + mAuthDialogListener.onFacebookError(new FacebookError( + "Failed to receive access token.")); + } + } + + // An error occurred before we could be redirected. + } else if (resultCode == Activity.RESULT_CANCELED) { + + // An Android error occured. + if (data != null) { + Log.d("Facebook-authorize", + "Login failed: " + data.getStringExtra("error")); + mAuthDialogListener.onError(new DialogError(data + .getStringExtra("error"), data.getIntExtra( + "error_code", -1), data + .getStringExtra("failing_url"))); + + // User pressed the 'back' button. + } else { + Log.d("Facebook-authorize", "Login canceled by user."); + mAuthDialogListener.onCancel(); + } + } + } + } + + /** + * Invalidate the current user session by removing the access token in + * memory, clearing the browser cookie, and calling auth.expireSession + * through the API. + * + * Note that this method blocks waiting for a network response, so do not + * call it in a UI thread. + * + * @param context + * The Android context in which the logout should be called: it + * should be the same context in which the login occurred in + * order to clear any stored cookies + * @throws IOException + * @throws MalformedURLException + * @return JSON string representation of the auth.expireSession response + * ("true" if successful) + */ + public String logout(Context context) throws MalformedURLException, + IOException { + Util.clearCookies(context); + Bundle b = new Bundle(); + b.putString("method", "auth.expireSession"); + String response = request(b); + setAccessToken(null); + setAccessExpires(0); + return response; + } + + /** + * Make a request to Facebook's old (pre-graph) API with the given + * parameters. One of the parameter keys must be "method" and its value + * should be a valid REST server API method. + * + * See http://developers.facebook.com/docs/reference/rest/ + * + * Note that this method blocks waiting for a network response, so do not + * call it in a UI thread. + * + * Example: + * Bundle parameters = new Bundle(); + * parameters.putString("method", "auth.expireSession"); + * String response = request(parameters); + * + * + * @param parameters + * Key-value pairs of parameters to the request. Refer to the + * documentation: one of the parameters must be "method". + * @throws IOException + * if a network error occurs + * @throws MalformedURLException + * if accessing an invalid endpoint + * @throws IllegalArgumentException + * if one of the parameters is not "method" + * @return JSON string representation of the response + */ + public String request(Bundle parameters) throws MalformedURLException, + IOException { + if (!parameters.containsKey("method")) { + throw new IllegalArgumentException("API method must be specified. " + + "(parameters must contain key \"method\" and value). See" + + " http://developers.facebook.com/docs/reference/rest/"); + } + return request(null, parameters, "GET"); + } + + /** + * Make a request to the Facebook Graph API without any parameters. + * + * See http://developers.facebook.com/docs/api + * + * Note that this method blocks waiting for a network response, so do not + * call it in a UI thread. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @throws IOException + * @throws MalformedURLException + * @return JSON string representation of the response + */ + public String request(String graphPath) throws MalformedURLException, + IOException { + return request(graphPath, new Bundle(), "GET"); + } + + /** + * Make a request to the Facebook Graph API with the given string parameters + * using an HTTP GET (default method). + * + * See http://developers.facebook.com/docs/api + * + * Note that this method blocks waiting for a network response, so do not + * call it in a UI thread. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters "q" : "facebook" would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * @throws IOException + * @throws MalformedURLException + * @return JSON string representation of the response + */ + public String request(String graphPath, Bundle parameters) + throws MalformedURLException, IOException { + return request(graphPath, parameters, "GET"); + } + + /** + * Synchronously make a request to the Facebook Graph API with the given + * HTTP method and string parameters. Note that binary data parameters (e.g. + * pictures) are not yet supported by this helper function. + * + * See http://developers.facebook.com/docs/api + * + * Note that this method blocks waiting for a network response, so do not + * call it in a UI thread. + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters {"q" : "facebook"} would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * @param httpMethod + * http verb, e.g. "GET", "POST", "DELETE" + * @throws IOException + * @throws MalformedURLException + * @return JSON string representation of the response + */ + public String request(String graphPath, Bundle parameters, String httpMethod) + throws FileNotFoundException, MalformedURLException, IOException { + parameters.putString("format", "json"); + if (isSessionValid()) { + parameters.putString(TOKEN, getAccessToken()); + } + String url = graphPath != null ? GRAPH_BASE_URL + graphPath + : RESTSERVER_URL; + return Util.openUrl(url, httpMethod, parameters); + } + + /** + * Generate a UI dialog for the request action in the given Android context. + * + * Note that this method is asynchronous and the callback will be invoked in + * the original calling thread (not in a background thread). + * + * @param context + * The Android context in which we will generate this dialog. + * @param action + * String representation of the desired method: e.g. "login", + * "stream.publish", ... + * @param listener + * Callback interface to notify the application when the dialog + * has completed. + */ + public void dialog(Context context, String action, DialogListener listener) { + dialog(context, action, new Bundle(), listener); + } + + /** + * Generate a UI dialog for the request action in the given Android context + * with the provided parameters. + * + * Note that this method is asynchronous and the callback will be invoked in + * the original calling thread (not in a background thread). + * + * @param context + * The Android context in which we will generate this dialog. + * @param action + * String representation of the desired method: e.g. "login", + * "stream.publish", ... + * @param parameters + * key-value string parameters + * @param listener + * Callback interface to notify the application when the dialog + * has completed. + */ + public void dialog(Context context, String action, Bundle parameters, + final DialogListener listener) { + String endpoint; + if (action.equals(LOGIN)) { + endpoint = OAUTH_ENDPOINT; + parameters.putString("type", "user_agent"); + parameters.putString("redirect_uri", REDIRECT_URI); + } else { + endpoint = UI_SERVER; + parameters.putString("method", action); + parameters.putString("next", REDIRECT_URI); + } + parameters.putString("display", "touch"); + if (isSessionValid()) { + parameters.putString(TOKEN, getAccessToken()); + } + String url = endpoint + "?" + Util.encodeUrl(parameters); + + if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { + Util.showAlert(context, "Error", + "Application requires permission to access the Internet"); + } else { + System.out.println("FbDialog url: "+url); + + FbDialog test = new FbDialog(context, url, listener); + System.out.println("Constructed"); + + test.show(); + } + } + + /** + * @return boolean - whether this object has an non-expired session token + */ + public boolean isSessionValid() { + return (getAccessToken() != null) + && ((getAccessExpires() == 0) || (System.currentTimeMillis() < getAccessExpires())); + } + + /** + * Retrieve the OAuth 2.0 access token for API access: treat with care. + * Returns null if no session exists. + * + * @return String - access token + */ + public String getAccessToken() { + return mAccessToken; + } + + /** + * Retrieve the current session's expiration time (in milliseconds since + * Unix epoch), or 0 if the session doesn't expire or doesn't exist. + * + * @return long - session expiration time + */ + public long getAccessExpires() { + return mAccessExpires; + } + + /** + * Set the OAuth 2.0 access token for API access. + * + * @param token + * - access token + */ + public void setAccessToken(String token) { + mAccessToken = token; + } + + /** + * Set the current session's expiration time (in milliseconds since Unix + * epoch), or 0 if the session doesn't expire. + * + * @param time + * - timestamp in milliseconds + */ + public void setAccessExpires(long time) { + mAccessExpires = time; + } + + /** + * Set the current session's duration (in seconds since Unix epoch). + * + * @param expiresIn + * - duration in seconds + */ + public void setAccessExpiresIn(String expiresIn) { + if (expiresIn != null && !expiresIn.equals("0")) { + setAccessExpires(System.currentTimeMillis() + + Integer.parseInt(expiresIn) * 1000); + } + } + + public String getAppId() { + return mAppId; + } + + public void setAppId(String appId) { + mAppId = appId; + } + + /** + * Callback interface for dialog requests. + * + */ + public static interface DialogListener { + + /** + * Called when a dialog completes. + * + * Executed by the thread that initiated the dialog. + * + * @param values + * Key-value string pairs extracted from the response. + */ + public void onComplete(Bundle values); + + /** + * Called when a Facebook responds to a dialog with an error. + * + * Executed by the thread that initiated the dialog. + * + */ + public void onFacebookError(FacebookError e); + + /** + * Called when a dialog has an error. + * + * Executed by the thread that initiated the dialog. + * + */ + public void onError(DialogError e); + + /** + * Called when a dialog is canceled by the user. + * + * Executed by the thread that initiated the dialog. + * + */ + public void onCancel(); + + } + + public static final String FB_APP_SIGNATURE = + "30820268308201d102044a9c4610300d06092a864886f70d0101040500307a310" + + "b3009060355040613025553310b30090603550408130243413112301006035504" + + "07130950616c6f20416c746f31183016060355040a130f46616365626f6f6b204" + + "d6f62696c653111300f060355040b130846616365626f6f6b311d301b06035504" + + "03131446616365626f6f6b20436f72706f726174696f6e3020170d30393038333" + + "13231353231365a180f32303530303932353231353231365a307a310b30090603" + + "55040613025553310b30090603550408130243413112301006035504071309506" + + "16c6f20416c746f31183016060355040a130f46616365626f6f6b204d6f62696c" + + "653111300f060355040b130846616365626f6f6b311d301b06035504031314466" + + "16365626f6f6b20436f72706f726174696f6e30819f300d06092a864886f70d01" + + "0101050003818d0030818902818100c207d51df8eb8c97d93ba0c8c1002c928fa" + + "b00dc1b42fca5e66e99cc3023ed2d214d822bc59e8e35ddcf5f44c7ae8ade50d7" + + "e0c434f500e6c131f4a2834f987fc46406115de2018ebbb0d5a3c261bd97581cc" + + "fef76afc7135a6d59e8855ecd7eacc8f8737e794c60a761c536b72b11fac8e603" + + "f5da1a2d54aa103b8a13c0dbc10203010001300d06092a864886f70d010104050" + + "0038181005ee9be8bcbb250648d3b741290a82a1c9dc2e76a0af2f2228f1d9f9c" + + "4007529c446a70175c5a900d5141812866db46be6559e2141616483998211f4a6" + + "73149fb2232a10d247663b26a9031e15f84bc1c74d141ff98a02d76f85b2c8ab2" + + "571b6469b232d8e768a7f7ca04f7abe4a775615916c07940656b58717457b42bd" + + "928a2"; + +} diff --git a/Android/Facebook/src/com/facebook/android/FacebookError.java b/Android/Facebook/src/com/facebook/android/FacebookError.java new file mode 100644 index 00000000..c98bed94 --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/FacebookError.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +/** + * Encapsulation of a Facebook Error: a Facebook request that could not be + * fulfilled. + * + * @author ssoneff@facebook.com + */ +public class FacebookError extends Throwable { + + private static final long serialVersionUID = 1L; + + private int mErrorCode = 0; + private String mErrorType; + + public FacebookError(String message) { + super(message); + } + + public FacebookError(String message, String type, int code) { + super(message); + mErrorType = type; + mErrorCode = code; + } + + public int getErrorCode() { + return mErrorCode; + } + + public String getErrorType() { + return mErrorType; + } +} diff --git a/Android/Facebook/src/com/facebook/android/FbDialog.java b/Android/Facebook/src/com/facebook/android/FbDialog.java new file mode 100644 index 00000000..908b10f5 --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/FbDialog.java @@ -0,0 +1,185 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.Display; +import android.view.ViewGroup; +import android.view.Window; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.facebook.android.Facebook.DialogListener; + +public class FbDialog extends Dialog { + + static final int FB_BLUE = 0xFF6D84B4; + static final float[] DIMENSIONS_LANDSCAPE = {460, 260}; + static final float[] DIMENSIONS_PORTRAIT = {280, 420}; + static final FrameLayout.LayoutParams FILL = + new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, + ViewGroup.LayoutParams.FILL_PARENT); + static final int MARGIN = 4; + static final int PADDING = 2; + static final String DISPLAY_STRING = "touch"; + static final String FB_ICON = "icon.png"; + + private String mUrl; + private DialogListener mListener; + private ProgressDialog mSpinner; + private WebView mWebView; + private LinearLayout mContent; + private TextView mTitle; + + public FbDialog(Context context, String url, DialogListener listener) { + super(context); + Log.d("FbDialog","construct"); + + mUrl = url; + mListener = listener; + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.d("FbDialog","onCreate"); + + mSpinner = new ProgressDialog(getContext()); + mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE); + mSpinner.setMessage("Loading..."); + + mContent = new LinearLayout(getContext()); + mContent.setOrientation(LinearLayout.VERTICAL); + setUpTitle(); + setUpWebView(); + Display display = getWindow().getWindowManager().getDefaultDisplay(); + final float scale = getContext().getResources().getDisplayMetrics().density; + float[] dimensions = display.getWidth() < display.getHeight() ? + DIMENSIONS_PORTRAIT : DIMENSIONS_LANDSCAPE; + addContentView(mContent, new FrameLayout.LayoutParams( + (int) (dimensions[0] * scale + 0.5f), + (int) (dimensions[1] * scale + 0.5f))); + } + + private void setUpTitle() { + + requestWindowFeature(Window.FEATURE_NO_TITLE); +/* Drawable icon = getContext().getResources().getDrawable( + R.drawable.facebook_icon); */ + mTitle = new TextView(getContext()); + mTitle.setText("Facebook"); + mTitle.setTextColor(Color.WHITE); + mTitle.setTypeface(Typeface.DEFAULT_BOLD); + mTitle.setBackgroundColor(FB_BLUE); + mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN); + mTitle.setCompoundDrawablePadding(MARGIN + PADDING); +/* mTitle.setCompoundDrawablesWithIntrinsicBounds( + icon, null, null, null); */ + mContent.addView(mTitle); + } + + private void setUpWebView() { + + mWebView = new WebView(getContext()); + mWebView.setVerticalScrollBarEnabled(false); + mWebView.setHorizontalScrollBarEnabled(false); + mWebView.setWebViewClient(new FbDialog.FbWebViewClient()); + mWebView.getSettings().setJavaScriptEnabled(true); + mWebView.loadUrl(mUrl); + mWebView.setLayoutParams(FILL); + mContent.addView(mWebView); + } + + private class FbWebViewClient extends WebViewClient { + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.d("Facebook-WebView", "Redirect URL: " + url); + if (url.startsWith(Facebook.REDIRECT_URI)) { + Bundle values = Util.parseUrl(url); + + String error = values.getString("error"); + if (error == null) { + error = values.getString("error_type"); + } + + if (error == null) { + mListener.onComplete(values); + } else if (error.equals("access_denied") || + error.equals("OAuthAccessDeniedException")) { + mListener.onCancel(); + } else { + mListener.onFacebookError(new FacebookError(error)); + } + + FbDialog.this.dismiss(); + return true; + } else if (url.startsWith(Facebook.CANCEL_URI)) { + mListener.onCancel(); + FbDialog.this.dismiss(); + return true; + } else if (url.contains(DISPLAY_STRING)) { + return false; + } + // launch non-dialog URLs in a full browser + getContext().startActivity( + new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + return true; + } + + @Override + public void onReceivedError(WebView view, int errorCode, + String description, String failingUrl) { + super.onReceivedError(view, errorCode, description, failingUrl); + mListener.onError( + new DialogError(description, errorCode, failingUrl)); + FbDialog.this.dismiss(); + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + Log.d("Facebook-WebView", "Webview loading URL: " + url); + super.onPageStarted(view, url, favicon); + mSpinner.show(); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + String title = mWebView.getTitle(); + if (title != null && title.length() > 0) { + mTitle.setText(title); + } + mSpinner.dismiss(); + } + + } +} diff --git a/Android/Facebook/src/com/facebook/android/Util.java b/Android/Facebook/src/com/facebook/android/Util.java new file mode 100644 index 00000000..bb90a1d6 --- /dev/null +++ b/Android/Facebook/src/com/facebook/android/Util.java @@ -0,0 +1,299 @@ +/* + * Copyright 2010 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.android; + +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLDecoder; +import java.net.URLEncoder; + +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.AlertDialog.Builder; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; + + +/** + * Utility class supporting the Facebook Object. + * + * @author ssoneff@facebook.com + * + */ +public final class Util { + + /** + * Generate the multi-part post body providing the parameters and boundary + * string + * + * @param parameters the parameters need to be posted + * @param boundary the random string as boundary + * @return a string of the post body + */ + public static String encodePostBody(Bundle parameters, String boundary) { + if (parameters == null) return ""; + StringBuilder sb = new StringBuilder(); + + for (String key : parameters.keySet()) { + if (parameters.getByteArray(key) != null) { + continue; + } + + sb.append("Content-Disposition: form-data; name=\"" + key + + "\"\r\n\r\n" + parameters.getString(key)); + sb.append("\r\n" + "--" + boundary + "\r\n"); + } + + return sb.toString(); + } + + public static String encodeUrl(Bundle parameters) { + if (parameters == null) { + return ""; + } + + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String key : parameters.keySet()) { + if (first) first = false; else sb.append("&"); + sb.append(URLEncoder.encode(key) + "=" + + URLEncoder.encode(parameters.getString(key))); + } + return sb.toString(); + } + + public static Bundle decodeUrl(String s) { + Bundle params = new Bundle(); + if (s != null) { + String array[] = s.split("&"); + for (String parameter : array) { + String v[] = parameter.split("="); + params.putString(URLDecoder.decode(v[0]), + URLDecoder.decode(v[1])); + } + } + return params; + } + + /** + * Parse a URL query and fragment parameters into a key-value bundle. + * + * @param url the URL to parse + * @return a dictionary bundle of keys and values + */ + public static Bundle parseUrl(String url) { + // hack to prevent MalformedURLException + url = url.replace("fbconnect", "http"); + try { + URL u = new URL(url); + Bundle b = decodeUrl(u.getQuery()); + b.putAll(decodeUrl(u.getRef())); + return b; + } catch (MalformedURLException e) { + return new Bundle(); + } + } + + + /** + * Connect to an HTTP URL and return the response as a string. + * + * Note that the HTTP method override is used on non-GET requests. (i.e. + * requests are made as "POST" with method specified in the body). + * + * @param url - the resource to open: must be a welformed URL + * @param method - the HTTP method to use ("GET", "POST", etc.) + * @param params - the query parameter for the URL (e.g. access_token=foo) + * @return the URL contents as a String + * @throws MalformedURLException - if the URL format is invalid + * @throws IOException - if a network problem occurs + */ + public static String openUrl(String url, String method, Bundle params) + throws MalformedURLException, IOException { + // random string as boundary for multi-part http post + String strBoundary = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; + String endLine = "\r\n"; + + OutputStream os; + + if (method.equals("GET")) { + url = url + "?" + encodeUrl(params); + } + Log.d("Facebook-Util", method + " URL: " + url); + HttpURLConnection conn = + (HttpURLConnection) new URL(url).openConnection(); + conn.setRequestProperty("User-Agent", System.getProperties(). + getProperty("http.agent") + " FacebookAndroidSDK"); + if (!method.equals("GET")) { + Bundle dataparams = new Bundle(); + for (String key : params.keySet()) { + if (params.getByteArray(key) != null) { + dataparams.putByteArray(key, params.getByteArray(key)); + } + } + + // use method override + if (!params.containsKey("method")) { + params.putString("method", method); + } + + if (params.containsKey("access_token")) { + String decoded_token = URLDecoder.decode(params.getString("access_token")); + params.putString("access_token", decoded_token); + } + + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+strBoundary); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.connect(); + os = new BufferedOutputStream(conn.getOutputStream()); + + os.write(("--" + strBoundary +endLine).getBytes()); + os.write((encodePostBody(params, strBoundary)).getBytes()); + os.write((endLine + "--" + strBoundary + endLine).getBytes()); + + if (!dataparams.isEmpty()) { + + for (String key: dataparams.keySet()){ + os.write(("Content-Disposition: form-data; filename=\"" + key + "\"" + endLine).getBytes()); + os.write(("Content-Type: content/unknown" + endLine + endLine).getBytes()); + os.write(dataparams.getByteArray(key)); + os.write((endLine + "--" + strBoundary + endLine).getBytes()); + + } + } + os.flush(); + } + + String response = ""; + try { + response = read(conn.getInputStream()); + } catch (FileNotFoundException e) { + // Error Stream contains JSON that we can parse to a FB error + response = read(conn.getErrorStream()); + } + return response; + } + + private static String read(InputStream in) throws IOException { + StringBuilder sb = new StringBuilder(); + BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000); + for (String line = r.readLine(); line != null; line = r.readLine()) { + sb.append(line); + } + in.close(); + return sb.toString(); + } + + public static void clearCookies(Context context) { + // Edge case: an illegal state exception is thrown if an instance of + // CookieSyncManager has not be created. CookieSyncManager is normally + // created by a WebKit view, but this might happen if you start the + // app, restore saved state, and click logout before running a UI + // dialog in a WebView -- in which case the app crashes + @SuppressWarnings("unused") + CookieSyncManager cookieSyncMngr = + CookieSyncManager.createInstance(context); + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.removeAllCookie(); + } + + /** + * Parse a server response into a JSON Object. This is a basic + * implementation using org.json.JSONObject representation. More + * sophisticated applications may wish to do their own parsing. + * + * The parsed JSON is checked for a variety of error fields and + * a FacebookException is thrown if an error condition is set, + * populated with the error message and error type or code if + * available. + * + * @param response - string representation of the response + * @return the response as a JSON Object + * @throws JSONException - if the response is not valid JSON + * @throws FacebookError - if an error condition is set + */ + public static JSONObject parseJson(String response) + throws JSONException, FacebookError { + // Edge case: when sending a POST request to /[post_id]/likes + // the return value is 'true' or 'false'. Unfortunately + // these values cause the JSONObject constructor to throw + // an exception. + if (response.equals("false")) { + throw new FacebookError("request failed"); + } + if (response.equals("true")) { + response = "{value : true}"; + } + JSONObject json = new JSONObject(response); + + // errors set by the server are not consistent + // they depend on the method and endpoint + if (json.has("error")) { + JSONObject error = json.getJSONObject("error"); + throw new FacebookError( + error.getString("message"), error.getString("type"), 0); + } + if (json.has("error_code") && json.has("error_msg")) { + throw new FacebookError(json.getString("error_msg"), "", + Integer.parseInt(json.getString("error_code"))); + } + if (json.has("error_code")) { + throw new FacebookError("request failed", "", + Integer.parseInt(json.getString("error_code"))); + } + if (json.has("error_msg")) { + throw new FacebookError(json.getString("error_msg")); + } + if (json.has("error_reason")) { + throw new FacebookError(json.getString("error_reason")); + } + return json; + } + + /** + * Display a simple alert dialog with the given text and title. + * + * @param context + * Android context in which the dialog should be displayed + * @param title + * Alert dialog title + * @param text + * Alert dialog message + */ + public static void showAlert(Context context, String title, String text) { + Builder alertBuilder = new Builder(context); + alertBuilder.setTitle(title); + alertBuilder.setMessage(text); + alertBuilder.create().show(); + } + +} diff --git a/Android/Facebook/src/com/phonegap/plugins/facebook/FacebookAuth.java b/Android/Facebook/src/com/phonegap/plugins/facebook/FacebookAuth.java new file mode 100755 index 00000000..50b847ad --- /dev/null +++ b/Android/Facebook/src/com/phonegap/plugins/facebook/FacebookAuth.java @@ -0,0 +1,118 @@ +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ +package com.phonegap.plugins.facebook; + +import org.json.JSONArray; +import org.json.JSONException; + +import android.content.Intent; +import android.content.Context; +import android.app.Activity; + +import android.net.Uri; +import android.os.Bundle; + +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; + +import com.facebook.android.Facebook; +import com.facebook.android.AsyncFacebookRunner; +import com.facebook.android.Facebook.DialogListener; +import com.facebook.android.DialogError; +import com.facebook.android.FacebookError; + +public class FacebookAuth extends Plugin { + + public static final String APP_ID = "175729095772478"; + private Facebook mFb; + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackId The callback id used when calling back into JavaScript. + * @return A PluginResult object with a status and message. + */ + public PluginResult execute(String action, JSONArray args, String callbackId) { + PluginResult.Status status = PluginResult.Status.OK; + String result = ""; + System.out.println("execute: "+ action); + + try { + if (action.equals("authorize")) { + + result = this.authorize(args.getString(0)); + if (result.length() > 0) { + status = PluginResult.Status.ERROR; + } + System.out.println("result: "+ result); + + } + + return new PluginResult(status, result); + } catch (JSONException e) { + System.out.println("exception: "+ action); + + return new PluginResult(PluginResult.Status.JSON_EXCEPTION); + } + } + + /** + * Identifies if action to be executed returns a value and should be run synchronously. + * + * @param action The action to execute + * @return T=returns value + */ + public boolean isSynch(String action) { + return false; + } + + /** + * Called by AccelBroker when listener is to be shut down. + * Stop listener. + */ + public void onDestroy() { + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Display a new browser with the specified URL. + * + * @param url The url to load. + * @param usePhoneGap Load url in PhoneGap webview + * @return "" if ok, or error message. + */ + public String authorize(String url) { + + this.mFb = new Facebook(APP_ID); + this.mFb.authorize((Activity) this.ctx, new AuthorizeListener()); + return "string"; + } + + class AuthorizeListener implements DialogListener { + public void onComplete(Bundle values) { + // Handle a successful login + } + public void onFacebookError(FacebookError e) { + e.printStackTrace(); + } + + public void onError(DialogError e) { + e.printStackTrace(); + } + + public void onCancel() { + } + } + + +} diff --git a/Android/Facebook/www/facebook.js b/Android/Facebook/www/facebook.js new file mode 100755 index 00000000..426ec4ea --- /dev/null +++ b/Android/Facebook/www/facebook.js @@ -0,0 +1,34 @@ +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2010, Nitobi Software Inc. + * Copyright (c) 2010, IBM Corporation + */ + + +(function(){ + /** + * Constructor + */ + function Facebook() {} + + /** + * Display a new browser with the specified URL. + * + * @param url The url to load + * @param usePhoneGap Load url in PhoneGap webview [optional] + */ + Facebook.prototype.authorize = function(url) { + PhoneGap.exec(null, null, "FacebookAuth", "authorize", [url]); + }; + + /** + * Load ChildBrowser + */ + PhoneGap.addConstructor(function() { + PhoneGap.addPlugin("facebook", new Facebook()); + PluginManager.addService("FacebookAuth", "com.phonegap.plugins.facebook.FacebookAuth"); + }); + +})(); \ No newline at end of file From f056925ad2195e7e66394eb07ed88a750574d19d Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Wed, 19 Oct 2011 18:27:39 -0700 Subject: [PATCH 12/33] ChildBrowser plugin for WindowsPhone Mango --- WindowsPhone/ChildBrowser/ChildBrowser.js | 90 ++++++++ .../ChildBrowser/ChildBrowserCommand.cs | 198 ++++++++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 WindowsPhone/ChildBrowser/ChildBrowser.js create mode 100644 WindowsPhone/ChildBrowser/ChildBrowserCommand.cs diff --git a/WindowsPhone/ChildBrowser/ChildBrowser.js b/WindowsPhone/ChildBrowser/ChildBrowser.js new file mode 100644 index 00000000..8f45548a --- /dev/null +++ b/WindowsPhone/ChildBrowser/ChildBrowser.js @@ -0,0 +1,90 @@ +/* MIT licensed */ +// (c) 2010 Jesse MacFadyen, Nitobi + +/*global PhoneGap */ + +function ChildBrowser() { + // Does nothing +} + +// Callback when the location of the page changes +// called from native +ChildBrowser._onLocationChange = function(newLoc) +{ + window.plugins.childBrowser.onLocationChange(newLoc); +}; + +// Callback when the user chooses the 'Done' button +// called from native +ChildBrowser._onClose = function() +{ + window.plugins.childBrowser.onClose(); +}; + +// Callback when the user chooses the 'open in Safari' button +// called from native +ChildBrowser._onOpenExternal = function() +{ + window.plugins.childBrowser.onOpenExternal(); +}; + +// Pages loaded into the ChildBrowser can execute callback scripts, so be careful to +// check location, and make sure it is a location you trust. +// Warning ... don't exec arbitrary code, it's risky and could fuck up your app. +// called from native +ChildBrowser._onJSCallback = function(js,loc) +{ + // Not Implemented + //window.plugins.childBrowser.onJSCallback(js,loc); +}; + +/* The interface that you will use to access functionality */ + +// Show a webpage, will result in a callback to onLocationChange +ChildBrowser.prototype.showWebPage = function(loc,geolocationEnabled) +{ + var success = function(msg) + { + console.log("ChildBrowser.showWebPage success :: " + msg); + }; + + var error = function(e) + { + console.log("ChildBrowser.showWebPage error :: " + e); + }; + + var options = + { + url:loc, + geolocationEnabled:(geolocationEnabled == true) + + }; + + PhoneGap.exec(success,error,"ChildBrowserCommand","showWebPage", options); + //setTimeout(this.close,5000); +}; + +// close the browser, will NOT result in close callback +ChildBrowser.prototype.close = function() +{ + PhoneGap.exec(null,null,"ChildBrowserCommand","close"); +}; + +// Not Implemented +ChildBrowser.prototype.jsExec = function(jsString) +{ + // Not Implemented!! + //PhoneGap.exec("ChildBrowserCommand.jsExec",jsString); +}; + +// Note: this plugin does NOT install itself, call this method some time after deviceready to install it +// it will be returned, and also available globally from window.plugins.childBrowser +ChildBrowser.install = function() +{ + if(!window.plugins) { + window.plugins = {}; + } + + window.plugins.childBrowser = new ChildBrowser(); + return window.plugins.childBrowser; +}; diff --git a/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs b/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs new file mode 100644 index 00000000..935f7eb5 --- /dev/null +++ b/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs @@ -0,0 +1,198 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using Microsoft.Phone.Controls; +using System.Diagnostics; +using System.Runtime.Serialization; +using WP7GapClassLib.PhoneGap.UI; +using Microsoft.Phone.Shell; + +namespace WP7GapClassLib.PhoneGap.Commands +{ + [DataContract] + public class BrowserOptions + { + [DataMember] + public string url; + + [DataMember] + public bool isGeolocationEnabled; + } + + public class ChildBrowserCommand : BaseCommand + { + + private static WebBrowser browser; + private static ApplicationBarIconButton backButton; + private static ApplicationBarIconButton fwdButton; + + // Display an inderminate progress indicator + public void showWebPage(string options) + { + BrowserOptions opts = JSON.JsonHelper.Deserialize(options); + + Uri loc = new Uri(opts.url); + + Deployment.Current.Dispatcher.BeginInvoke(() => + { + if (browser != null) + { + browser.IsGeolocationEnabled = opts.isGeolocationEnabled; + browser.Navigate(loc); + } + else + { + PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame; + if (frame != null) + { + PhoneApplicationPage page = frame.Content as PhoneApplicationPage; + if (page != null) + { + Grid grid = page.FindName("LayoutRoot") as Grid; + if (grid != null) + { + browser = new WebBrowser(); + browser.Navigate(loc); + + browser.LoadCompleted += new System.Windows.Navigation.LoadCompletedEventHandler(browser_LoadCompleted); + + browser.Navigating += new EventHandler(browser_Navigating); + browser.NavigationFailed += new System.Windows.Navigation.NavigationFailedEventHandler(browser_NavigationFailed); + browser.Navigated += new EventHandler(browser_Navigated); + browser.IsScriptEnabled = true; + browser.IsGeolocationEnabled = opts.isGeolocationEnabled; + grid.Children.Add(browser); + } + + ApplicationBar bar = new ApplicationBar(); + bar.BackgroundColor = Colors.Black; + bar.IsMenuEnabled = false; + + backButton = new ApplicationBarIconButton(); + backButton.Text = "Back"; + backButton.IconUri = new Uri("/Images/appbar.back.rest.png", UriKind.Relative); + backButton.Click += new EventHandler(backButton_Click); + backButton.IsEnabled = false; + bar.Buttons.Add(backButton); + + + fwdButton = new ApplicationBarIconButton(); + fwdButton.Text = "Forward"; + fwdButton.IconUri = new Uri("/Images/appbar.next.rest.png", UriKind.Relative); + fwdButton.Click += new EventHandler(fwdButton_Click); + fwdButton.IsEnabled = false; + bar.Buttons.Add(fwdButton); + + ApplicationBarIconButton closeBtn = new ApplicationBarIconButton(); + closeBtn.Text = "Close"; + closeBtn.IconUri = new Uri("/Images/appbar.close.rest.png", UriKind.Relative); + closeBtn.Click += new EventHandler(closeBtn_Click); + bar.Buttons.Add(closeBtn); + + page.ApplicationBar = bar; + } + + } + } + }); + } + + void browser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) + { + + } + + void fwdButton_Click(object sender, EventArgs e) + { + if (browser != null) + { + try + { + browser.InvokeScript("execScript", "history.forward();"); + } + catch(Exception) + { + + } + } + } + + void backButton_Click(object sender, EventArgs e) + { + if (browser != null) + { + try + { + browser.InvokeScript("execScript", "history.back();"); + } + catch (Exception) + { + + } + } + } + + void closeBtn_Click(object sender, EventArgs e) + { + this.close(); + } + + + public void close(string options="") + { + if (browser != null) + { + Deployment.Current.Dispatcher.BeginInvoke(() => + { + PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame; + if (frame != null) + { + PhoneApplicationPage page = frame.Content as PhoneApplicationPage; + if (page != null) + { + Grid grid = page.FindName("LayoutRoot") as Grid; + if (grid != null) + { + grid.Children.Remove(browser); + } + page.ApplicationBar = null; + } + } + browser = null; + }); + } + } + + void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) + { + string message = "{type:\"locationChanged\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.OK, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + void browser_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e) + { + string message = "{type:\"navigationError\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.ERROR, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + void browser_Navigating(object sender, NavigatingEventArgs e) + { + string message = "{type:\"locationAboutToChange\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + PluginResult result = new PluginResult(PluginResult.Status.OK, message); + result.KeepCallback = true; + this.DispatchCommandResult(result); + } + + } +} From 49ed1db97b440dbab28df35175dff382bbe3aff9 Mon Sep 17 00:00:00 2001 From: Molu Samuel Date: Sun, 30 Oct 2011 00:21:08 +0200 Subject: [PATCH 13/33] adding DateTimePicker plugin for Android --- Android/DateTimePicker/DatePickerPlugin.java | 152 +++++++++++++++++++ Android/DateTimePicker/README.txt | 50 ++++++ Android/DateTimePicker/datePickerPlugin.js | 30 ++++ 3 files changed, 232 insertions(+) create mode 100644 Android/DateTimePicker/DatePickerPlugin.java create mode 100644 Android/DateTimePicker/README.txt create mode 100644 Android/DateTimePicker/datePickerPlugin.js diff --git a/Android/DateTimePicker/DatePickerPlugin.java b/Android/DateTimePicker/DatePickerPlugin.java new file mode 100644 index 00000000..a92248a7 --- /dev/null +++ b/Android/DateTimePicker/DatePickerPlugin.java @@ -0,0 +1,152 @@ +/** + * + */ +package com.ngapplication.plugin; + +import java.util.Calendar; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.DatePickerDialog; +import android.app.DatePickerDialog.OnDateSetListener; +import android.app.TimePickerDialog; +import android.app.TimePickerDialog.OnTimeSetListener; +import android.util.Log; +import android.widget.DatePicker; +import android.widget.TimePicker; + +import com.phonegap.api.PhonegapActivity; +import com.phonegap.api.Plugin; +import com.phonegap.api.PluginResult; +import com.phonegap.api.PluginResult.Status; + +/** + * @author ng4e + * + */ +public class DatePickerPlugin extends Plugin { + + private static final String ACTION_DATE = "date"; + private static final String ACTION_TIME = "time"; + + /* + * (non-Javadoc) + * + * @see com.phonegap.api.Plugin#execute(java.lang.String, + * org.json.JSONArray, java.lang.String) + */ + @Override + public PluginResult execute(final String action, final JSONArray data, + final String callBackId) { + Log.d("DatePickerPlugin", "Plugin Called"); + PluginResult result = null; + + if (ACTION_DATE.equalsIgnoreCase(action)) { + Log.d("DatePickerPluginListener execute", ACTION_DATE); + this.showDatePicker(callBackId); + final PluginResult r = new PluginResult( + PluginResult.Status.NO_RESULT); + r.setKeepCallback(true); + return r; + + } else if (ACTION_TIME.equalsIgnoreCase(action)) { + Log.d("DatePickerPluginListener execute", ACTION_TIME); + this.showTimePicker(callBackId); + final PluginResult r = new PluginResult( + PluginResult.Status.NO_RESULT); + r.setKeepCallback(true); + return r; + + } else { + result = new PluginResult(Status.INVALID_ACTION); + Log.d("DatePickerPlugin", "Invalid action : " + action + " passed"); + } + + return result; + } + + public synchronized void showTimePicker(final String callBackId) { + final DatePickerPlugin datePickerPlugin = this; + final PhonegapActivity currentCtx = ctx; + + final Runnable runnable = new Runnable() { + + public void run() { + final TimePickerDialog tpd = new TimePickerDialog(currentCtx, + new OnTimeSetListener() { + + public void onTimeSet(final TimePicker view, + final int hourOfDay, final int minute) { + final JSONObject userChoice = new JSONObject(); + try { + userChoice.put("hour", hourOfDay); + userChoice.put("min", minute); + } catch (final JSONException jsonEx) { + Log.e("showDatePicker", + "Got JSON Exception " + + jsonEx.getMessage()); + datePickerPlugin.error(new PluginResult( + Status.JSON_EXCEPTION), callBackId); + } + datePickerPlugin.success(new PluginResult( + PluginResult.Status.OK, userChoice), + callBackId); + + } + }, 1, 1, true); + + tpd.show(); + } + }; + ctx.runOnUiThread(runnable); + + } + + public synchronized void showDatePicker(final String callBackId) { + + final DatePickerPlugin datePickerPlugin = this; + final PhonegapActivity currentCtx = ctx; + final Calendar c = Calendar.getInstance(); + final int mYear = c.get(Calendar.YEAR); + final int mMonth = c.get(Calendar.MONTH); + final int mDay = c.get(Calendar.DAY_OF_MONTH); + + final Runnable runnable = new Runnable() { + + public void run() { + final DatePickerDialog dpd = new DatePickerDialog(currentCtx, + new OnDateSetListener() { + + public void onDateSet(final DatePicker view, + final int year, final int monthOfYear, + final int dayOfMonth) { + + final JSONObject userChoice = new JSONObject(); + + try { + userChoice.put("year", year); + userChoice.put("month", monthOfYear); + userChoice.put("day", dayOfMonth); + } catch (final JSONException jsonEx) { + Log.e("showDatePicker", + "Got JSON Exception " + + jsonEx.getMessage()); + datePickerPlugin.error(new PluginResult( + Status.JSON_EXCEPTION), callBackId); + } + + datePickerPlugin.success(new PluginResult( + PluginResult.Status.OK, userChoice), + callBackId); + + } + }, mYear, mMonth, mDay); + + dpd.show(); + } + }; + ctx.runOnUiThread(runnable); + } + +} diff --git a/Android/DateTimePicker/README.txt b/Android/DateTimePicker/README.txt new file mode 100644 index 00000000..50bf857e --- /dev/null +++ b/Android/DateTimePicker/README.txt @@ -0,0 +1,50 @@ +This plugin allows you to leave the PhoneGap webview and enter into the native android date and time picker. +Once the user has selected time or date, they will be sent back into the PhoneGap webview with selected value available. + + +How to use: + +Usage: + +window.plugins.datePickerPlugin.showDateOrTime(dataType,successCallback,errorCallback); + +dataType argument takes two value: + 'date' : if you need the datePicker + 'time' : if you need the timePicker + +For the date picker : Success returns an object with the parameters {day,month,year} filled with selected values. +For the time picker : Success returns an object with the parameters {hour,min} filled with selected values. + +Example: + + document.querySelector("#mypickdatebutton").addEventListener("tap", function() { + window.plugins.datePickerPlugin.showDateOrTime( + 'date', + function(r){ + document.getElementById("mydatetargetfield").value = r.day + "/" + r.month + "/" + r.year; + }, + function(e){console.log(e);} + ); + }, false); + + document.querySelector("#mypickdatebutton").addEventListener("tap", function() { + window.plugins.datePickerPlugin.showDateOrTime( + 'time', + function(r){ + document.getElementById("mytimetargetfield").value = r.hour + "h" + r.min; + }, + function(e){ + console.log(e); + } + ); + }, false); + + + +For the current files to work, you'll need to create a package (folders) called com.ngapplication.plugin. +You can change this to whatever you like, just update the datePickerPlugin.js and datePickerPlugin.java. + +datePickerPlugin.js should go in the asset folder and should be referenced in your index.html file. + + +Limitations: diff --git a/Android/DateTimePicker/datePickerPlugin.js b/Android/DateTimePicker/datePickerPlugin.js new file mode 100644 index 00000000..190ee747 --- /dev/null +++ b/Android/DateTimePicker/datePickerPlugin.js @@ -0,0 +1,30 @@ +/** + * + * @return Object literal singleton instance of DatePicker + */ +var DatePicker = function() { + +}; + +DatePicker.prototype.showDateOrTime = function(action,successCallback, failureCallback) { + return PhoneGap.exec( + successCallback, //Success callback from the plugin + failureCallback, //Error callback from the plugin + 'DatePickerPlugin', //Tell PhoneGap to run "DatePickerPlugin" Plugin + action, //Tell plugin, which action we want to perform + []); //Passing list of args to the plugin +}; + +/** + * Enregistre une nouvelle bibliothèque de fonctions + * auprès de PhoneGap + **/ + +PhoneGap.addConstructor(function() { + //Register the javascript plugin with PhoneGap + PhoneGap.addPlugin('datePickerPlugin', new DatePicker()); + + //Register the native class of plugin with PhoneGap + PluginManager.addService("DatePickerPlugin", + "com.ngapplication.plugin.DatePickerPlugin"); +}); \ No newline at end of file From 578dbfee18632dbcaa85440c79e442e41ce0d9fb Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:19:40 -0700 Subject: [PATCH 14/33] Social Sharing plugin --- WindowsPhone/PGSocialShare/PGSocialShare.cs | 76 +++++++++++++++++++++ WindowsPhone/PGSocialShare/PGSocialShare.js | 44 ++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 WindowsPhone/PGSocialShare/PGSocialShare.cs create mode 100644 WindowsPhone/PGSocialShare/PGSocialShare.js diff --git a/WindowsPhone/PGSocialShare/PGSocialShare.cs b/WindowsPhone/PGSocialShare/PGSocialShare.cs new file mode 100644 index 00000000..95facc02 --- /dev/null +++ b/WindowsPhone/PGSocialShare/PGSocialShare.cs @@ -0,0 +1,76 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.Runtime.Serialization; +using Microsoft.Phone.Tasks; + +namespace WP7GapClassLib.PhoneGap.Commands +{ + + public class PGSocialShare : BaseCommand + { + public enum ShareType + { + Status = 0, // status update to twitter/facebook/... all supported device accounts + Link // share a link on twitter/facebook/ ... all supported device accounts + } + + + [DataContract] + public class ShareOptions + { + [DataMember] + public string url; + + [DataMember] + public string title; + + [DataMember] + public string message; + + [DataMember] + public ShareType shareType = ShareType.Status; // default + } + + public void share(string options) + { + ShareOptions opts = JSON.JsonHelper.Deserialize(options); + switch (opts.shareType) + { + case ShareType.Status : + shareStatus(opts.message); + break; + case ShareType.Link : + shareLink(opts.title, opts.url, opts.message); + break; + } + } + + protected void shareStatus(string msg) + { + ShareStatusTask shareStatusTask = new ShareStatusTask(); + shareStatusTask.Status = msg; + shareStatusTask.Show(); + + this.DispatchCommandResult(); + } + + protected void shareLink(string title, string url, string msg) + { + ShareLinkTask shareLinkTask = new ShareLinkTask(); + shareLinkTask.Title = title; + shareLinkTask.LinkUri = new Uri(url, UriKind.Absolute); + shareLinkTask.Message = msg; + shareLinkTask.Show(); + + this.DispatchCommandResult(); + } + } +} diff --git a/WindowsPhone/PGSocialShare/PGSocialShare.js b/WindowsPhone/PGSocialShare/PGSocialShare.js new file mode 100644 index 00000000..80f3b8bf --- /dev/null +++ b/WindowsPhone/PGSocialShare/PGSocialShare.js @@ -0,0 +1,44 @@ +/* MIT licensed */ +// (c) 2011 Jesse MacFadyen, Adobe Systems Incorporated + + + +(function(){ + + var PGSocialShare = + { + ShareType: + { + status:0, + link:1 + } + } + + PhoneGap.addConstructor(function() { + + navigator.plugins.pgSocialShare = + { + shareStatus:function(msg) + { + var options = {"message":msg,"shareType":PGSocialShare.ShareType.status}; + PhoneGap.exec(null,null,"PGSocialShare","share",options); + }, + + shareLink:function(title,url,msg) + { + var options = {"message":msg, + "title":title, + "url":url, + "shareType":PGSocialShare.ShareType.link}; + + PhoneGap.exec(null,null,"PGSocialShare","share",options); + } + } + + + + }); + + + +})(); \ No newline at end of file From 024aa73ceda29a15727bf76eb9a278b3d5b66add Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:26:18 -0700 Subject: [PATCH 15/33] Readme --- WindowsPhone/PGSocialShare/readme.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 WindowsPhone/PGSocialShare/readme.md diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md new file mode 100644 index 00000000..26621a14 --- /dev/null +++ b/WindowsPhone/PGSocialShare/readme.md @@ -0,0 +1,22 @@ +Sample Use: +=============== + +<script type="text/javascript" charset="utf-8" src="PGSocialShare.js"></script> + + + function shareStatus() + { + navigator.plugins.pgSocialShare.shareStatus("This was shared from JS+PhoneGap+WP7 Yo!"); + } + + function shareLink() + { + navigator.plugins.pgSocialShare.shareLink("WP7 PhoneGap Plugins", + "https://github.com/purplecabbage/phonegap-plugins/tree/master/WindowsPhone", + "Watch for updates here soon! Shared from JavaScript"); + } + + + + <input style="display:block;margin:40px 0px" type="button" onclick="shareLink()" value="Share a Link"/> + <input style="display:block;margin:40px 0px" type="button" onclick="shareStatus()" value="Update your Status"/> From d4709e39e097bc4b262cbbcb5affa2e5bee15e82 Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:27:57 -0700 Subject: [PATCH 16/33] formatting ... --- WindowsPhone/PGSocialShare/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md index 26621a14..1d56aca5 100644 --- a/WindowsPhone/PGSocialShare/readme.md +++ b/WindowsPhone/PGSocialShare/readme.md @@ -1,7 +1,7 @@ Sample Use: =============== -<script type="text/javascript" charset="utf-8" src="PGSocialShare.js"></script> +<script type="text/javascript" charset="utf-8" src="PGSocialShare.js"></script> function shareStatus() From 94cb54785737493d2f02636ca3853ae2a539ffa5 Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:29:05 -0700 Subject: [PATCH 17/33] formatting ... --- WindowsPhone/PGSocialShare/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md index 1d56aca5..bad8a8c7 100644 --- a/WindowsPhone/PGSocialShare/readme.md +++ b/WindowsPhone/PGSocialShare/readme.md @@ -18,5 +18,5 @@ Sample Use: - <input style="display:block;margin:40px 0px" type="button" onclick="shareLink()" value="Share a Link"/> - <input style="display:block;margin:40px 0px" type="button" onclick="shareStatus()" value="Update your Status"/> + + From be81bb739b162e4300d62eae5ff811a2f6fd351c Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:30:50 -0700 Subject: [PATCH 18/33] formatting ... --- WindowsPhone/PGSocialShare/readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md index bad8a8c7..ee6096c4 100644 --- a/WindowsPhone/PGSocialShare/readme.md +++ b/WindowsPhone/PGSocialShare/readme.md @@ -1,8 +1,14 @@ Sample Use: =============== -<script type="text/javascript" charset="utf-8" src="PGSocialShare.js"></script> +In your +--- + + + +Somewhere in your code +--- function shareStatus() { @@ -17,6 +23,8 @@ Sample Use: } +In your markup : +--- From a2e51c68c26113d21885e961607ba240c18a3c82 Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:31:47 -0700 Subject: [PATCH 19/33] formatting ... --- WindowsPhone/PGSocialShare/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md index ee6096c4..7811d508 100644 --- a/WindowsPhone/PGSocialShare/readme.md +++ b/WindowsPhone/PGSocialShare/readme.md @@ -1,7 +1,7 @@ Sample Use: =============== -In your +In your head --- From 543048ffb5e4baf2d2b396c6e029cf9ab47bd67b Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Thu, 3 Nov 2011 18:33:35 -0700 Subject: [PATCH 20/33] formatting ... --- WindowsPhone/PGSocialShare/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WindowsPhone/PGSocialShare/readme.md b/WindowsPhone/PGSocialShare/readme.md index 7811d508..883b1fd3 100644 --- a/WindowsPhone/PGSocialShare/readme.md +++ b/WindowsPhone/PGSocialShare/readme.md @@ -4,7 +4,7 @@ Sample Use: In your head --- - +[script type="text/javascript" charset="utf-8" src="PGSocialShare.js"][/script] Somewhere in your code From 8af2559979a1f99fcac210dc2e7500b9c0eac9e8 Mon Sep 17 00:00:00 2001 From: Evan Chen Date: Fri, 4 Nov 2011 17:26:12 -0700 Subject: [PATCH 21/33] dismiss modal view controller ios 5 --- iPhone/ChildBrowser/ChildBrowserViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iPhone/ChildBrowser/ChildBrowserViewController.m b/iPhone/ChildBrowser/ChildBrowserViewController.m index 3f4464b0..d6c97c85 100644 --- a/iPhone/ChildBrowser/ChildBrowserViewController.m +++ b/iPhone/ChildBrowser/ChildBrowserViewController.m @@ -109,7 +109,7 @@ -(void)closeBrowser [delegate onClose]; } - [ [super parentViewController] dismissModalViewControllerAnimated:YES]; + [super dismissModalViewControllerAnimated:YES]; } -(IBAction) onDoneButtonPress:(id)sender From c558609264e48dde728b1a4c96134faa47fa59ea Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Fri, 18 Nov 2011 16:32:04 -0800 Subject: [PATCH 22/33] WP7 Map launcher for searching nearby and getting directions --- WindowsPhone/PGMapLauncher/PGMapLauncher.cs | 124 ++++++++++++++++++++ WindowsPhone/PGMapLauncher/PGMapLauncher.js | 31 +++++ 2 files changed, 155 insertions(+) create mode 100644 WindowsPhone/PGMapLauncher/PGMapLauncher.cs create mode 100644 WindowsPhone/PGMapLauncher/PGMapLauncher.js diff --git a/WindowsPhone/PGMapLauncher/PGMapLauncher.cs b/WindowsPhone/PGMapLauncher/PGMapLauncher.cs new file mode 100644 index 00000000..58837039 --- /dev/null +++ b/WindowsPhone/PGMapLauncher/PGMapLauncher.cs @@ -0,0 +1,124 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using Microsoft.Phone.Tasks; +using Microsoft.Phone.Controls; +using System.Device.Location; +using System.Runtime.Serialization; +using System.Diagnostics; + +namespace WP7GapClassLib.PhoneGap.Commands +{ + public class PGMapLauncher : PhoneGap.Commands.BaseCommand + { + + [DataContract] + public class SearchOptions + { + [DataMember(IsRequired = false, Name = "searchTerm")] + public string SearchTerm { get; set; } + + [DataMember(IsRequired = false, Name = "center")] + public Coordinates Center; + } + + [DataContract] + public class Coordinates + { + [DataMember(IsRequired = false, Name = "latitude")] + public double Latitude; + + [DataMember(IsRequired = false, Name = "longitude")] + public double Longitude; + } + + [DataContract] + public class LabeledCoordinates + { + [DataMember(IsRequired = false, Name = "coordinates")] + public Coordinates Coordinates; + + [DataMember(IsRequired = false, Name = "label")] + public string Label; + } + + [DataContract] + public class GetDirectionsOptions + { + [DataMember(IsRequired = false, Name = "startPosition")] + public LabeledCoordinates Start; + + [DataMember(IsRequired = true, Name = "endPosition")] + public LabeledCoordinates End; + } + + + public void searchNear(string options) + { + SearchOptions searchOptions = JSON.JsonHelper.Deserialize(options); + BingMapsTask bingMapsTask = new BingMapsTask(); + + //Omit the Center property to use the user's current location. + if (searchOptions.Center != null) + { + bingMapsTask.Center = new GeoCoordinate(searchOptions.Center.Latitude, searchOptions.Center.Longitude); + } + + if (searchOptions.SearchTerm != null) + { + + bingMapsTask.SearchTerm = searchOptions.SearchTerm; + bingMapsTask.Show(); + } + else + { + Debug.WriteLine("Error::searchTerm must be specified for map searching"); + } + + + } + + public void getDirections(string options) + { + GetDirectionsOptions directionOptions = JSON.JsonHelper.Deserialize(options); + + BingMapsDirectionsTask bingMapsDirectionsTask = new BingMapsDirectionsTask(); + + // You can specify a label and a geocoordinate for the end point. + if (directionOptions.Start != null) + { + LabeledMapLocation startLML = new LabeledMapLocation(); + startLML.Location = new GeoCoordinate(directionOptions.Start.Coordinates.Latitude, directionOptions.Start.Coordinates.Longitude); + if (directionOptions.Start.Label != null) + { + startLML.Label = directionOptions.Start.Label; + } + bingMapsDirectionsTask.Start = startLML; + } + // If you set the geocoordinate parameter to null, the label parameter is used as a search term. + if (directionOptions.End != null) + { + LabeledMapLocation endLML = new LabeledMapLocation(); + if (directionOptions.End.Coordinates != null) + { + endLML.Location = new GeoCoordinate(directionOptions.End.Coordinates.Latitude, directionOptions.End.Coordinates.Longitude); + } + if (directionOptions.End.Label != null) + { + endLML.Label = directionOptions.End.Label; + } + bingMapsDirectionsTask.End = endLML; + } + + // If bingMapsDirectionsTask.Start is not set, the user's current location is used as the start point. + bingMapsDirectionsTask.Show(); + } + } +} diff --git a/WindowsPhone/PGMapLauncher/PGMapLauncher.js b/WindowsPhone/PGMapLauncher/PGMapLauncher.js new file mode 100644 index 00000000..da946c23 --- /dev/null +++ b/WindowsPhone/PGMapLauncher/PGMapLauncher.js @@ -0,0 +1,31 @@ +PhoneGap.addConstructor(function() { + + var LabeledLocation = function(label,lat,lon) + { + this.label = label; + if(lat && lon) + { + this.coordinates = {"latitude":lat,"longitude":lon}; + } + }; + + navigator.plugins.pgMapLauncher = + { + // searchText is required. + // If nearToCoords is null, the map will search near to the current location + searchNear:function(searchTerm, nearToCoords ) + { + var options = {"searchTerm":searchTerm,"center":nearToCoords}; + PhoneGap.exec(null,null,"PGMapLauncher","searchNear",options); + }, + + // toLabeledLocation is required + // if toLabeledLocation. + // if fromLabeledLocation is null, the current location will be used + getDirections:function(toLabeledLocation,fromLabeledLocation) + { + PhoneGap.exec(null,null,"PGMapLauncher","getDirections", + {"startPosition":fromLabeledLocation,"endPosition":toLabeledLocation}); + } + } +}); \ No newline at end of file From 6e5111163102b8b51a6e629d65c1b4c978c7dbbf Mon Sep 17 00:00:00 2001 From: sgrebnov Date: Thu, 1 Dec 2011 17:18:10 +0400 Subject: [PATCH 23/33] updated childbrowser plugin --- WindowsPhone/ChildBrowser/ChildBrowser.js | 6 ++++++ WindowsPhone/ChildBrowser/ChildBrowserCommand.cs | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/WindowsPhone/ChildBrowser/ChildBrowser.js b/WindowsPhone/ChildBrowser/ChildBrowser.js index 8f45548a..2834cac8 100644 --- a/WindowsPhone/ChildBrowser/ChildBrowser.js +++ b/WindowsPhone/ChildBrowser/ChildBrowser.js @@ -46,6 +46,12 @@ ChildBrowser.prototype.showWebPage = function(loc,geolocationEnabled) var success = function(msg) { console.log("ChildBrowser.showWebPage success :: " + msg); + + var event = JSON.parse(msg); + + if (event.type == "locationChanged") { + ChildBrowser._onLocationChange(event.location); + } }; var error = function(e) diff --git a/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs b/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs index 935f7eb5..90103b0e 100644 --- a/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs +++ b/WindowsPhone/ChildBrowser/ChildBrowserCommand.cs @@ -172,7 +172,7 @@ public void close(string options="") void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) { - string message = "{type:\"locationChanged\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + string message = "{\"type\":\"locationChanged\", \"location\":\"" + e.Uri.AbsoluteUri + "\"}"; PluginResult result = new PluginResult(PluginResult.Status.OK, message); result.KeepCallback = true; this.DispatchCommandResult(result); @@ -180,7 +180,7 @@ void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventA void browser_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e) { - string message = "{type:\"navigationError\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + string message = "{\"type\":\"navigationError\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}"; PluginResult result = new PluginResult(PluginResult.Status.ERROR, message); result.KeepCallback = true; this.DispatchCommandResult(result); @@ -188,7 +188,7 @@ void browser_NavigationFailed(object sender, System.Windows.Navigation.Navigatio void browser_Navigating(object sender, NavigatingEventArgs e) { - string message = "{type:\"locationAboutToChange\",location:\"" + e.Uri.AbsoluteUri + "\"}"; + string message = "{\"type\":\"locationAboutToChange\",\"location\":\"" + e.Uri.AbsoluteUri + "\"}"; PluginResult result = new PluginResult(PluginResult.Status.OK, message); result.KeepCallback = true; this.DispatchCommandResult(result); From 1a28397d7cffaa8b728c53e6c9bdc0c9689eb560 Mon Sep 17 00:00:00 2001 From: sgrebnov Date: Thu, 1 Dec 2011 17:18:40 +0400 Subject: [PATCH 24/33] facebook plugin --- WindowsPhone/Facebook/FBConnect.js | 129 +++++++++++++++++++++ WindowsPhone/Facebook/facebook.html | 169 ++++++++++++++++++++++++++++ 2 files changed, 298 insertions(+) create mode 100644 WindowsPhone/Facebook/FBConnect.js create mode 100644 WindowsPhone/Facebook/facebook.html diff --git a/WindowsPhone/Facebook/FBConnect.js b/WindowsPhone/Facebook/FBConnect.js new file mode 100644 index 00000000..fb5386c0 --- /dev/null +++ b/WindowsPhone/Facebook/FBConnect.js @@ -0,0 +1,129 @@ +/* MIT licensed */ +// (c) 2010 Jesse MacFadyen, Nitobi +// (c) 2011 Sergey Grebnov +// Contributions, advice from : +// http://www.pushittolive.com/post/1239874936/facebook-login-on-iphone-phonegap + +/** +* FBConnect implements user authentication logic and session information store +*/ + +function FBConnect(client_id, redirect_uri, display) { + + this.client_id = client_id; + this.redirect_uri = redirect_uri; + this.display = display; + + this.resetSession(); + + if (window.plugins.childBrowser == null) { + ChildBrowser.install(); + } + +} + +/** +* User login +*/ +FBConnect.prototype.connect = function (scope) { + + var authorize_url = "https://graph.facebook.com/oauth/authorize?"; + authorize_url += "client_id=" + this.client_id; + authorize_url += "&redirect_uri=" + this.redirect_uri; + authorize_url += "&display=" + (this.display ? this.display : "touch"); + authorize_url += "&type=user_agent"; + + // extended permissions http://developers.facebook.com/docs/reference/api/permissions/ + if (scope) { + authorize_url += "&scope=" + scope; + } + + window.plugins.childBrowser.showWebPage(authorize_url); + var self = this; + window.plugins.childBrowser.onLocationChange = function (loc) { self.onLoginLocationChange(loc); }; +} + +FBConnect.prototype.onLoginLocationChange = function (newLoc) { + if (newLoc.indexOf(this.redirect_uri) == 0) { + var result = unescape(newLoc).split("#")[1]; + result = unescape(result); + + // TODO: Error Check + this.session.access_token = result.split("&")[0].split("=")[1]; + var expiresIn = parseInt(result.split("&")[1].split("=")[1]); + this.session.expires = new Date().valueOf() + expiresIn * 1000; + this.status = "connected"; + + window.plugins.childBrowser.close(); + this.onConnect(this); + + } +} + +/** +* User logout +*/ +FBConnect.prototype.logout = function () { + var authorize_url = "https://www.facebook.com/logout.php?"; + authorize_url += "&next=" + this.redirect_uri; + authorize_url += "&access_token=" + this.session.access_token; + console.log("logout url: " + authorize_url); + window.plugins.childBrowser.showWebPage(authorize_url); + var self = this; + window.plugins.childBrowser.onLocationChange = function (loc) { + console.log("onLogout"); + window.plugins.childBrowser.close(); + self.resetSession(); + self.status = "notConnected"; + self.onDisconnect(this); + }; +} + +/** +* Example method - returns your friends +*/ +FBConnect.prototype.getFriends = function () { + var url = "https://graph.facebook.com/me/friends?access_token=" + this.session.access_token; + var req = new XMLHttpRequest(); + + req.open("get", url, true); + req.send(null); + req.onerror = function () { alert("Error"); }; + return req; +} + +// Note: this plugin does NOT install itself, call this method some time after deviceready to install it +// it will be returned, and also available globally from window.plugins.fbConnect +FBConnect.install = function (client_id, redirect_uri, display) { + if (!window.plugins) { + window.plugins = {}; + } + window.plugins.fbConnect = new FBConnect(client_id, redirect_uri, display); + + return window.plugins.fbConnect; +} + +/** +* Session management functionality +*/ +FBConnect.prototype.resetSession = function () { + this.status = "unknown"; + this.session = {}; + this.session.access_token = null; + this.session.expires = 0; + this.session.secret = null; + this.session.session_key = null; + this.session.sig = null; + this.session.uid = null; +} + +FBConnect.prototype.restoreLastSession = function () { + var session = JSON.parse(localStorage.getItem('pg_fb_session')); + if (session) { + this.session = session; + } +} + +FBConnect.prototype.saveSession = function () { + localStorage.setItem('pg_fb_session', JSON.stringify(this.session)); +} diff --git a/WindowsPhone/Facebook/facebook.html b/WindowsPhone/Facebook/facebook.html new file mode 100644 index 00000000..fcd01920 --- /dev/null +++ b/WindowsPhone/Facebook/facebook.html @@ -0,0 +1,169 @@ + + + + + + + + + FBConnectBrowser + + + + + + + + + + + + + + + +

    Loading ...

    + +
      + +
    + + + + From e75e09848d7cf07d28d89bd5f323cb765d7e85df Mon Sep 17 00:00:00 2001 From: macdonst Date: Tue, 22 Nov 2011 03:40:24 +0800 Subject: [PATCH 25/33] Adding an onError method to the ChildBrowser --- .../plugins/childBrowser/ChildBrowser.java | 7 ++++++- Android/ChildBrowser/www/childbrowser.js | 17 +++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java index 4be68044..915b0bb9 100644 --- a/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java +++ b/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java @@ -67,6 +67,11 @@ public PluginResult execute(String action, JSONArray args, String callbackId) { if (action.equals("showWebPage")) { this.browserCallbackId = callbackId; + // If the ChildBrowser is already open then throw an error + if (dialog != null && dialog.isShowing()) { + return new PluginResult(PluginResult.Status.ERROR, "ChildBrowser is already open"); + } + result = this.showWebPage(args.getString(0), args.optJSONObject(1)); if (result.length() > 0) { @@ -132,7 +137,7 @@ public String openExternal(String url, boolean usePhoneGap) { this.ctx.startActivity(intent); return ""; } catch (android.content.ActivityNotFoundException e) { - System.out.println("ChildBrowser: Error loading url "+url+":"+ e.toString()); + Log.d(LOG_TAG, "ChildBrowser: Error loading url "+url+":"+ e.toString()); return e.toString(); } } diff --git a/Android/ChildBrowser/www/childbrowser.js b/Android/ChildBrowser/www/childbrowser.js index 63719294..d309f06a 100644 --- a/Android/ChildBrowser/www/childbrowser.js +++ b/Android/ChildBrowser/www/childbrowser.js @@ -27,7 +27,7 @@ ChildBrowser.prototype.showWebPage = function(url, options) { var options = new Object(); options.showLocationBar = true; } - PhoneGap.exec(this._onEvent, null, "ChildBrowser", "showWebPage", [url, options]); + PhoneGap.exec(this._onEvent, this._onError, "ChildBrowser", "showWebPage", [url, options]); }; /** @@ -54,21 +54,26 @@ ChildBrowser.prototype.openExternal = function(url, usePhoneGap) { }; /** - * Method called when the child browser is closed. + * Method called when the child browser has an event. */ ChildBrowser.prototype._onEvent = function(data) { - console.log("In _onEvent"); - console.log("data type = " + data.type); if (data.type == ChildBrowser.CLOSE_EVENT && typeof window.plugins.childBrowser.onClose === "function") { - console.log("Calling onClose"); window.plugins.childBrowser.onClose(); } if (data.type == ChildBrowser.LOCATION_CHANGED_EVENT && typeof window.plugins.childBrowser.onLocationChange === "function") { - console.log("Calling onLocChange"); window.plugins.childBrowser.onLocationChange(data.location); } }; +/** + * Method called when the child browser has an error. + */ +ChildBrowser.prototype._onError = function(data) { + if (typeof window.plugins.childBrowser.onError === "function") { + window.plugins.childBrowser.onError(data); + } +}; + /** * Maintain API consistency with iOS */ From 84758e8448674da32c9f0904de35955cd198c431 Mon Sep 17 00:00:00 2001 From: Max Ogden Date: Sat, 26 Nov 2011 08:33:14 +0800 Subject: [PATCH 26/33] make readme markdown for better readability on github.com --- iPhone/{README => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename iPhone/{README => README.md} (100%) diff --git a/iPhone/README b/iPhone/README.md similarity index 100% rename from iPhone/README rename to iPhone/README.md From 03be5dcf5edc5fbb1d0a386fd28b5267ce781dbd Mon Sep 17 00:00:00 2001 From: Max Ogden Date: Sat, 26 Nov 2011 08:49:01 +0800 Subject: [PATCH 27/33] update top level readme --- README => README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) rename README => README.md (75%) diff --git a/README b/README.md similarity index 75% rename from README rename to README.md index 7d54dca7..6cdfa3e8 100644 --- a/README +++ b/README.md @@ -1,10 +1,6 @@ -This code is completely dependent on the PhoneGap project, also hosted on -GitHub ( github.com/phonegap/phonegap ) - - - - +This code is completely dependent on the Apache Callback (formerly PhoneGap) project, hosted on GitHub ( github.com/callback ) +Plugins will (for the time being) reside in this repository as pulling them into the Callback project would require all plugin contributors to meet stricter code licensing requirements pursuant to Apache's guidelines. The MIT License From 229b25ed7812e8233f633772fba6c3dbb604b359 Mon Sep 17 00:00:00 2001 From: Ben Brown Date: Fri, 21 Oct 2011 01:20:05 +0800 Subject: [PATCH 28/33] The reference to GetFunctionName was causing this to fail for me. Is that function defined in some of your other code or something? --- iPhone/ClipboardPlugin/clipboardPlugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iPhone/ClipboardPlugin/clipboardPlugin.js b/iPhone/ClipboardPlugin/clipboardPlugin.js index 1efc3e31..64abb8be 100644 --- a/iPhone/ClipboardPlugin/clipboardPlugin.js +++ b/iPhone/ClipboardPlugin/clipboardPlugin.js @@ -24,7 +24,7 @@ ClipboardPlugin.prototype.setText = function(text) */ ClipboardPlugin.prototype.getText = function(callback) { - PhoneGap.exec("ClipboardPlugin.getText", GetFunctionName(callback)); + PhoneGap.exec("ClipboardPlugin.getText", callback); } /** From b0ba34227096f1c5fe3bf20e4c7178d480a7ee13 Mon Sep 17 00:00:00 2001 From: Tim Robertson Date: Tue, 29 Nov 2011 02:14:16 +0800 Subject: [PATCH 29/33] Since GetFunctionName was removed in https://github.com/shazron/phonegap-iphone/commit/5544b2a0664ae2714ec1df2b6e16aa97d3cfa9bc --- iPhone/PrintPlugin/PrintPlugin.js | 48 ++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/iPhone/PrintPlugin/PrintPlugin.js b/iPhone/PrintPlugin/PrintPlugin.js index 7788988d..8d3ebc1f 100644 --- a/iPhone/PrintPlugin/PrintPlugin.js +++ b/iPhone/PrintPlugin/PrintPlugin.js @@ -4,29 +4,32 @@ * MIT licensed */ -var PrintPlugin = function() { - +var PrintPlugin = function() { + } +PrintPlugin.prototype.callbackMap = {}; +PrintPlugin.prototype.callbackIdx = 0; + /* print - html string or DOM node (if latter, innerHTML is used to get the contents). REQUIRED. success - callback function called if print successful. {success: true} fail - callback function called if print unsuccessful. If print fails, {error: reason}. If printing not available: {available: false} - options - {dialogOffset:{left: 0, right: 0}}. Position of popup dialog (iPad only). + options - {dialogOffset:{left: 0, right: 0}}. Position of popup dialog (iPad only). */ PrintPlugin.prototype.print = function(printHTML, success, fail, options) { if (typeof printHTML != 'string'){ console.log("Print function requires an HTML string. Not an object"); return; } - - + + //var printHTML = ""; - + var dialogLeftPos = 0; var dialogTopPos = 0; - - + + if (options){ if (options.dialogOffset){ if (options.dialogOffset.left){ @@ -43,16 +46,35 @@ PrintPlugin.prototype.print = function(printHTML, success, fail, options) { } } } - - - return PhoneGap.exec("PrintPlugin.print", printHTML, GetFunctionName(success), GetFunctionName(fail), dialogLeftPos, dialogTopPos); + + var key = 'print' + this.callbackIdx++; + window.plugins.printPlugin.callbackMap[key] = { + success: function(result) { + delete window.plugins.printPlugin.callbackMap[key]; + success(result); + }, + fail: function(result) { + delete window.plugins.printPlugin.callbackMap[key]; + fail(result); + }, + }; + + var callbackPrefix = 'window.plugins.printPlugin.callbackMap.' + key; + return PhoneGap.exec("PrintPlugin.print", printHTML, callbackPrefix + '.success', callbackPrefix + '.fail', dialogLeftPos, dialogTopPos); }; /* * Callback function returns {available: true/false} */ -PrintPlugin.prototype.isPrintingAvailable = function(result) { - return PhoneGap.exec("PrintPlugin.isPrintingAvailable", GetFunctionName(result)); +PrintPlugin.prototype.isPrintingAvailable = function(callback) { + var key = 'isPrintingAvailable' + this.callbackIdx++; + window.plugins.printPlugin.callbackMap[key] = function(result) { + delete window.plugins.printPlugin.callbackMap[key]; + callback(result); + }; + + var callbackName = 'window.plugins.printPlugin.callbackMap.' + key; + PhoneGap.exec("PrintPlugin.isPrintingAvailable", callbackName); }; PhoneGap.addConstructor(function() { From a2a67c9936a80824ab83a1c0108b1835776cb05a Mon Sep 17 00:00:00 2001 From: tommy-carlos williams Date: Mon, 28 Nov 2011 11:55:26 +0800 Subject: [PATCH 30/33] Clean up logic errors causing issue #183 and others The Xcode analyser was complaining about some logic issues and uninitialised values. Turned out to be pretty simple to clean up. --- iPhone/NativeControls/NativeControls.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iPhone/NativeControls/NativeControls.m b/iPhone/NativeControls/NativeControls.m index 8f89c6d3..2257ba76 100644 --- a/iPhone/NativeControls/NativeControls.m +++ b/iPhone/NativeControls/NativeControls.m @@ -206,7 +206,7 @@ - (void)createTabBarItem:(NSArray*)arguments withDict:(NSDictionary*)options UITabBarItem *item = nil; if ([imageName length] > 0) { - UIBarButtonSystemItem systemItem = -1; + UITabBarSystemItem systemItem = -1; if ([imageName isEqualToString:@"tabButton:More"]) systemItem = UITabBarSystemItemMore; if ([imageName isEqualToString:@"tabButton:Favorites"]) systemItem = UITabBarSystemItemFavorites; if ([imageName isEqualToString:@"tabButton:Featured"]) systemItem = UITabBarSystemItemFeatured; @@ -471,7 +471,7 @@ - (void)createToolBarItem:(NSArray*)arguments withDict:(NSDictionary*)options NSString *tagId = [arguments objectAtIndex:0]; NSString *title = [arguments objectAtIndex:1]; - NSString *imageName; + NSString *imageName = nil; if (arguments.count >= 2) { imageName = [arguments objectAtIndex:2]; @@ -507,7 +507,7 @@ - (void)createToolBarItem:(NSArray*)arguments withDict:(NSDictionary*)options UIBarButtonItem *item = nil; if ([imageName length] > 0) { - UIBarButtonSystemItem systemItem; + UIBarButtonSystemItem systemItem = -1; if ([imageName isEqualToString:@"UIBarButtonSystemItemDone"]) { systemItem = UIBarButtonSystemItemDone; From 5c68989d513fe435204c6c9b50eeaa9e585ba9b9 Mon Sep 17 00:00:00 2001 From: Jesse MacFadyen Date: Mon, 12 Dec 2011 13:59:40 -0800 Subject: [PATCH 31/33] Added Sergey's LiveTile plugin for updating the Metro homescreen tile --- WindowsPhone/LiveTiles/LiveTiles.cs | 285 +++++++++++++++++++ WindowsPhone/LiveTiles/README.md | 25 ++ WindowsPhone/LiveTiles/liveTiles.js | 55 ++++ WindowsPhone/LiveTiles/liveTilesExample.html | 131 +++++++++ 4 files changed, 496 insertions(+) create mode 100644 WindowsPhone/LiveTiles/LiveTiles.cs create mode 100644 WindowsPhone/LiveTiles/README.md create mode 100644 WindowsPhone/LiveTiles/liveTiles.js create mode 100644 WindowsPhone/LiveTiles/liveTilesExample.html diff --git a/WindowsPhone/LiveTiles/LiveTiles.cs b/WindowsPhone/LiveTiles/LiveTiles.cs new file mode 100644 index 00000000..e99ea82a --- /dev/null +++ b/WindowsPhone/LiveTiles/LiveTiles.cs @@ -0,0 +1,285 @@ +/* + * PhoneGap is available under *either* the terms of the modified BSD license *or* the + * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. + * + * Copyright (c) 2005-2011, Nitobi Software Inc. + * Copyright (c) 2011, Microsoft Corporation + */ + +using System.Runtime.Serialization; +using WP7GapClassLib.PhoneGap; +using WP7GapClassLib.PhoneGap.Commands; +using WP7GapClassLib.PhoneGap.JSON; +using Microsoft.Phone.Shell; +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Phone.Controls; +using System.Windows; + +namespace PhoneGap.Extension.Commands +{ + /// + /// Implementes access to application live tiles + /// http://msdn.microsoft.com/en-us/library/hh202948(v=VS.92).aspx + /// + public class LiveTiles : BaseCommand + { + + #region Live tiles options + + /// + /// Represents LiveTile options + /// + [DataContract] + public class LiveTilesOptions + { + /// + /// Tile title + /// + [DataMember(IsRequired=false, Name="title")] + public string Title { get; set; } + + /// + /// Tile count + /// + [DataMember(IsRequired = false, Name = "count")] + public int Count { get; set; } + + /// + /// Tile image + /// + [DataMember(IsRequired = false, Name = "image")] + public string Image { get; set; } + + /// + /// Back tile title + /// + [DataMember(IsRequired = false, Name = "backTitle")] + public string BackTitle { get; set; } + + /// + /// Back tile content + /// + [DataMember(IsRequired = false, Name = "backContent")] + public string BackContent { get; set; } + + /// + /// Back tile image + /// + [DataMember(IsRequired = false, Name = "backImage")] + public string BackImage { get; set; } + + /// + /// Identifier for second tile + /// + [DataMember(IsRequired = false, Name = "secondaryTileUri")] + public string SecondaryTileUri { get; set; } + + } + #endregion + + /// + /// Updates application live tile + /// + public void updateAppTile(string options) + { + LiveTilesOptions liveTileOptions; + try + { + liveTileOptions = WP7GapClassLib.PhoneGap.JSON.JsonHelper.Deserialize(options); + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + + try + { + ShellTile appTile = ShellTile.ActiveTiles.First(); + + if (appTile != null) + { + StandardTileData standardTile = CreateTileData(liveTileOptions); + appTile.Update(standardTile); + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Can't get application tile")); + } + } + catch(Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error updating application tile")); + } + } + + /// + /// Creates secondary tile + /// + public void createSecondaryTile(string options) + { + LiveTilesOptions liveTileOptions; + try + { + liveTileOptions = WP7GapClassLib.PhoneGap.JSON.JsonHelper.Deserialize(options); + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + + if (string.IsNullOrEmpty(liveTileOptions.Title) || string.IsNullOrEmpty(liveTileOptions.Image) || string.IsNullOrEmpty(liveTileOptions.SecondaryTileUri)) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + try + { + ShellTile foundTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains(liveTileOptions.SecondaryTileUri)); + if (foundTile == null) + { + StandardTileData secondaryTile = CreateTileData(liveTileOptions); + PhoneApplicationPage currentPage; + Deployment.Current.Dispatcher.BeginInvoke(() => + { + currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content as PhoneApplicationPage; + string currentUri = currentPage.NavigationService.Source.ToString().Split('?')[0]; + ShellTile.Create(new Uri(currentUri + "?Uri=" + liveTileOptions.SecondaryTileUri, UriKind.Relative), secondaryTile); + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + }); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,"Tile already exist")); + } + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,"Error creating secondary live tile")); + } + } + + /// + /// Updates secondary tile + /// + public void updateSecondaryTile(string options) + { + LiveTilesOptions liveTileOptions; + try + { + liveTileOptions = WP7GapClassLib.PhoneGap.JSON.JsonHelper.Deserialize(options); + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + + if (string.IsNullOrEmpty(liveTileOptions.SecondaryTileUri)) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + + try + { + ShellTile foundTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains(liveTileOptions.SecondaryTileUri)); + + if (foundTile != null) + { + StandardTileData liveTile = this.CreateTileData(liveTileOptions); + foundTile.Update(liveTile); + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Can't get secondary live tile")); + } + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,"Error updating secondary live tile")); + } + } + + /// + /// Deletes secondary tile + /// + public void deleteSecondaryTile(string options) + { + LiveTilesOptions liveTileOptions; + try + { + liveTileOptions = WP7GapClassLib.PhoneGap.JSON.JsonHelper.Deserialize(options); + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + + if (string.IsNullOrEmpty(liveTileOptions.SecondaryTileUri)) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return; + } + try + { + ShellTile foundTile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains(liveTileOptions.SecondaryTileUri)); + if (foundTile != null) + { + foundTile.Delete(); + DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); + } + else + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Can't get secondary live tile")); + } + + } + catch (Exception e) + { + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error deleting secondary live tile")); + } + } + + + /// + /// Cerates tile data + /// + private StandardTileData CreateTileData(LiveTilesOptions liveTileOptions) + { + StandardTileData standardTile = new StandardTileData(); + if (!string.IsNullOrEmpty(liveTileOptions.Title)) + { + standardTile.Title = liveTileOptions.Title; + } + if (!string.IsNullOrEmpty(liveTileOptions.Image)) + { + standardTile.BackgroundImage = new Uri(liveTileOptions.Image, UriKind.RelativeOrAbsolute); + } + if (liveTileOptions.Count > 0) + { + standardTile.Count = liveTileOptions.Count; + } + if (!string.IsNullOrEmpty(liveTileOptions.BackTitle)) + { + standardTile.BackTitle = liveTileOptions.BackTitle; + } + if (!string.IsNullOrEmpty(liveTileOptions.BackContent)) + { + standardTile.BackContent = liveTileOptions.BackContent; + } + if (!string.IsNullOrEmpty(liveTileOptions.BackImage)) + { + standardTile.BackBackgroundImage = new Uri(liveTileOptions.BackImage, UriKind.RelativeOrAbsolute); + } + return standardTile; + } + + } +} \ No newline at end of file diff --git a/WindowsPhone/LiveTiles/README.md b/WindowsPhone/LiveTiles/README.md new file mode 100644 index 00000000..b6fe557c --- /dev/null +++ b/WindowsPhone/LiveTiles/README.md @@ -0,0 +1,25 @@ +Live Tiles plugin usage: +=============== +Source files +--- +liveTiles.js - plugin definition and js implementation +LiveTiles.cs - native side implementation +liveTilesExample.html- usage example + +In your head +--- + +[script type="text/javascript" charset="utf-8" src="liveTiles.js"][/script] + + +Somewhere in your code +--- + + + navigator.plugins.liveTiles.updateAppTile(success, fail,{title: 'title', image:'Images/appbar.next.rest.png', count: 5, backTitle: 'Back title', backContent:'Back side', backImage : 'Images/appbar.close.rest.png'}); + + navigator.plugins.liveTiles.createSecondaryTile(success, fail, { title: 'title', image: 'Images/appbar.save.rest.png', count: 5, secondaryTileUri: 'www/myPage.html',backTitle:'back'}); + + navigator.plugins.liveTiles.updateSecondaryTile(success, fail, { title: 'title', count: 5, secondaryTileUri: 'www/myPage.html' }); + + navigator.plugins.liveTiles.deleteSecondaryTile(success, fail, { secondaryTileUri: 'www/myPage.html' }); \ No newline at end of file diff --git a/WindowsPhone/LiveTiles/liveTiles.js b/WindowsPhone/LiveTiles/liveTiles.js new file mode 100644 index 00000000..8d4895e4 --- /dev/null +++ b/WindowsPhone/LiveTiles/liveTiles.js @@ -0,0 +1,55 @@ +PhoneGap.addConstructor(function () { + + navigator.plugins.liveTiles = + { + updateAppTile: function (successCallback, errorCallback, options) { + if (successCallback && (typeof successCallback !== "function")) { + console.log("LiveTiles Error: successCallback is not a function"); + return; + } + + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("LiveTiles Error: errorCallback is not a function"); + return; + } + PhoneGap.exec(successCallback, errorCallback, "LiveTiles", "updateAppTile", options); + }, + + createSecondaryTile: function (successCallback, errorCallback, options) { + if (successCallback && (typeof successCallback !== "function")) { + console.log("LiveTiles Error: successCallback is not a function"); + return; + } + + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("LiveTiles Error: errorCallback is not a function"); + return; + } + PhoneGap.exec(successCallback, errorCallback, "LiveTiles", "createSecondaryTile", options); + }, + updateSecondaryTile: function (successCallback, errorCallback, options) { + if (successCallback && (typeof successCallback !== "function")) { + console.log("LiveTiles Error: successCallback is not a function"); + return; + } + + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("LiveTiles Error: errorCallback is not a function"); + return; + } + PhoneGap.exec(successCallback, errorCallback, "LiveTiles", "updateSecondaryTile", options); + }, + deleteSecondaryTile: function (successCallback, errorCallback, options) { + if (successCallback && (typeof successCallback !== "function")) { + console.log("LiveTile Error: successCallback is not a function"); + return; + } + + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("LiveTiles Error: errorCallback is not a function"); + return; + } + PhoneGap.exec(successCallback, errorCallback, "LiveTiles", "deleteSecondaryTile", options); + } + } +}); \ No newline at end of file diff --git a/WindowsPhone/LiveTiles/liveTilesExample.html b/WindowsPhone/LiveTiles/liveTilesExample.html new file mode 100644 index 00000000..bd2572d2 --- /dev/null +++ b/WindowsPhone/LiveTiles/liveTilesExample.html @@ -0,0 +1,131 @@ + + + + + + + PhoneGap + + + + + + + + + + + + +

    Live tile

    +
    + New title:
    + +
    + New count:
    + +
    + Result: +
    +

    Action

    +
    Update application tile + Create secondary tile
    (will open this page)
    + Update secondary tile + Delete secondary tile +

     

    Back + + \ No newline at end of file From 654d719c51c4567ccad32e31e1bb944b6226758a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pfu=CC=88tze?= Date: Wed, 11 Jan 2012 15:13:14 +0100 Subject: [PATCH 32/33] check for light on devices with no flashsupport --- iPhone/Torch/Torch.h | 2 +- iPhone/Torch/Torch.js | 23 +++++++++++++++++------ iPhone/Torch/Torch.m | 27 +++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/iPhone/Torch/Torch.h b/iPhone/Torch/Torch.h index f086a53e..a1f5b7b3 100644 --- a/iPhone/Torch/Torch.h +++ b/iPhone/Torch/Torch.h @@ -22,5 +22,5 @@ - (void) turnOn:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - (void) turnOff:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - +- (void) checkLight:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; @end diff --git a/iPhone/Torch/Torch.js b/iPhone/Torch/Torch.js index 7a8dae21..08486fda 100644 --- a/iPhone/Torch/Torch.js +++ b/iPhone/Torch/Torch.js @@ -7,12 +7,19 @@ // Created by Shazron Abdullah May 26th 2011 // -function Torch() -{ - this._isOn = false; - var self = this; - - this.__defineGetter__("isOn", function() { return self._isOn; }); +function Torch() { + this._isOn = false; + this._checkForLight = false; + var self = this; + + this.__defineGetter__("isOn", function () { + return self._isOn; + }); + + this.__defineGetter__("checkForLight", function () { + return self._checkForLight; + }); + } Torch.prototype.turnOn = function() @@ -25,6 +32,10 @@ Torch.prototype.turnOff = function() PhoneGap.exec("Torch.turnOff"); }; +Torch.prototype.checkLight = function () { + PhoneGap.exec("Torch.checkLight"); +}; + Torch.install = function() { if(!window.plugins) { diff --git a/iPhone/Torch/Torch.m b/iPhone/Torch/Torch.m index 5df3e443..2655b475 100644 --- a/iPhone/Torch/Torch.m +++ b/iPhone/Torch/Torch.m @@ -3,6 +3,7 @@ // PhoneGap Plugin // // Created by Shazron Abdullah May 26th 2011 +// Forked by Michael Pfütze, Jan 11th 2012 // #import "Torch.h" @@ -58,16 +59,19 @@ - (void) setup [captureSession release]; } else { - NSLog(@"Torch not available, hasFlash: %d hasTorch: %d torchMode: %d", + + NSLog(@"Torchblaa not available, hasFlash: %d hasTorch: %d torchMode: %d", captureDevice.hasFlash, captureDevice.hasTorch, captureDevice.torchMode ); + } - + } else { - NSLog(@"Torch not available, AVCaptureDevice class not found."); + NSLog(@"Torchblablabla not available, AVCaptureDevice class not found."); + } } @@ -103,7 +107,7 @@ - (void) turnOff:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)optio [captureDevice setFlashMode:AVCaptureFlashModeOff]; [captureDevice unlockForConfiguration]; - + [super writeJavascript:@"window.plugins.torch._isOn = false;"]; } } @@ -116,4 +120,19 @@ - (void) dealloc [super dealloc]; } +- (void) checkLight:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + AVCaptureDevice* captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + if ([captureDevice hasTorch] && [captureDevice hasFlash] ) { + + [super writeJavascript:@"window.plugins.torch._checkForLight = true;"]; + } + else{ + [super writeJavascript:@"window.plugins.torch._checkForLight = false;"]; + } +} + + + + @end From 7b6e8c46d9e797062e1a28df570e693bd6e32824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pfu=CC=88tze?= Date: Wed, 11 Jan 2012 15:57:30 +0100 Subject: [PATCH 33/33] import PhoneGap/Plugin.h fixed in SoundPlug.h in PhoneGap 1.2 the import path has changed.... --- iPhone/SoundPlug/SoundPlug.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iPhone/SoundPlug/SoundPlug.h b/iPhone/SoundPlug/SoundPlug.h index 539555a2..b4cd2372 100644 --- a/iPhone/SoundPlug/SoundPlug.h +++ b/iPhone/SoundPlug/SoundPlug.h @@ -1,5 +1,9 @@ #import +#ifdef PHONEGAP_FRAMEWORK +#import +#else #import "PGPlugin.h" +#endif @interface SoundPlug : PGPlugin { }