Compare commits

...

1139 Commits

Author SHA1 Message Date
macdonst
d7b79f5042 Upping version to 1.8.0rc1 2012-05-24 21:39:45 -04:00
macdonst
95fa0f4461 CB-808: CameraLauncher leaks bitmaps in Android 2012-05-24 14:49:23 -04:00
macdonst
2d77bcf1a4 Merge branch 'CB-792' of https://github.com/don/incubator-cordova-android 2012-05-23 20:39:47 -04:00
macdonst
fae0c3dcfd Fix problem in Android template example getPicture 2012-05-22 14:48:02 -04:00
Fil Maj
6b24f2d547 Small spacing fixes 2012-05-18 15:23:57 -07:00
Fil Maj
2d5dcf24da [CB-463] updated js and rewrote accel plugin again to support the start/stop approach. optimized. single callback used for message passing 2012-05-18 15:22:56 -07:00
Fil Maj
15ddef26f4 removed a trailing log 2012-05-18 15:22:56 -07:00
Fil Maj
531efe1e30 [CB-463] added accuracy checking to native accel implementation, this way getCurrentAcceleration returns fairly accurate results 2012-05-18 15:22:56 -07:00
Fil Maj
df89d33fab removed a trailing log 2012-05-18 15:20:54 -07:00
Fil Maj
cb98bbce1f [CB-463] added accuracy checking to native accel implementation, this way getCurrentAcceleration returns fairly accurate results 2012-05-18 15:20:54 -07:00
Fil Maj
24adc6d00c [CB-463] added the JS updates for accel refactor 2012-05-18 15:20:54 -07:00
Fil Maj
71e47aa772 [CB-463] rewrite of accel plugin 2012-05-18 15:20:54 -07:00
Don Coleman
5dacb8d2d5 [CB-792] Add HTTP status code to FileTransferError 2012-05-17 14:51:41 -04:00
Fil Maj
0850229c9f [CB-804] ADded proper cordova icon sizes for the create script 2012-05-17 11:14:23 -07:00
filmaj
1f45503e2f [CB-659] create script for android on windows now works fully. also pulls down commons-codec jar appropriately 2012-05-17 10:59:38 -07:00
filmaj
7eb3e5d139 [CB-659] create script should work on android 2012-05-16 19:38:11 -07:00
Joe Bowser
fc50a0d954 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-05-11 16:08:06 -07:00
Joe Bowser
c6349668dd Tweaked create so it fetches the commons-codec using curl 2012-05-11 16:07:43 -07:00
macdonst
eb66eb02cb Switch to using stripFileProtocol in FileUtils.notifyDelete 2012-05-11 16:43:00 -04:00
Fil Maj
6a628f7f2d [CB-683] updating JS for fix for 683 2012-05-10 16:43:08 -07:00
Fil Maj
08a32272d3 [CB-683] Pause and resume events should route through fireDocumentEvent so we get the event object passed into the handler 2012-05-10 16:40:41 -07:00
Joe Bowser
b2f49b15ba Don't commit Eclipse preferences 2012-05-10 12:25:47 -07:00
Michael Brooks
2625a57fdd Fix README.md formatting to install commons-codec-1.6.jar 2012-05-09 15:32:53 -07:00
macdonst
c2631ee0f7 Properly querying the Andoid content DB when deleteing an image file 2012-05-08 15:23:00 -04:00
Fil Maj
bafa438ce3 updating JS to latest for geolocation updates 2012-05-07 16:22:01 -07:00
Fil Maj
18cc90b3d8 adding uppercase java file! 2012-05-07 16:09:20 -07:00
Fil Maj
0fd1e3c57b axing lowercase java file 2012-05-07 16:09:20 -07:00
Fil Maj
1ee484f70d Fixes for new geo stuff 2012-05-07 16:09:20 -07:00
Fil Maj
724ea49f0b restructured geolocation plugin 2012-05-07 16:09:20 -07:00
Fil Maj
6fc2a3b84e adding node_modules to gitignore 2012-05-07 16:09:14 -07:00
Fil Maj
b84d64912b comeat me lawyers 2012-05-07 16:08:28 -07:00
Joe Bowser
21f6d9c527 Modifying generated classpath 2012-05-07 15:52:49 -07:00
Joe Bowser
8e0c3c1fa1 Updating README telling people to copy commons-codec 2012-05-07 15:52:34 -07:00
Joe Bowser
9e10160366 Removing the commons-codec 2012-05-07 15:48:59 -07:00
Joe Bowser
d38dd4c131 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-05-07 15:25:23 -07:00
Joe Bowser
84aaf02b0f Removing Default Android Graphics and replacing them with our own 2012-05-07 15:24:57 -07:00
Joe Bowser
269b90ad6f updating the test plugins 2012-05-07 14:49:21 -07:00
Joe Bowser
c11c4bea94 Adding header to test cordova.xml 2012-05-07 14:46:34 -07:00
Joe Bowser
7de660808c Accidentally committed a vim swp file 2012-05-07 14:36:13 -07:00
Joe Bowser
1fcaf2435f Adding more Apache licence headers 2012-05-07 14:27:33 -07:00
Fil Maj
87fbb5c92f documented running npm install 2012-05-07 12:31:24 -07:00
Fil Maj
3636a18bba added package.json for npm install goodness 2012-05-07 12:29:44 -07:00
Fil Maj
ea8d6b17ec dont check in node_modules peepz! 2012-05-07 12:29:08 -07:00
Joe Bowser
a087116915 Working towards Apache compliance 2012-05-07 10:56:37 -07:00
Joe Bowser
216f6a9b32 Adding more Apache Headers. Not sure if this should have headers or not 2012-05-04 16:47:37 -07:00
Joe Bowser
e32503fad7 Forgot to add lifecycle/index2.html's header 2012-05-04 16:40:38 -07:00
Joe Bowser
c33f768570 Adding Apache Header to Test Directory 2012-05-04 15:22:15 -07:00
Joe Bowser
20c7b512f3 We should not be having a compiled version of cordova.jar in the test directory 2012-05-04 13:55:43 -07:00
Joe Bowser
e2d91c2556 Updating the JS and re-tagging 1.7.0 2012-05-01 14:25:42 -07:00
Joe Bowser
634a9c0f4c Updating the version to 1.7.0 2012-04-30 13:42:38 -07:00
macdonst
c846111099 Adding SplashScreen plugin to plugins.xml 2012-04-25 13:17:48 -04:00
macdonst
960e0f3412 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-04-25 11:53:39 -04:00
Joe Bowser
39f261c6e2 Incrementing project to 1.7.0rc1 2012-04-25 11:49:55 -04:00
macdonst
d7c8bc799d Refactor Android SplashScreen 2012-04-24 15:14:37 -04:00
Joe Bowser
f4da7e164d Incrementing project to 1.7.0rc1 2012-04-23 11:37:33 -07:00
macdonst
05192a91da Removing un-needed logs 2012-04-19 21:03:55 -04:00
Fil Maj
3835144b93 [CB-473] run ant clean before ant debug install 2012-04-19 17:25:19 -07:00
Joe Bowser
bdf452b02a Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-04-19 16:48:32 -07:00
Joe Bowser
bcc2957f20 Fix for CB-549 2012-04-19 16:45:15 -07:00
Fil Maj
81059b398f Proper fix for CB-164. Online/offline events now propagated to webview properly 2012-04-19 16:35:55 -07:00
Fil Maj
31d5a94ea9 [CB-164] Changed network plugin to sync from async and removed setKeepCallback(true) on plugin result in there. Fixes location.reload() not firing deviceready due to network plugin being unresponsive 2012-04-19 12:33:45 -07:00
Joe Bowser
1e5457a47d Reverting the back button change that I made, for some reason certain methods aren't inherited when you extend DroidGap 2012-04-19 12:22:33 -07:00
macdonst
7b75e2f1b0 CB-539: FileTransfer.download fails when target starts with 'file://' 2012-04-18 13:56:29 -04:00
Joe Bowser
180696baec Fixed back button behaviour. WIN 2012-04-17 17:50:07 -07:00
Joe Bowser
76820ebaff CB-480 work, back button and history issues are preventing this from being tested properly 2012-04-17 17:13:33 -07:00
Joe Bowser
c341cf0d47 Adding fix for CB-482 2012-04-17 12:20:23 -07:00
macdonst
f2c38ea0a7 Automatically update index.html in templates directory on version change 2012-04-13 16:36:46 -04:00
Joe Bowser
0772a315c4 CB-489 - Adding .js to the example, thought it was removed for a reason 2012-04-13 13:08:13 -07:00
macdonst
08d7a9c87a Remove duplicate files from repository
We should only have these files in one place in the repo. Changes have been made to the scripts to pick up the xml files from their proper location.
2012-04-13 15:35:49 -04:00
Joe Bowser
eb48055acd Getting setup to tag 1.6.1 2012-04-12 16:37:27 -07:00
Joe Bowser
e4a52de0a5 Copying new XML into the templates for 1.6.1. Turns out tags are broken 2012-04-12 14:33:29 -07:00
macdonst
ac06892dec CB-472: FileWriter.seek(0) does not actually seek to the beginning of the file 2012-04-11 10:44:09 -04:00
Joe Bowser
5e1997c8d8 Updating with tagged JS 2012-04-10 13:26:35 -07:00
Bryce Curtis
36e6b572b7 Update to version 1.6.0. 2012-04-10 09:01:37 -05:00
Joe Bowser
3bda8afdc1 Updating the sample index.html 2012-04-09 17:11:51 -07:00
Joe Bowser
cdf148bb58 Starting Release Process 2012-04-09 17:11:13 -07:00
Joe Bowser
b532cf8545 Fixing the template, since this doesn't have to be unit tested. :) 2012-04-09 13:43:36 -07:00
macdonst
ecebcbabf8 CB-446: Enhance setting data source for local files in AudioPlayer 2012-04-09 10:13:43 -04:00
macdonst
aa00e07b3c Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-04-05 19:52:36 -04:00
macdonst
cb473dfed4 CB-453: FileWriter.append - Chinese characters are not appended to the file correctly 2012-04-05 19:51:45 -04:00
Bryce Curtis
8b05ce41dd Update project template cordova.js reference and title. 2012-04-05 15:39:33 -05:00
macdonst
5d43835db8 CB-446: Enhance setting data source for local files in AudioPlayer 2012-04-05 13:43:00 -04:00
macdonst
838286df96 Return MediaError object and not error code from native side of Media API 2012-04-05 13:31:09 -04:00
macdonst
04aa6d3c38 CB-438: File metadata.modificationTime returns an invalid date 2012-04-04 13:03:39 -04:00
macdonst
e213772f98 Updating cordova.android.js for CB-421 and CB-426 2012-04-03 13:09:31 -04:00
macdonst
0577b4bf5d CB-426: camera.getPicture ignores mediaType in 1.5 2012-04-03 13:02:25 -04:00
Bryce Curtis
a37d0699db [CB-423] Problem displaying patch-9 splash screen. 2012-04-02 11:34:57 -05:00
macdonst
5fa77e97bd CB-163: contactFindOptions.filter does not work as expected on Android 2012-03-30 16:28:04 -04:00
macdonst
8d479c8269 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-03-30 15:31:54 -04:00
macdonst
700ae50e9b CB-321: Media API: 'mediaSuccess' callback param to new Media() is called soon after new obj created 2012-03-30 15:29:26 -04:00
Bryce Curtis
900be3afe0 Tests to verify Android native features. 2012-03-30 11:37:29 -05:00
macdonst
d2b329636f Fixing license header in com.phonegap.api.PluginManager 2012-03-29 15:08:44 -04:00
Fil Maj
993fb296d6 updating network status plugin label and updating cordova-js to latest 2012-03-28 13:47:45 -07:00
macdonst
dfc86b1af1 Fix for CB-389: resolveLocalFileSystemURI does not work on a resized image captured from Camera.getPicture() 2012-03-26 21:35:34 -04:00
macdonst
1e2c38598f CB-383: Fixes issue with misspelled destinationType for Camera.getPicture() 2012-03-24 14:09:57 -04:00
Joe Bowser
9d0e8fa436 Tagged 1.6rc1 2012-03-23 14:30:18 -07:00
Bryce Curtis
9d26598334 [CB-367] Back button event should fire on key up not key down
Also changed menu key and search key to be consistent.
2012-03-23 15:17:09 -05:00
Joe Bowser
a688319ea7 First stab at CB-21, I really need more info before I can close this 2012-03-20 15:22:00 -07:00
Joe Bowser
bbf10e3baa Fixing a bug with File Upload on Android where Chunked mode isn't used by default 2012-03-20 11:25:17 -07:00
Bryce Curtis
7e70d76232 [CB-352] Support initializing DroidGap with existing WebView, WebViewClient and webViewChrome.
[CB-353] Create PluginEntry object to use by PluginManager.
2012-03-19 16:20:57 -05:00
Joe Bowser
04b3e4d847 Fixing CB-343: We need to respect the whitelist 2012-03-16 10:55:06 -07:00
Joe Bowser
dc93556ef0 Checking for the callback server before we call sendJavascript for the Kindle Fire, CB-247 2012-03-15 14:29:25 -07:00
Fil Maj
692a59a692 spacing fixes, null check in getPhoneType in contacts, returning error integers instead of objects in contacts 2012-03-15 12:27:37 -07:00
Joe Bowser
df691518e3 Added temporary Cordova splash for now 2012-03-15 10:54:43 -07:00
Joe Bowser
8f2cdcc049 Changing to the modern icon 2012-03-15 10:48:00 -07:00
Joe Bowser
d27064794c Tweaked File Transfer to fix CB-74 2012-03-13 11:46:25 -07:00
Joe Bowser
8a7af93765 Fixing CB-210 with patch and adding fix for CB-210 2012-03-12 13:30:16 -07:00
Fil Maj
f3c96ce1a0 removed old javascript files and removed unused target + commented out lines in build.xml 2012-03-09 12:36:08 -08:00
Fil Maj
715c0a5bea updates to JS: removing require+define from global scope, tweaking geolocation code, online/offline events fire on document now 2012-03-09 12:32:22 -08:00
Fil Maj
4b05ead3ac cordova.require("cordova") is pretty funny. wish i didnt write it 2012-03-09 11:27:56 -08:00
Fil Maj
b4292868eb switched from "require" syntax to "cordova.require" 2012-03-08 17:58:45 -08:00
Joe Bowser
c5025ee2bb We show the default 404 on non-resolved domains 2012-03-06 14:09:11 -08:00
macdonst
8923e52a5e Adding support for legacy plugins 2012-03-05 15:11:24 -05:00
macdonst
aa4f2cc4d9 Tagging 1.5.0 2012-03-01 21:29:18 -05:00
macdonst
4a23f86411 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-03-01 15:57:31 -05:00
macdonst
a69bd65152 Updating cordova.android.js to override FileReader 2012-03-01 15:57:21 -05:00
Fil Maj
7392b63b99 updating cordova.js to include camera constants fix. added clean dependency to build-javascript target in ant file 2012-03-01 11:56:37 -08:00
macdonst
73aa5cc7c3 Updating cordova.android.js to latest version from Apache git repo 2012-03-01 10:45:27 -05:00
Joe Bowser
7bf35e9c83 Merged cordova.android.js. Please move fixes to the cordova-js project 2012-02-29 17:24:04 -08:00
Joe Bowser
adb871f9e1 Updating the JS, even though it shouldn't be here. CB-290 2012-02-29 17:03:37 -08:00
macdonst
21b7346277 Revert change in location of FileSystem 2012-02-29 13:23:32 -05:00
Joe Bowser
79935d31ef Putting back the CordovaInterface work after talking with Simon 2012-02-29 09:34:46 -08:00
Bryce Curtis
d2fc08959a Fix WebSQL for Android 4.0.2. 2012-02-28 23:26:21 -06:00
Bryce Curtis
3ebc1d71df Updating cordova.android.js with File API fixes. 2012-02-28 22:32:30 -06:00
Bryce Curtis
f6503f8476 File APIs should return error code instead of object. 2012-02-28 22:30:27 -06:00
Fil Maj
d593448182 updating cordova.android.js. This resolves CB-283: unregistration of backbutton event handlers do not fire appropriate native method 2012-02-28 17:21:21 -08:00
Joe Bowser
403b87b68b Reverting interface change, not enough time for testing, need to remove it manually 2012-02-28 16:30:25 -08:00
Joe Bowser
bf69362709 Fix to CordovaInterface methods, DroidGap has the managedQuery since it inherits from Activity. (CB-282) 2012-02-28 11:59:51 -08:00
macdonst
c00fb987f6 Switching to require syntax for AudioPlayer 2012-02-28 13:00:33 -05:00
macdonst
7c6450de50 Fixing the call to Media.onStatus() 2012-02-28 11:02:01 -05:00
macdonst
10cbcd7f5a Adding startActivity method to CordovaInterface as many plugins rely on this method 2012-02-27 13:07:56 -05:00
macdonst
e918ffd751 Tagging 1.5.0rc1 2012-02-25 00:28:06 -05:00
macdonst
3ed41597d2 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android into license 2012-02-24 17:51:20 -05:00
macdonst
5722d976ce Fixing app crash when clicking Menu or Back buttons while splashscreen is being shown. 2012-02-23 12:36:38 -05:00
macdonst
8555c42196 CB-3: Apache source headers in callback-android 2012-02-23 11:36:08 -05:00
macdonst
e85394dd99 Refactoring the checks for file:// into a convenience method 2012-02-22 15:56:03 -05:00
macdonst
cc5cfad58d Removing extraneous logging from DroidGap.java left over from rebase 2012-02-22 10:44:16 -05:00
macdonst
363b1429e3 Fix issue with document.location.href not calling loadUrlIntoView
Now we peek at the history and add the url the stack if loadUrlIntoView is not being called.
2012-02-22 10:19:47 -05:00
macdonst
900ff9ed2c Redirect Issue 2012-02-22 10:18:57 -05:00
Joe Bowser
c9d4276207 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-02-20 12:46:20 -08:00
Bryce Curtis
fef0e429db Update build to use new common cordova.android.js instead of building js from multiple Android js files. 2012-02-20 11:04:37 -08:00
Bryce Curtis
26044ad662 Add cordova.android.js from common-js build. 2012-02-20 11:04:37 -08:00
Fil Maj
42430d5d11 more file:// URI truncation :D 2012-02-20 11:04:37 -08:00
Fil Maj
770a257ed3 trim file:// URI from uri->path conversion method 2012-02-20 11:04:37 -08:00
Fil Maj
9fe1f21c9f Use strings not objects 2012-02-20 11:04:37 -08:00
Fil Maj
49d8d22d7f remove trailing slash 2012-02-20 11:04:37 -08:00
Fil Maj
d274891c2c remove file:// protocol from various fileutils methods 2012-02-20 11:04:36 -08:00
Fil Maj
c099c65365 remove file:// protocol from various fileutils remove methods 2012-02-20 11:04:36 -08:00
Fil Maj
79ba28d6c4 truncating file:// protocol where applicable in metadata func 2012-02-20 11:04:36 -08:00
Fil Maj
b4d1ca6181 Need to add/trim file:// where applicable 2012-02-20 11:04:36 -08:00
Fil Maj
657faaff7f Prefix URIs for file API with file:/// and persistent storage should never point to SD card 2012-02-20 11:04:36 -08:00
Fil Maj
a43e80ae1d Return string for root location in requestFileSystem 2012-02-20 11:04:36 -08:00
Fil Maj
5253b5fb31 removing unnecessary try/catch 2012-02-20 11:04:35 -08:00
Fil Maj
8b12bf79e4 Unifying File API error code/response style 2012-02-20 11:04:35 -08:00
Fil Maj
45d75524c9 Changed JavaScript invoked from PluginResult native code to use new modular JS approach 2012-02-20 11:04:35 -08:00
Fil Maj
8a137395ae changing JS invoked from native to work with modular js 2012-02-20 11:04:35 -08:00
Fil Maj
390fe537f8 woops java type checks! love it! 2012-02-20 11:04:35 -08:00
Fil Maj
40cd71484c Adding unsupported action plugin result return if invalid action string is specified to accel and compass listener plugins 2012-02-20 11:04:35 -08:00
Bryce Curtis
9188773152 Arguments are passed as JSON array, not JSON object. 2012-02-19 00:15:23 -06:00
Bryce Curtis
cc8edea065 Call js code using new common js way. 2012-02-18 13:19:50 -06:00
Bryce Curtis
14b368e731 Update build to use new common cordova.android.js instead of building js from multiple Android js files. 2012-02-17 17:30:25 -06:00
Bryce Curtis
4d03577220 Add cordova.android.js from common-js build. 2012-02-17 17:28:35 -06:00
Joe Bowser
040619cd61 Moved the CordovaInterface over to master, doing this before working on CordovaJS 2012-02-17 13:11:15 -08:00
Fil Maj
d6fef8d6e3 more file:// URI truncation :D 2012-02-17 11:40:22 -08:00
Fil Maj
7c1eb7da9b trim file:// URI from uri->path conversion method 2012-02-17 10:55:04 -08:00
Fil Maj
d87ee719a3 Use strings not objects 2012-02-16 18:17:25 -08:00
Fil Maj
a52ba37cf7 remove trailing slash 2012-02-16 17:48:48 -08:00
Fil Maj
cd667d6af5 remove file:// protocol from various fileutils methods 2012-02-16 17:46:16 -08:00
Fil Maj
7e4158ce94 remove file:// protocol from various fileutils remove methods 2012-02-16 17:31:07 -08:00
Fil Maj
0ba803ff46 truncating file:// protocol where applicable in metadata func 2012-02-16 17:21:03 -08:00
Fil Maj
6c48c6a3a1 Need to add/trim file:// where applicable 2012-02-16 15:33:19 -08:00
Fil Maj
7ee135e516 Prefix URIs for file API with file:/// and persistent storage should never point to SD card 2012-02-16 15:18:13 -08:00
Fil Maj
fd69095d3d Return string for root location in requestFileSystem 2012-02-15 17:30:32 -08:00
Fil Maj
357c0ee1ca removing unnecessary try/catch 2012-02-15 16:57:40 -08:00
Fil Maj
40637c1486 Unifying File API error code/response style 2012-02-15 16:47:32 -08:00
Fil Maj
a84d2eab02 Changed JavaScript invoked from PluginResult native code to use new modular JS approach 2012-02-15 10:39:20 -08:00
Fil Maj
52213541a3 changing JS invoked from native to work with modular js 2012-02-15 10:37:24 -08:00
Fil Maj
c7d4d83476 woops java type checks! love it! 2012-02-15 10:35:20 -08:00
Fil Maj
003e3d4d85 Adding unsupported action plugin result return if invalid action string is specified to accel and compass listener plugins 2012-02-15 10:35:19 -08:00
Joe Bowser
95b9cd0229 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-02-09 15:05:30 -08:00
Joe Bowser
044a61d881 Adding custom headers to upload 2012-02-09 15:02:13 -08:00
macdonst
9aa1cd756a Refactor out the Java casting code
When we return JSON to the Java side it does not have the proper methods such as Contact.save() so we need to cast the JSON to the correct JS object. This used to be done from the Java layer calling the right method to cast the JSON. In this new approach the JavaScript layer will no what needs to be cast and call it's own internal function to do the cast.
2012-02-09 16:41:26 -05:00
Joe Bowser
ee4c91539a Change related to FileTransfer, need to get a test going for this somehow 2012-02-08 16:49:17 -08:00
Joe Bowser
77547f8826 Changing to CordovaInterface in preparation of CordovaWebView 2012-02-06 14:13:34 -08:00
Bryce Curtis
52a3a919f9 Missing first line of license in header. 2012-02-06 10:40:48 -06:00
macdonst
1293d64589 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-02-06 10:16:16 -05:00
Anis Kadri
54968b755b CB-75 contact.remove does not remove the contact fully 2012-02-06 10:13:57 -05:00
macdonst
d8d7c29afe Adding com.phonegap.api stubs for legacy user created plugins 2012-02-06 10:04:02 -05:00
Anis Kadri
1c7626aba2 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-02-03 19:36:27 -08:00
Anis Kadri
e0fea2c352 CB-75 contact.remove does not remove the contact fully 2012-02-03 19:32:31 -08:00
macdonst
210cc2bd5e Fixing MediaFileData problem for MP4 video types
Problem:

Using Capture Video and mediaFile.getFormatData() on Android:

Droid / 2.2.3: successfully get height, width, duration

Samsung Galaxy Tab 10.1 / 3.1: recording appears to succeed,
however height / width / duration all come back as 0.

Fix:

The Samsung Galaxy Tab 10.1 returns a MP4 video and not 3GPP as was expected in the Capture class.
2012-02-03 12:24:45 -05:00
macdonst
664a061d10 Rename to Cordova 2012-02-03 10:38:40 -05:00
Joe Bowser
fa4d6d369a Switching headers. Got OK months ago from Simon and Bryce on re-write. No Android Demo code in current project 2012-02-01 13:09:58 -08:00
macdonst
3bff8aec88 Tagging 1.4.1 2012-02-01 15:35:57 -05:00
macdonst
e64cb2fc4f Removing deprecated methods from Device
Device.overrideBackButton
Device.exitApp
Device.resetBackButton
2012-02-01 10:46:27 -05:00
macdonst
c5ada0f09f Deprecating navigator.app.overrideBackbutton
Everyone should be using:

    document.addEventListener("backbutton", yourCallbackFunction, false);
2012-01-31 15:02:11 -05:00
macdonst
44edcbb3cf Updating version to 1.4.0 2012-01-30 16:07:20 -05:00
macdonst
3fd2f590fd Updating version to 1.4.0rc1 2012-01-27 12:06:26 -05:00
macdonst
4f61531422 Fixing a timing issue with the web view history not being cleared properly 2012-01-27 12:02:31 -05:00
macdonst
6e82ec4152 Allow internal SD Card to be used as storage 2012-01-25 16:34:46 -05:00
Joe Bowser
9206dca741 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-25 11:41:24 -08:00
Joe Bowser
503640f6b5 Removing the classic render feature, since it's not working properly 2012-01-25 11:40:46 -08:00
Bryce Curtis
e1e04f859c Remove unused files/classes until they are needed. 2012-01-24 22:42:41 -06:00
Bryce Curtis
e30896155c Added license header to new files. 2012-01-24 22:35:16 -06:00
Bryce Curtis
282f59cd99 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-24 15:03:40 -06:00
macdonst
89e260a5a1 CB-199: FileTransfer.download fails on Android 4.0
The download method in FileTransfer was setting the HttpURLConnection.setDoOutput to true. On Android 4.0 this would force the connection to be a POST when what we actually want is a GET.

I removed the offending line and tested the fix in 2.1, 2.2, 2.3 and 4.0.
2012-01-24 11:24:06 -05:00
Bryce Curtis
20891aee1a Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-23 21:10:40 -06:00
macdonst
6e5ef1e819 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-23 20:15:51 -05:00
Anis Kadri
e8544d30d1 Merge branch 'master' of github.com:imhotep/incubator-cordova-android 2012-01-23 16:21:11 -08:00
Bryce Curtis
f9af33b750 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-23 18:04:33 -06:00
Joe Bowser
d28a60ed97 Moving the WebViewClient out, allowing for PhoneGap to not break on empty console.log 2012-01-23 15:04:03 -08:00
Joe Bowser
0890be5815 Moved Chrome Client out of DroidGap.java 2012-01-23 14:42:55 -08:00
Joe Bowser
308a5f1509 Changing to use JS directly. There are issues with this approach, and it should use the KeyboardHandler 2012-01-23 14:21:20 -08:00
Joe Bowser
7904bcc054 Editing a comment about LinearLayoutSoftKeyboardDetect 2012-01-23 14:01:07 -08:00
Joe Bowser
c7e3b46e2e Moving LinearLayoutSoftKeyboardDetect out into its own class and making it more plugin-like 2012-01-23 13:49:55 -08:00
Joe Bowser
490a13d3c4 Removing GapView, since it doesn't actually do anything 2012-01-23 11:57:15 -08:00
Bryce Curtis
1dfe7e59a7 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-20 15:01:46 -06:00
Joe Bowser
a2cdcd47be Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-20 12:43:06 -08:00
Joe Bowser
a42451969f Merge branch 'master' of github.com:cordova/cordova-android 2012-01-20 12:41:29 -08:00
Joe Bowser
7955c6dd02 Merge branch 'master' of github.com:callback/callback-android 2012-01-20 12:39:21 -08:00
macdonst
56096ad00e Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-20 13:38:06 -05:00
Anis Kadri
faacdd6b02 Merge pull request #1 from pehrlich/master
documentation updates
2012-01-17 16:20:31 -08:00
Peter Ehrlich
bdd7449af3 documentation additions 2012-01-17 16:31:08 -05:00
Anis Kadri
64c462c8ad fixing whitelist handling 2012-01-13 17:29:46 -08:00
Joe Bowser
cb0b054079 Merge pull request #3 from alunny/preferences
add support for <preference name="fullscreen"> to res/xml/phonegap.xml
2012-01-10 13:09:04 -08:00
Joe Bowser
41b49df944 Merge pull request #2 from alunny/with-tests
adding JUnit dependency
2012-01-10 13:01:11 -08:00
alunny
ffa76246e3 making preference reading code more robust 2012-01-09 17:31:58 -08:00
alunny
3af4d6b139 using preference=fullscreen for fullscreen view
involves loading configuration before the layout is set up
2012-01-09 17:31:50 -08:00
alunny
752b1b0e30 reading preferences from phonegap.xml
adds PreferenceNode and PreferenceSet classes as wrappers for the W3C
config.xml <preference> nodes

populates a PreferenceSet @preferences member
2012-01-09 17:29:50 -08:00
alunny
d91beb5ad9 adding JUnit dependency
* framework/libs/junit-4.10.jar
* `ant test` task for running junit tests on jar
* updates to LICENSE and NOTICE files
2012-01-09 17:14:26 -08:00
Bryce Curtis
8db5e06c62 Fix CB-135 Multithreaded access on CallbackServer javascript object. 2012-01-06 22:23:49 -06:00
Joe Bowser
bc309c9f00 Merge conflicts with something on the official repo, moving old pull request in 2012-01-06 15:52:09 -08:00
Joe Bowser
9078fe17b5 Merge pull request #40 from infil00p/master
Clean Merge of Classic Render Mode
2012-01-06 15:48:59 -08:00
macdonst
3172ae4525 Merge branch 'master' of git://github.com/cordova/cordova-android 2012-01-06 16:33:20 -05:00
macdonst
58774addad CB-145: Android contact.save() crashes for native contacts. 2012-01-07 05:33:02 +08:00
bcurtis
8c191331ae Merge branch 'master' of github.com:cordova/cordova-android 2012-01-05 15:21:16 -06:00
Bryce Curtis
7f7c211769 Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-05 15:08:43 -06:00
Bryce Curtis
51bf8c39af Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-cordova-android 2012-01-05 14:42:41 -06:00
Jukka Zitting
4bba9ac5a0 Minor incubation disclaimer fix. 2012-01-05 21:39:18 +01:00
Jukka Zitting
e9eb08486a README.md: Replace "PhoneGap" with "Cordova" and add incubation disclaimer
(This is a test commit to for checking the git push problem by Bryce)
2012-01-05 21:33:26 +01:00
Bryce Curtis
3466ef6dfd Merge pull request #1 from obrand/basic-auth
Added authentication framework
2012-01-05 09:27:02 -08:00
Olivier Brand
36bca7d609 Renamed crdentials/principals to userName/password 2012-01-05 08:26:54 -08:00
Joe Bowser
cc04b54adf Merge branch 'master' of github.com:callback/callback-android 2012-01-04 16:02:03 -08:00
Olivier Brand
e96ae91800 Added authentication framework 2012-01-04 13:47:44 -08:00
macdonst
1d5af102c7 Camera default destination should be FILE_URI 2012-01-05 03:29:55 +08:00
macdonst
b106d2cae8 Proved generating sqlite database path to open database without permission error 2012-01-05 01:50:56 +08:00
macdonst
c66142d6b8 Fixing issue with FileTransfer.upload when the passed in url contains a ? 2012-01-04 00:48:29 +08:00
macdonst
5fac30ea34 Merge pull request #58 from libbybaldwin/add-compass-demo-android
add compass demo for Android
2011-12-22 10:01:55 -08:00
macdonst
fae551f0ce Fix NullPointerException in DroidGap.onMeasure()
It looks like on some devices the onMeasure() method is called before the callbackServer is instantiated. This causes a NullPointerException which kills the application.
2011-12-22 09:51:11 +08:00
Libby Baldwin
65e3a8a453 add compass demo for Android 2011-12-19 18:30:54 -08:00
macdonst
1511183dfd Tagging 1.3.0 2011-12-16 13:29:15 -05:00
macdonst
a640804897 Tagging to 1.3.0rc2 2011-12-13 09:41:54 -05:00
macdonst
f95fdb5873 Fix for CB-104: Capture not returning an error code on cancel 2011-12-06 06:08:35 +08:00
macdonst
4b9e50146e Tagging to 1.3.0rc1 2011-12-05 11:27:08 -05:00
macdonst
26408fabe4 Merge pull request #32 from willshen/master
A couple cleanup and bug fix in the code base
2011-12-01 10:11:44 -08:00
wshen
1dfc65face removed FileExistsException that is not needed 2011-12-01 10:04:49 -08:00
wshen
18bf4cd94b merging from callback 2011-12-01 09:59:42 -08:00
wshen
729d141c3f removed FileExistsException that is not needed 2011-12-01 09:42:23 -08:00
macdonst
29001eeb3a Merge pull request #42 from aflx/download
added download() to the filetransfer
2011-12-01 08:20:04 -08:00
macdonst
acc9173e6e Merge pull request #46 from macdonst/reflect
Remove WebViewReflect.java from Android
2011-11-30 13:46:48 -08:00
Alexander Keller
f387720e54 FileTransfer returns JSONObject with code, source and target for upload and download 2011-11-30 09:15:01 +01:00
Joe Bowser
2094854588 Merge branch 'master' of github.com:callback/callback-android 2011-11-29 14:04:17 -08:00
Alexander Keller
8dbb8f58b1 made getEntry of FileUtils public in order to avoid duplicate code in FileTransfer 2011-11-29 09:38:39 +01:00
Alexander Keller
75963c88d5 changes after review of macdonst, download returns FileEntry 2011-11-29 08:39:57 +01:00
macdonst
188e3e7d7d Remove WebViewReflect.java from Android
While looking at issue #34 I realized that we don't need the WebViewReflect class anymore. Since we only support 2.1 or better and all the methods that WebViewReflect was protecting us from are available in the API version.
2011-11-28 15:44:36 -05:00
macdonst
e02322b66b Remove addWhiteList from public API 2011-11-29 03:47:49 +08:00
Alexander Keller
8904c67fb5 added download() to the filetransfer 2011-11-26 18:16:44 +01:00
Joe Bowser
feff655530 Fixing merge error with the setInitialScale 2011-11-25 14:40:08 -08:00
Joe Bowser
71ea25f40a Fixing scale, setting legacy scale 2011-11-25 14:38:11 -08:00
Joe Bowser
7840448133 Work-around Feature for Classic PhoneGap 320x480 resolution 2011-11-25 14:38:11 -08:00
macdonst
e77e552293 Fix for Issue #33: onReceivedError incorrectly sets openExternal to true 2011-11-25 14:38:09 -08:00
William Shen
5ceb6e2cfa Changed createCaptureFile to explicitly check for PNG and to throw an IllegalArgumentException if it is not a JPEG nor a PNG 2011-11-25 14:38:09 -08:00
Bryce Curtis
035ad08c69 Optimize enumerations as suggested by @plowman. 2011-11-25 14:38:08 -08:00
Bryce Curtis
80d0a0cb4c Change API to postMessage() to call a plugin's onMessage() method. 2011-11-25 14:38:07 -08:00
macdonst
05e233bf1d Fix for issue #281 of phonegap/phonegap-android: Detect for localStorage if Java has disabled it 2011-11-25 14:38:06 -08:00
macdonst
853a734f82 Fix for Issue #33: onReceivedError incorrectly sets openExternal to true 2011-11-25 05:29:24 +08:00
William Shen
d5580557f1 removed unused import 2011-11-23 11:25:53 -08:00
William Shen
7a6a59383b removed a couple extra semicolons 2011-11-23 11:03:14 -08:00
macdonst
c70a1e8594 Fix for phonegap-android issue #261: Wrong application scale 2011-11-24 02:56:00 +08:00
William Shen
cd5bf6195e cleaning up handling of exceptions. removing unnecessary exception declaration in FileUtils. removing try-catch that should not have been done in HttpHandler 2011-11-23 10:52:43 -08:00
William Shen
7c8db0ea44 fixing redundant assignment of variable 2011-11-23 10:39:20 -08:00
macdonst
119f6cca85 Merge pull request #14 from willshen/master
Modified createCaptureFile in CameraLauncher to Improve Encoding Type Safety
2011-11-22 17:24:51 -08:00
Bryce Curtis
4a25d780ce Optimize enumerations as suggested by @plowman. 2011-11-22 14:36:24 -06:00
Bryce Curtis
798cb3e347 Change API to postMessage() to call a plugin's onMessage() method. 2011-11-22 14:36:00 -06:00
macdonst
63ae953432 Fix for issue #281 of phonegap/phonegap-android: Detect for localStorage if Java has disabled it 2011-11-23 03:50:26 +08:00
Joe Bowser
36caaf366f Merge pull request #25 from infil00p/minor_menu_tweak
Change based on new message passing API in IPlugin
2011-11-21 16:07:30 -08:00
macdonst
3ebfb6717c Fix for CB-17: WebView caching resized pictures 2011-11-22 05:30:24 +08:00
Joe Bowser
9409caad69 Change based on new message passing API in IPlugin 2011-11-16 14:50:26 -08:00
macdonst
5406d6c98f Linting the JS code 2011-11-17 04:38:11 +08:00
Joe Bowser
29c7e12505 Merge pull request #15 from infil00p/master
Working on Compliance, Removed the Crypto Library! Seriously guys, please read this!
2011-11-16 10:09:24 -08:00
Bryce Curtis
cbdd400fe7 Fix Issue #23 - Crash when using splash screen. 2011-11-15 23:13:49 -06:00
Bryce Curtis
a6db1112c6 Fix bug with showing loadingDialog property. 2011-11-15 23:06:29 -06:00
Bryce Curtis
bfef72a7c4 Add onload attribute to plugin in plugins.xml to create the plugin at load time instead of lazy loading. 2011-11-15 14:29:32 -06:00
Bryce Curtis
7ce2a8cb71 Make sure we clear appView history too. 2011-11-15 13:55:08 -06:00
Bryce Curtis
2a866e2a7c Refactor backHistory() code so calling navigator.app.backHistory() has consistent behavior with backbutton. 2011-11-09 23:37:16 -06:00
Bryce Curtis
827af8a920 Deprecate addService(). 2011-11-09 23:12:53 -06:00
Bryce Curtis
0caca9ae55 Remove old code. 2011-11-09 15:46:45 -06:00
Bryce Curtis
0bbcf5cfd2 Add onMessage(id, data) to plugin API.
A solution was needed to notify the audio player to pause when a phone call comes in. The option was to add a specific onPhone() method or generalize it. Since there are other "events" that are useful to plugins, a generalized solution was used. It is also extensible without changing the plugin API again.

Any plugin can call DroidGap.onMessage() to send a message/event to all other plugins. NetworkManager was updated to send changes in connection status to plugins, so they can intelligently handle lost connections.
2011-11-09 10:34:49 -06:00
Bryce Curtis
fd93404c7c Backbutton should go back in appview history before going back in our history stack.
JQMobile uses htmlPage#div to navigate "multipage" apps.  When the webview navigates between tags in the same page, it is added to the webview history.
2011-11-09 09:14:13 -06:00
Bryce Curtis
e9fcb296bb Merge branch 'master' of github.com:callback/callback-android 2011-11-07 15:03:56 -06:00
Joe Bowser
d5d95ad489 Merging changes 2011-11-04 13:46:44 -07:00
macdonst
db0a1919f3 Remove PhoneGap.stringify, replace with JSON.stringify
Since we don't support Android 1.5/1.6 anymore we don't need to check to see if JSON.stringify is around as it is included in Android 2.1+. By removing this check for JSON.stringify we remove two conditional checks on each call to PhoneGap.exec.

As well we get rid of 60 lines of code which are currently bloating phonegap.js.base.
2011-11-04 13:40:52 -07:00
Bryce Curtis
141b8355ac Don't fire resume upon init - only when returning from background.
Lifecycle behavior for PhoneGap app:
window.onload = loading html page
pause = html page entering background (not displayed)
resume = html page entering foreground (displayed)
window.onunload = leaving html page
2011-11-04 13:40:51 -07:00
William Shen
affab67ca3 Changed createCaptureFile to explicitly check for PNG and to throw an IllegalArgumentException if it is not a JPEG nor a PNG 2011-11-03 18:41:08 -07:00
macdonst
cf9848bd59 Remove PhoneGap.stringify, replace with JSON.stringify
Since we don't support Android 1.5/1.6 anymore we don't need to check to see if JSON.stringify is around as it is included in Android 2.1+. By removing this check for JSON.stringify we remove two conditional checks on each call to PhoneGap.exec.

As well we get rid of 60 lines of code which are currently bloating phonegap.js.base.
2011-11-04 04:30:46 +08:00
Bryce Curtis
7ad3f76d9a Don't fire resume upon init - only when returning from background.
Lifecycle behavior for PhoneGap app:
window.onload = loading html page
pause = html page entering background (not displayed)
resume = html page entering foreground (displayed)
window.onunload = leaving html page
2011-11-03 14:22:29 -05:00
Joe Bowser
7244a5a727 Merge branch 'master' of github.com:callback/callback-android 2011-11-02 13:10:50 -07:00
Fil Maj
538cdb03fc No -e caused the bash script to fail 2011-11-02 12:01:36 -07:00
Bryce Curtis
8057bca4f2 Merge pull request #11 from nisc/remote-issue-11
Fixes to make example project build
2011-11-01 19:42:07 -07:00
nisc
546b33c936 Fixes to make example project build and compile
On Ubuntu 11.04, that is.
2011-11-01 22:04:28 +01:00
Bryce Curtis
9b5a63e8e4 Updated readme. 2011-10-31 21:14:05 -05:00
Bryce Curtis
798d502083 Update for 1.2.0. 2011-10-31 20:46:22 -05:00
Bryce Curtis
813637eb78 Update to download and run callback-test repository. 2011-10-31 20:45:38 -05:00
Bryce Curtis
e4a5000f9e This is an informative message, not an error message. It is normal to get this when leaving a page. 2011-10-31 20:39:42 -05:00
Bryce Curtis
fd07cfc461 Update version to 1.2.0. 2011-10-31 17:29:08 -05:00
Bryce Curtis
d1ec1f7693 Don't fire resume at app startup. 2011-10-31 14:18:32 -05:00
Joe Bowser
e1d3f1491f Accidentally added stray char when changing the licence 2011-10-28 16:31:48 -07:00
Joe Bowser
5075a3e087 Merge branch 'master' of github.com:callback/callback-android 2011-10-28 13:26:17 -07:00
Joe Bowser
a35a33c05e Adding the Apache Headers 2011-10-27 14:04:39 -07:00
Joe Bowser
5a40613ccc Switching to ASF header for Callback 2011-10-27 12:04:54 -07:00
Bryce Curtis
2d690ad014 Use LOG instead of System.out.println for logging. 2011-10-26 14:28:39 -05:00
Fil Maj
ff2ee67cb8 JSPrompt "Security check" should whitelist all file URIs too 2011-10-25 15:34:32 -07:00
Joe Bowser
505081f42f Merge branch 'master' of github.com:callback/callback-android 2011-10-25 15:21:15 -07:00
Joe Bowser
80ee464dce Fix for Console.log, didn't call the super of the method needed 2011-10-25 15:21:06 -07:00
Bryce Curtis
e4a992095f Set activity state correctly when ending activity. 2011-10-25 14:57:55 -05:00
Joe Bowser
aa6e011255 Removing the Camera permission, since it is not required by PhoneGap by default 2011-10-25 11:31:01 -07:00
Bryce Curtis
12816aa8f3 Run error dialog on UI thread. 2011-10-25 11:44:06 -05:00
Bryce Curtis
60b5d42324 Set activity state correctly when ending activity. 2011-10-25 11:39:37 -05:00
macdonst
d3d1c06c09 Merge pull request #2 from macdonst/webview
Fixing compilation error in DroidGap
2011-10-24 07:33:33 -07:00
macdonst
010e162cd7 Fixing compilation error in DroidGap 2011-10-24 10:32:14 -04:00
Bryce Curtis
191e1bf150 Merge branch 'master' of github.com:callback/callback-android 2011-10-21 16:44:12 -05:00
Bryce Curtis
cdeddf1bb2 Merge pull request #1 from brycecurtis/webview
Load multi-page apps in same webview and update pause/resume for consiste
2011-10-21 14:43:13 -07:00
Bryce Curtis
bd7ed19b52 Load multi-page apps in same webview and update pause/resume for consistency.
1. Make handling of multi-page apps consistent with iOS and Blackberry to load into same webview (instead of starting a new activity).

2. Make lifecycle consistent.  pause is called when going into background, resume is called when coming into foreground.  It is no longer called when loading or leaving an HTML page.  Use window.onload/onunload to get these notifications.
2011-10-21 16:29:55 -05:00
Joe Bowser
64b770b761 Merge pull request #279 from infil00p/master
Clean-Up and Fix for Alert
2011-10-21 13:01:50 -07:00
Joe Bowser
628473cc5b Making Alert cancellable so that it does not break the back button 2011-10-21 12:42:30 -07:00
Joe Bowser
75f3651376 Merge pull request #278 from infil00p/master
Modifying build.xml to use custom versions, adding ant files, and fixing HTC Logcat
2011-10-21 11:00:37 -07:00
Joe Bowser
3e25953d33 HTC Fix 2011-10-21 10:34:59 -07:00
hardeep
996791696b Merge pull request #275 from imhotep/master
Improved whitelisting
2011-10-20 16:18:42 -07:00
Anis Kadri
a08854eaf0 improved whitelisting 2011-10-20 15:09:48 -07:00
Anis Kadri
81ec4bc4fb Merge branch 'master' of github.com:phonegap/phonegap-android 2011-10-20 13:58:11 -07:00
Joe Bowser
0b9ed0c7c7 Merging Simon's fix for Android 4 2011-10-20 13:54:26 -07:00
macdonst
ffb614dd91 Merge pull request #274 from macdonst/android4
Fixing Project Properties file
2011-10-20 13:49:10 -07:00
macdonst
e26685becf Fixing Project Properties file 2011-10-20 16:48:16 -04:00
macdonst
90b8c20e28 Merge pull request #273 from macdonst/android4
Updating to use Android 4.0 build environment
2011-10-20 13:27:42 -07:00
macdonst
a8db71cd67 Updating to use Android 4.0 build environment 2011-10-20 16:26:30 -04:00
Joe Bowser
543fe1f43f Upgrading to Ice Cream Sandwich 2011-10-20 11:13:44 -07:00
macdonst
1f2f9a02dd Merge pull request #272 from macdonst/mediaErr
Media err normalization with iOS
2011-10-19 12:25:27 -07:00
macdonst
551f0f7e4a Normalize MediaError's with iOS 2011-10-19 15:22:50 -04:00
macdonst
369d140040 Return MediaError object instead of value 2011-10-19 15:06:36 -04:00
Anis Kadri
ac509369e9 forgot to resolve conflict 2011-10-14 15:49:16 -07:00
Anis Kadri
5faed8378c Merge branch 'master' of github.com:phonegap/phonegap-android
Conflicts:
	framework/res/xml/phonegap.xml
	framework/src/com/phonegap/DroidGap.java
2011-10-14 15:43:13 -07:00
Bryce Curtis
7ee04ebf31 Fix Issue #258 - navigator.app.exitApp() and navigator.app.backHistory() not working in PhoneGap 1.1.0 on Android 2011-10-12 11:22:35 -05:00
Joe Bowser
0ec47c5bd8 Merge pull request #264 from infil00p/master
This time, let's handle BOTH the Back Button and the Search Button
2011-10-10 14:23:29 -07:00
Bryce Curtis
fe3e7041b7 Don't override history.back since jQuery also does it. 2011-10-06 22:21:09 -05:00
Joe Bowser
75ab33ad0c Adding handling of Search Button for the jsPrompt 2011-10-05 16:01:10 -07:00
Joe Bowser
1377f60b29 Merge pull request #263 from infil00p/master
Fix the back button on jsConfirm
2011-10-05 14:16:20 -07:00
Joe Bowser
8b595f9796 Fixing the jsConfirm so it doesn't break the back button 2011-10-05 13:57:38 -07:00
Bryce Curtis
1f8d6b4866 Use endActivity() for consistency. Improve error handling. 2011-10-04 21:32:42 -05:00
macdonst
ea87dfe08a Merge pull request #259 from macdonst/issue257
Fix for Issue #257: File Transfer with file:/// URIs
2011-10-04 08:57:37 -07:00
macdonst
2d388025ad Fix for Issue #257: File Transfer with file:/// URIs 2011-10-04 11:53:46 -04:00
Bryce Curtis
424078432a Add comments and rename loadWhiteList() to loadConfiguration(). 2011-10-03 10:49:27 -05:00
Bryce Curtis
bb2bd22fad Correct log level comparison. 2011-10-03 10:29:14 -05:00
Bryce Curtis
6b29787df7 Merge pull request #247 from brycecurtis/LOG
Formalize logging with printf-type optimization.
2011-10-03 08:24:13 -07:00
macdonst
804ac714ae Updating version number to 1.1.0 2011-10-01 03:57:06 +08:00
macdonst
9ede0ceca1 Merge pull request #250 from macdonst/delcam
Fixing issues in the Camera code
2011-09-30 11:33:06 -07:00
macdonst
24ad506da5 Fixing JavaScript comparrison issues 2011-09-30 14:26:48 -04:00
macdonst
80695ec5e4 Fix issue with DATA_URL and refactor code 2011-09-30 11:30:04 -04:00
macdonst
6098f46d08 When you use the File API to remove a file need to check to see if we need to delete a row from the content store 2011-09-29 23:09:44 -04:00
macdonst
367d7500d5 Deletes any duplicate images taken by camera 2011-09-29 22:29:35 -04:00
macdonst
0d57404cf1 Merge pull request #249 from macdonst/gallery
Adding video select to getPicture to line up with iOS
2011-09-29 12:13:44 -07:00
macdonst
67393c516e Adding video select to getPicture to line up with iOS 2011-09-29 14:49:34 -04:00
Bryce Curtis
ebb9f09168 Improve closing an HTML page and returning to previous page. 2011-09-29 11:02:54 -05:00
Bryce Curtis
a4d66c63a4 Call the initial onResume() on a plugin when it is created. This corrects the lifecycle behavior for plugins. 2011-09-28 22:40:53 -05:00
Bryce Curtis
6a9253e928 Formalize logging with printf-type optimization. Wrap Android log facilities instead of using System.out.println(). 2011-09-28 22:19:23 -05:00
Bryce Curtis
0f988717d0 When app.exitApp() is called on multi-page app, pass to previous pages in stack and close them too. 2011-09-28 21:52:17 -05:00
Bryce Curtis
025577c41d Add comment for method onOverrideUrlLoading() 2011-09-28 21:36:43 -05:00
macdonst
f271e2e0fa Merge pull request #246 from macdonst/compass2
Fix for Issue #228: Align Compass support with iOS

This is the second time I've had to merge this pull request.
2011-09-28 14:58:22 -07:00
macdonst
821eb24a54 Fix for Issue #228: Align Compass support with iOS 2011-09-28 17:35:50 -04:00
Bryce Curtis
336a58ca5a Clean up code and consolidate bindBrowser with init. 2011-09-28 10:03:05 -05:00
Bryce Curtis
aa6e4185de Merge pull request #242 from brycecurtis/page2
Clean up code that loads sub-pages and correct behavior.
2011-09-28 07:54:52 -07:00
Bryce Curtis
75c2cdb3ad Clean up code that loads sub-pages and correct behavior. 2011-09-27 15:59:42 -05:00
Bryce Curtis
e92057a00f Merge pull request #241 from brycecurtis/whitelist
White list support.   Enhance imhotep submission.
2011-09-26 09:18:39 -07:00
Bryce Curtis
80df4a8fb2 White list support. Pull request https://github.com/phonegap/phonegap-android/pull/211 from imhotep would not merge, so combined it with enhancements for this commit. 2011-09-26 10:58:41 -05:00
macdonst
bb777c096c Fix for Issue #172: Out of memory when uploading video using FileTransfer on Android 2011-09-24 00:15:59 +08:00
macdonst
94c1fb3e63 Fix for issue #237: DirectoryManager.getFreeDiskSpace() returns kilobytes instead of bytes free 2011-09-20 23:12:45 +08:00
macdonst
e9bb66622c Merge pull request #233 from macdonst/is229
Issue #229: Deprecate FileMgr code in file.js
2011-09-13 14:00:32 -07:00
macdonst
362841008a fix for Issue #229: Deprecate FileMgr code in file.js 2011-09-13 16:57:32 -04:00
macdonst
6fabcfc8d3 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-13 11:07:48 -04:00
macdonst
9040eea76c Fix for Issue #213: Unknown connection type for CDMA - EvDo rev. A 2011-09-13 23:07:17 +08:00
macdonst
9c0b15f7af Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-10 16:01:35 -04:00
macdonst
2b20b1880d Fix for issue #196: targetWidth/targetHeight ignored when PictureSourceType is library 2011-09-11 03:51:28 +08:00
macdonst
61c4836366 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-09 10:46:51 -04:00
Bryce Curtis
e8826090bb Remove lingering code for old 1.x support. 2011-09-08 16:02:08 -05:00
Bryce Curtis
e1b3a8cdce Cleanup formatting. 2011-09-08 15:43:08 -05:00
Bryce Curtis
0b6a39bc6f Add ability to override url handling in plugins. This takes part of code from "Issue 216: Droidgap now allows plugins to override url loading" by davejohnson. 2011-09-08 15:36:20 -05:00
Dave Johnson
aa577416de Fix so that we get the correct id when more than 9 targets 2011-09-07 16:31:29 -07:00
brianleroux
d34c0b086e Merge branch 'master' of github.com:brianleroux/phonegap-android 2011-09-06 14:16:16 -07:00
macdonst
073f71563c Fix for Issue #222: Android plugin FileUploader with UTF-8 in params 2011-09-06 14:15:45 -07:00
macdonst
9eb02a4882 Fix bad tel: link in example/index.html 2011-09-06 14:15:45 -07:00
macdonst
6c3d13fc74 Fix for Issue #220: Android audio streaming doesn't work for https 2011-09-06 14:15:45 -07:00
macdonst
70de3d49a2 Fix for Issue #218: audio capture audio/3gpp mimetype getting set to video/3gpp
Works around an issue where MimeTypeMap.getMimeTypeFromExtension() always returns video/3gpp when the file extension is .3gp or .3gpp.
2011-09-06 14:15:45 -07:00
Dave Johnson
e41746b6a8 Add overrideUrlLoading overriding ... yeah ... to plugins by the plugin adding a <url-filter.../> and implmenting the onOverrideUrlLoading(...) method 2011-09-06 14:15:45 -07:00
macdonst
6af5e2e2e1 Fix for Issue #210: devready event never fires if we can't get network connection info 2011-09-06 14:15:45 -07:00
macdonst
9083e921d9 Fix for Issue #208: Media.release() accidentally makes a call to the Media error callback 2011-09-06 14:15:45 -07:00
Bryce Curtis
4a38f160fb Re-checkin commit for "Fix Issue #203: Prompt crashes on Android 3.2 tablet." 2011-09-06 14:15:45 -07:00
macdonst
0297807bd0 Fix for issue #141: EXIF data stripped from captured photos in android
In order to fix this issue I needed to read the EXIF data. Save it to a temporary object then after the bitmap is compressed I open the file and write the saved EXIF data.

Supports the following EXIF fields if they are set in your image:

APERTURE
DATETIME
EXPOSURE_TIME
FLASH
FOCAL_LENGTH
GPS_ALTITUDE
GPS_ALTITUDE_REF
GPS_DATESTAMP
GPS_LATITUDE
GPS_LATITUDE_REF
GPS_LONGITUDE
GPS_LONGITUDE_REF
GPS_PROCESSING_METHOD
GPS_TIMESTAMP
ISO
MAKE
MODEL
ORIENTATION
WHITE_BALANCE
2011-09-06 14:15:45 -07:00
Bryce Curtis
2e9cbdf38d Remove old phonegap.js file. 2011-09-06 14:15:44 -07:00
Bryce Curtis
498f879383 Fix Issue #203: Prompt crashes on Android 3.2 tablet. 2011-09-06 14:15:44 -07:00
macdonst
91f4097fd8 Fix for Issue #222: Android plugin FileUploader with UTF-8 in params 2011-09-06 23:31:02 +08:00
macdonst
0ece6cedfe Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-06 11:01:06 -04:00
brianleroux
f3fd6901d6 BOOM 2011-09-02 14:42:37 -07:00
macdonst
4f121aa07d Fix bad tel: link in example/index.html 2011-09-03 01:35:01 +08:00
macdonst
4119fd513a Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-01 20:39:11 -04:00
macdonst
a6ae85b4ea Fix for Issue #220: Android audio streaming doesn't work for https 2011-09-02 08:38:28 +08:00
brianleroux
5ffdaeb213 updated readme 2011-09-01 14:44:02 -07:00
brianleroux
95c48f7f6c fixing merge 2011-09-01 14:37:59 -07:00
brianleroux
d34dcf8ee5 cli moving to a phonegap folder, local to the proj and tests 2011-09-01 14:34:11 -07:00
brianleroux
e7f206b598 adding benchmarking automation 2011-09-01 13:15:19 -07:00
brianleroux
9aacb7f811 fixing rebase removing debug from root 2011-09-01 13:14:51 -07:00
brianleroux
caf2694ced updated the improved cli docs 2011-09-01 13:12:10 -07:00
brianleroux
7bf8c617c3 slightly more coherent organization of concerns 2011-09-01 13:12:09 -07:00
brianleroux
9ad78a50f7 added node, nodeunit and a couple of stubbed in coffeescript tests 2011-09-01 13:12:09 -07:00
brianleroux
85a24d491e adding benchmarking automation 2011-09-01 13:11:01 -07:00
macdonst
65fd082537 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-01 15:02:32 -04:00
macdonst
d9ec6df5a8 Fix for Issue #218: audio capture audio/3gpp mimetype getting set to video/3gpp
Works around an issue where MimeTypeMap.getMimeTypeFromExtension() always returns video/3gpp when the file extension is .3gp or .3gpp.
2011-09-02 02:40:35 +08:00
macdonst
63bd7f470e Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-09-01 09:41:04 -04:00
Bryce Curtis
c419f7d269 Merge pull request #215 from davejohnson/feature/urlhandling
Add overrideUrlLoading overriding ... yeah ... to plugins by the plugin a
2011-08-31 07:56:23 -07:00
Dave Johnson
3e5a52ceee Add overrideUrlLoading overriding ... yeah ... to plugins by the plugin adding a <url-filter.../> and implmenting the onOverrideUrlLoading(...) method 2011-08-30 16:52:56 -07:00
Anis Kadri
97faebda41 adding isUrlWhiteListed in shouldOverrideUrlLoading 2011-08-29 17:35:11 -07:00
Anis Kadri
f111ea56ed whitelist support 2011-08-29 16:13:02 -07:00
Anis Kadri
e2acd1af33 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-08-29 15:46:27 -07:00
macdonst
ff4ea29713 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-26 16:16:45 -04:00
macdonst
8d35b1aeef Fix for Issue #210: devready event never fires if we can't get network connection info 2011-08-27 04:16:11 +08:00
Dave Johnson
75233711e3 Moved around the scripts so that you can create a self contained project that you can run debug, emulate and log from 2011-08-26 10:54:37 -07:00
macdonst
4b488fc911 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-25 12:45:03 -04:00
macdonst
facb752cc7 Fix for Issue #208: Media.release() accidentally makes a call to the Media error callback 2011-08-26 00:16:37 +08:00
macdonst
c5d3a60f56 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-23 09:38:21 -04:00
Bryce Curtis
8a5dec8d8b Re-checkin commit for "Fix Issue #203: Prompt crashes on Android 3.2 tablet." 2011-08-22 16:22:22 -05:00
macdonst
43baa58ab3 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-22 13:48:06 -04:00
macdonst
a9c34e65fb Fix for issue #141: EXIF data stripped from captured photos in android
In order to fix this issue I needed to read the EXIF data. Save it to a temporary object then after the bitmap is compressed I open the file and write the saved EXIF data.

Supports the following EXIF fields if they are set in your image:

APERTURE
DATETIME
EXPOSURE_TIME
FLASH
FOCAL_LENGTH
GPS_ALTITUDE
GPS_ALTITUDE_REF
GPS_DATESTAMP
GPS_LATITUDE
GPS_LATITUDE_REF
GPS_LONGITUDE
GPS_LONGITUDE_REF
GPS_PROCESSING_METHOD
GPS_TIMESTAMP
ISO
MAKE
MODEL
ORIENTATION
WHITE_BALANCE
2011-08-23 01:47:10 +08:00
macdonst
5180340f18 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-22 13:27:18 -04:00
Bryce Curtis
8a4737947b Remove old phonegap.js file. 2011-08-22 09:50:42 -05:00
Bryce Curtis
0e316321f9 Fix Issue #203: Prompt crashes on Android 3.2 tablet. 2011-08-21 20:50:57 -05:00
Dave Johnson
ef8e8a3ab4 Fix up a few things for the ant create to work on mac 2011-08-21 00:29:07 -07:00
brianleroux
fe265ce9e1 added optional path to debug 2011-08-20 13:57:19 -07:00
davejohnson
28b972be52 Add new windows create script for android as a cscript script. Also created an ant xml that should work on mac too. 2011-08-20 13:42:46 -07:00
davejohnson
4a9fbb6869 Remove xlargescreen since it is only supported if you are building with the latest SDK. Yes people *should* be building with that but it's not even on any phones yet 2011-08-20 13:30:11 -07:00
davejohnson
8cf00fc788 Moved default plugins.xml, www, and manifest.xml into a folder structure that can be straight copied over a new android project. change the bash script to update the target of the phonegap framework dir before building 2011-08-20 13:27:53 -07:00
brianleroux
8b908fbad0 updated the improved cli docs 2011-08-19 22:20:53 -07:00
brianleroux
e44cc8add1 slightly more coherent organization of concerns 2011-08-19 21:50:46 -07:00
brianleroux
5a3208291c added node, nodeunit and a couple of stubbed in coffeescript tests 2011-08-19 20:39:35 -07:00
brianleroux
1c064b0922 test fully automated from mobile-spec edge 2011-08-18 22:40:09 -07:00
brianleroux
ffdb240114 auto launching on debug 2011-08-18 19:39:27 -07:00
brianleroux
2f9060dd3e first pass at a test script 2011-08-18 19:20:41 -07:00
brianleroux
efe021916e slightly better docs 2011-08-18 18:31:13 -07:00
brianleroux
65cf68b5d2 no more ruby dependency 2011-08-18 18:21:51 -07:00
macdonst
91d8dd42c1 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-17 15:45:35 -04:00
macdonst
7e2044c5b4 Merge pull request #195 from m00sey/master
Expose Volume control
2011-08-17 12:45:09 -07:00
macdonst
3666490347 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-17 13:45:24 -04:00
macdonst
80891b8495 Fix for Issue #200: NetworkManager missing HSDPA in getType
Added HSDPA, HSUPA, HSPA and HSPA+ type detection to NetworkManager.
2011-08-18 00:42:57 +08:00
macdonst
55379d6fba Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-12 11:45:52 -04:00
Bryce Curtis
361a7aacc5 Issue #194: Resolve flashes between screen, and enable setting of background color & optional loading dialog. 2011-08-11 16:21:22 -05:00
macdonst
19040671a9 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-11 17:01:07 -04:00
Bryce Curtis
4ecfbac586 Include plugin reference and permissions for battery events. 2011-08-11 15:37:11 -05:00
Bryce Curtis
8d46d33675 Implementation of Battery Event Spec. (http://dev.w3.org/2009/dap/system-info/battery-status.html) 2011-08-12 04:31:43 +08:00
Bryce Curtis
a735a631f6 Formalize document and window event listeners and allow plugins to override eventListeners. 2011-08-12 04:31:43 +08:00
Kevin Griffin
381d1615b4 formatting 2011-08-09 23:19:50 -04:00
Kevin Griffin
ad8086fab5 exposing volume control 2011-08-09 23:18:01 -04:00
Anis Kadri
19332c1903 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-08-09 16:25:19 -07:00
macdonst
fd22a7915e Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-08-01 21:18:28 -04:00
macdonst
8c7db9aa32 Remove redundant import when droidgap create is run 2011-07-31 03:19:01 +08:00
macdonst
7bb34dea14 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-29 00:02:07 -04:00
macdonst
004453b03f Upping version to 1.0.0 2011-07-29 12:01:46 +08:00
macdonst
a1edf92fa4 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-28 23:58:09 -04:00
macdonst
e28458869f Issue #185: Fix mis-spelling in file.js 2011-07-29 11:56:29 +08:00
Anis Kadri
b4c4fa9667 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-07-26 17:01:40 -07:00
macdonst
229e15f685 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-26 00:31:37 -04:00
macdonst
39d6952494 Upping version to 1.0.0rc3 2011-07-26 12:30:41 +08:00
macdonst
b864a8a6c6 Upping version to 1.0.0rc3 2011-07-26 00:20:35 -04:00
macdonst
f5dac1451d Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-26 00:18:33 -04:00
macdonst
2bf765897b Normalize Android Camera.takePicture with iOS and BB versions.
Both iOS and BlackBerry support the PNG image format so I added support for Android.

Also, iOS and BB use targetWidth/targetHeight to specify the resolution of the image.  I've swiched from using maxResolution to targetWidth/targetHeight in this change list.
2011-07-26 12:18:04 +08:00
macdonst
411288b051 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-25 11:05:38 -04:00
macdonst
1c97467e39 Issue #169: Media.seekTo() does not update Media._position value.
Calling Media.seekTo() now updates the Media._position value. I could not make seekTo() to work when your audio clip is not playing as that is not a supported action of the AndroidMedia player class.
2011-07-23 03:21:45 +08:00
macdonst
7c39edfcd0 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-21 22:31:26 -04:00
macdonst
9f673db79f Issue #176: rc2 for Android does not have updated main.js - demo app code
This commit fixes the issue in main.js but it will still need to be packaged up in the rc3 zip.
2011-07-22 10:06:43 +08:00
Dave Johnson
8c807315e9 there was a "Location" and a "Geolocation" plugin defined. We use "Geolocation" in the JavaScript 2011-07-21 16:42:59 -07:00
Joe Bowser
be48b576d9 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-07-21 13:16:09 -07:00
Joe Bowser
648e56cb67 Merging maxResolution 2011-07-21 13:15:52 -07:00
macdonst
b37defd3cf Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-21 15:18:10 -04:00
macdonst
c093881f54 Issue #174: contact attribs should return null instead of empty array
Currently the implementation will return an empty array for the following Contact attributes: phoneNumbers, emails, addresses, ims, organizations, addresses, websites and photos.  With this fix these attributes will be null unless the lenght of the array is greater than 0.
2011-07-22 03:16:45 +08:00
Brian LeRoux
e09c728fd0 Edited framework/src/com/phonegap/DroidGap.java via GitHub 2011-07-21 11:47:20 -07:00
macdonst
d098b6133e Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-21 11:59:41 -04:00
Anis Kadri
c067299ace Merge github.com:phonegap/phonegap-android 2011-07-20 13:17:00 -07:00
macdonst
029ddeade0 Fix Issue #170: Sub pages reload on orientation or keyboard changes
Needed to add android:configChanges="orientation|keyboardHidden" to the com.phonegap.DroidGap activity in AndroidManifest.xml.
2011-07-20 23:21:34 +08:00
macdonst
17ccb2db4d Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-20 11:13:33 -04:00
Bryce Curtis
6b84ead393 Issue #167: Remove window.app and use navigator.app instead. Remove App() from namespace. 2011-07-19 11:00:13 -05:00
macdonst
9bf3a82964 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-18 16:11:51 -04:00
macdonst
7afa2d3840 Upping version to 1.0.0rc2 2011-07-19 04:11:17 +08:00
macdonst
e789349c23 Handle content:// uri's in resolveLocalFileSystemURI
Sometimes Android will hand you a content:// uri in the place of a file path. Particularily the Camera.getPicture() code will do this. I've updated the file utils code to handle this type of uri and return a real file path.
2011-07-19 04:10:55 +08:00
macdonst
f7ebc98375 Upping version to 1.0.0rc2 2011-07-18 12:48:26 -04:00
Bryce Curtis
2787a960d8 Issue #153: Display default value in prompt(). 2011-07-16 15:07:34 -05:00
Dave Johnson
4af8952dc3 Merge pull request #161 from don/master
Write error to log when plugins.xml is missing
2011-07-15 22:03:42 -07:00
Don Coleman
701717fd55 remove comment from xml declaration 2011-07-15 23:47:08 -04:00
Don Coleman
3de2084af2 write error to log when plugins.xml is missing 2011-07-15 23:45:32 -04:00
Joe Bowser
6d532c9fe5 Minor change to Android Manifest for Android 3.2 to force it out of Compatibltiy Mode 2011-07-15 16:19:08 -07:00
macdonst
eb0e0d9d11 Issue #156: Camera.DestinationType.FILE_URI on Android not conforming to API Spec
Instead of capturing the orginal image to /sdcard/Pic.jpg or /sdcard/Capture.jpg we detect if the SD card is mounted. If mounted the file is placed in the apps temp directory at:

/sdcard/Android/data/{package name}/cache/

If the SD card is not mounted we default to internal storage at:

/data/data/{package name}/cache/
2011-07-16 05:03:48 +08:00
Bryce Curtis
53410781e4 Issue #154: Propagate existing parameters when starting new DroidGap activity. 2011-07-15 15:00:12 -05:00
Bryce Curtis
2bee9a8442 Remove deprecated addService() method. The new way to register a plugin is to include it in res/xml/plugins.xml. 2011-07-15 14:26:20 -05:00
Bryce Curtis
7c9eca1fab Replace deprecated call to activityStop. 2011-07-15 14:04:46 -05:00
Bryce Curtis
017fa1b917 Use the same database based upon application context for each html page loaded as part of this app. 2011-07-13 16:48:29 -05:00
Bryce Curtis
24bb836221 Shouldn't return error on first call. This prevents successful invocation, which prevents deviceready from firing. 2011-07-13 00:21:34 -05:00
macdonst
6993c7edd1 Merge pull request #152 from macdonst/issue151
Issue151: Remove minification of phonegap.*.js file
2011-07-12 15:03:25 -07:00
macdonst
4cc3772e84 Issue #151: Remove minification of phonegap.*.js file 2011-07-12 15:33:46 -04:00
macdonst
2a3c387ce3 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-12 12:23:34 -04:00
macdonst
c80ddc1b22 Issue #149: Deprecate support for Android 1.X devices
Right now we are just removing the code for Contacts on 1.5/1.6 devices. We still need to keep around our implementation of Geolocation and Storage for older devices since some versions of Android have broken implementations of these features. Android 3.0 I'm looking at you!
2011-07-13 00:18:38 +08:00
macdonst
e1092590d6 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-12 11:05:56 -04:00
macdonst
24f979394f Remove deprecated Network.isReachable (use the Network Information API instead) 2011-07-12 23:01:42 +08:00
macdonst
9971d61601 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-12 10:58:28 -04:00
Bryce Curtis
6c65a6a016 Make sure we load the correct resource id for plugins.xml. 2011-07-11 22:56:20 -05:00
macdonst
37b9cc47bd Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-11 23:30:41 -04:00
macdonst
66f7afbed2 Issue #146: File API - File::writeAsText not in the API, remove 2011-07-12 11:13:24 +08:00
macdonst
b1c0be3dd6 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-11 22:53:46 -04:00
Dave Johnson
60be45b9d9 Fix example to not include the min.js that is non-existent 2011-07-11 18:21:55 -07:00
macdonst
393bd5a1f5 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-11 17:28:56 -04:00
macdonst
1de036a744 Setting version as 1.0.0rc1 2011-07-12 05:25:53 +08:00
macdonst
a235513991 Setting version as 1.0.0rc1 2011-07-11 17:24:33 -04:00
macdonst
22a9cabeb9 Updating Contacts for June 16th W3C Spec 2011-07-11 23:18:24 +08:00
Bryce Curtis
5de4ae7554 Remove dependency on notification.activityStart/Stop so they can be deprecated to an optional plugin. Also remove hideLoadingDialogOnPage option, since it no longer is relevant. 2011-07-08 23:07:22 -05:00
Bryce Curtis
f19d8f9bba Change to PhoneGap naming convention affects droidgap creation & update. Also, create script uses phonegap-x.js, not phonegap-x.min.js. 2011-07-08 16:27:57 -05:00
macdonst
d4ccc702b2 Merge pull request #145 from macdonst/fixJar
Update .gitignore and .jar file name
2011-07-08 13:44:45 -07:00
macdonst
a0c748620a Update .gitignore and .jar file name 2011-07-08 16:40:55 -04:00
macdonst
b85a769372 Merge pull request #144 from macdonst/is129
Fix for #129: PhoneGap JS Naming Convention
2011-07-08 12:03:26 -07:00
macdonst
dd52081deb Fix for #129: PhoneGap JS Naming Convention 2011-07-08 14:35:31 -04:00
macdonst
ebd92a4b12 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-07 16:49:22 -04:00
Bryce Curtis
0a7a77e77b Accept IPlugin for result callback when starting activities for result. 2011-07-07 14:11:03 -05:00
Bryce Curtis
9d1e73656f Merge pull request #138 from davejohnson/iplugin-fix
Update PluginManager to accept plugins implementing IPlugin too
2011-07-07 12:00:36 -07:00
macdonst
6e62a76564 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-07 13:08:25 -04:00
macdonst
3895570edd Fixed Issue 140: Contact.displayName is not being set correctly 2011-07-08 01:06:27 +08:00
Fil Maj
28b01fe494 Fix for #120: zooming in on input elements when filling out forms. Note, you also have to set initial-scale and maximum-scale properties in your meta name=viewport tag. 2011-07-07 09:19:39 -07:00
macdonst
709eacd9dc Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-07-07 11:49:24 -04:00
Dave Johnson
090890b22a Update PluginManager to accept plugins that implement IPlugin rather than extend Plugin 2011-07-07 00:12:44 -07:00
Bryce Curtis
ce9d577415 Remove unused code and variable. 2011-07-06 13:56:49 -05:00
Bryce Curtis
cfc9631873 Copy plugins.xml when creating a new project. 2011-07-06 13:36:29 -05:00
Bryce Curtis
3bf48f82af Merge pull request #136 from brycecurtis/plugins
Loading plugins from res/xml/plugins.xml
2011-07-06 11:12:20 -07:00
Dave Johnson
f9bcf71a7a Merge pull request #134 from davejohnson/plugin-refactor
Plugin refactor
2011-07-06 11:10:00 -07:00
Bryce Curtis
9d5aa9406c Loading plugins from res/xml/plugins.xml 2011-07-05 23:21:32 -05:00
Dave Johnson
0b1e760fc1 Add better support for Activity result callbacks from plugins. Add some sugar for calling success / error callbacks from plugins 2011-07-05 14:13:55 -07:00
Dave Johnson
941b64f6a2 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-06-30 13:43:06 -07:00
macdonst
7cc1cc4a3f Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-30 15:43:50 -04:00
Bryce Curtis
c98b758e94 Update version to 0.9.6.1 2011-06-30 13:15:30 -05:00
macdonst
102d37d48a Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-30 11:58:12 -04:00
Bryce Curtis
4b647fc58d Merge pull request #128 from brycecurtis/pages
Update version number and fix issues with prompt().
2011-06-30 08:56:53 -07:00
Bryce Curtis
b7156c6803 Bump up version to 0.9.6 for example. 2011-06-30 10:53:23 -05:00
Bryce Curtis
b8cc36e805 Don't clear activity stack by default. 2011-06-30 10:42:27 -05:00
Bryce Curtis
76b2df208e Add comment 2011-06-29 18:28:29 -05:00
Bryce Curtis
9643314553 Add more control over how url is loaded. 2011-06-29 18:25:49 -05:00
Bryce Curtis
1e3422ae70 Load new urls in new DroidGap activity - not same webview as initial url. 2011-06-29 18:23:20 -05:00
Bryce Curtis
fc1bea4947 Update version to 0.9.6. 2011-06-29 16:43:52 -05:00
macdonst
afb48e52b6 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-29 09:55:31 -04:00
Fil Maj
b5dc62d9ef fix to build script: gotta strip out new lines from read in version string 2011-06-28 15:20:13 -07:00
macdonst
2a786044de Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-28 14:26:50 -04:00
Joe Bowser
f3d7ce8fc3 VERSION: 2011-06-27 16:01:43 -07:00
Bryce Curtis
85dab52cf7 Handle errors when adding a service. 2011-06-27 13:49:24 -05:00
Bryce Curtis
c96c9b00b9 Revert to polling if there are any errors with callback server. This addresses various problems with proxies set by carriers. 2011-06-27 13:48:02 -05:00
Joe Bowser
b059a31787 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-06-27 10:23:16 -07:00
Joe Bowser
8cb71673c2 Changing default target to the highest for maximum compatibility 2011-06-27 10:22:57 -07:00
macdonst
5c8913351c Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-27 12:34:33 -04:00
macdonst
8ef93ff0e5 Issue 123: Fixing problem where name object is not specified 2011-06-28 00:34:11 +08:00
Joe Bowser
042c34192b Trying to merge 2011-06-24 14:09:34 -07:00
macdonst
ac2e92321f Issue #121: Problem with resolveLocalFileSystemURI if file name has spaces 2011-06-24 14:08:46 -07:00
Bryce Curtis
05eacf4792 Always call plugin's onPause/onResume with multitasking flag when these lifecycle events occur in activity. It is up to the plugin to handle as necessary. 2011-06-24 14:08:46 -07:00
Kevin Griffin
435c903baf formatting - sigh 2011-06-24 14:08:46 -07:00
Bryce Curtis
53de070a41 Return true when handling key events, indicating that no further processing is necessary. 2011-06-24 14:08:46 -07:00
Bryce Curtis
54fdcbfd46 Urls with same path and file but different # or ? should compare to same url. 2011-06-24 14:08:46 -07:00
Joe Bowser
44aa0aeb0f Adding SSL dev code 2011-06-24 14:08:46 -07:00
Kevin Griffin
7d53eb8e3e formattage 2011-06-24 14:08:46 -07:00
Joe Bowser
7bc0d624ac Fixing conflict 2011-06-24 14:08:26 -07:00
Kevin Griffin
a5039f021d made the mistake of opening anything in finder 2011-06-24 14:06:21 -07:00
Bryce Curtis
80e66d87a9 Issue 112: PhoneGap.Channel: replace instanceof Function with typeof === 'Function' 2011-06-24 14:06:21 -07:00
Bryce Curtis
d35e8cd44b Fix security vulnerability - make sure any requests to run native code only come from url currently loaded into webview. 2011-06-24 14:06:20 -07:00
Benjamin Weingarten
eb3b1f91d4 Fix bug where isreachable doesn't return correct results for https
(http secure) url protocol.
2011-06-24 14:06:20 -07:00
macdonst
8a1ab69235 Updating Network Connection API to match spec released on June 7th 2011-06-24 14:06:20 -07:00
Bryce Curtis
66f3018767 Set PhoneGap.UsePolling flag based upon result from CallbackServer. 2011-06-24 14:06:20 -07:00
macdonst
ff7de25b62 Issue #106: Typo in LocalFileSystem.prototype._castDate 2011-06-24 14:06:20 -07:00
macdonst
85eb6e4997 Issue #104: Bug in FileUtils.copyDirectory & moveDirectory
Adding better test to see if a directory is being moved/copied into itself.

Copy /sdcard/myDir to /sdcard/myDir-backup is okay but
Copy /sdcard/myDir to /sdcard/myDir/backup should thow an INVALID_MODIFICATION_ERR
2011-06-24 14:06:20 -07:00
macdonst
0280d5dd82 Updating Connection object to conform with recently released spec
- Replacing currentNW and homeNW with networkName.
- Changing Connection constants to strings instead of ints.
- Firing online/offline events on network change.
2011-06-24 14:06:20 -07:00
Nitobi
3c90a9a23c Fixed droidgap update command 2011-06-24 14:06:20 -07:00
macdonst
088c342198 Improve performance of our encoding
Move from using String.replaceAll() to a modified version or URLEncoder.encode().
2011-06-24 14:06:20 -07:00
macdonst
af18a8e1aa Issue #80: Unable to open large json files on android 2.2 + phonegap 0.9.5
I could not get rid of the url encoding and decoding without hampering some users ability to pass non-ascii characters back to JavaScript.  However, I was able to reduce the amount of data being passed from Java to JavaScript by 40% by decoding common characters that occur in JSON and XML.  These characters will survive the round trip just fine and don't need to be encoded.

This is the best solution I could come up with.  You won't be able to read files as large as you could in 0.9.4 but it will get close and it will support non-ascii characters.
2011-06-24 14:06:20 -07:00
Joe Bowser
11a29e11e1 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-06-24 14:02:02 -07:00
macdonst
226e4dddcd Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-24 16:43:31 -04:00
macdonst
08c44f5c5d Issue #121: Problem with resolveLocalFileSystemURI if file name has spaces 2011-06-25 04:41:19 +08:00
macdonst
66dbd9ef8b Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-24 10:56:05 -04:00
Bryce Curtis
1c3ea54dcb Always call plugin's onPause/onResume with multitasking flag when these lifecycle events occur in activity. It is up to the plugin to handle as necessary. 2011-06-23 23:22:48 -05:00
Bryce Curtis
a65638ab59 Merge pull request #118 from m00sey/master
Always fire onPause, onResume and onNewIntent events for Plugins.
2011-06-23 20:51:35 -07:00
macdonst
1a9471a2e0 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-22 14:48:49 -04:00
Kevin Griffin
c15971253f formatting - sigh 2011-06-22 11:05:33 -04:00
Bryce Curtis
a67dfdb75e Return true when handling key events, indicating that no further processing is necessary. 2011-06-21 22:53:45 -05:00
Bryce Curtis
9b52827744 Urls with same path and file but different # or ? should compare to same url. 2011-06-21 22:50:53 -05:00
Fil Maj
c5b268756b Merge pull request #103 from doggerelverse/droidgap_update
Fixed droidgap update command
2011-06-21 17:22:02 -07:00
Joe Bowser
afa85a74b3 Adding SSL dev code 2011-06-21 10:08:42 -07:00
Kevin Griffin
517b5e0db9 formattage 2011-06-21 11:46:54 -04:00
Kevin Griffin
327bda49a0 Sending pause/resume notifcations to plugins regardless of 'keepRunning' state.
Not sure why you wouldn't want to send them

Added a OnNewIntent override for Plugins to use.
2011-06-21 11:32:22 -04:00
Kevin Griffin
c978341d83 made the mistake of opening anything in finder 2011-06-21 11:32:18 -04:00
macdonst
939754e1c9 Merge pull request #110 from Worklight/isReachble_fix
Fix bug where isReachable doesn't return correct results for https
2011-06-20 09:48:55 -07:00
macdonst
5e733ede9f Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-16 09:57:02 -04:00
Bryce Curtis
d1448e9073 Issue 112: PhoneGap.Channel: replace instanceof Function with typeof === 'Function' 2011-06-15 13:01:03 -05:00
macdonst
e5fb0c0e71 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-14 09:59:19 -04:00
Bryce Curtis
33bfb44f67 Fix security vulnerability - make sure any requests to run native code only come from url currently loaded into webview. 2011-06-13 15:16:08 -05:00
Benjamin Weingarten
a89c8bf482 Fix bug where isreachable doesn't return correct results for https
(http secure) url protocol.
2011-06-12 13:50:49 +03:00
macdonst
b46cbfd673 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2011-06-08 15:17:36 -04:00
macdonst
a67aeed571 Updating Network Connection API to match spec released on June 7th 2011-06-09 03:11:39 +08:00
macdonst
fbb6b22de6 Updating Network Connection API to match spec released on June 7th 2011-06-08 15:03:03 -04:00
Bryce Curtis
315b5a59b3 Set PhoneGap.UsePolling flag based upon result from CallbackServer. 2011-06-07 14:18:18 -05:00
macdonst
8da5ad8eca Issue #106: Typo in LocalFileSystem.prototype._castDate 2011-06-07 22:03:58 +08:00
macdonst
740e50ce61 Issue #104: Bug in FileUtils.copyDirectory & moveDirectory
Adding better test to see if a directory is being moved/copied into itself.

Copy /sdcard/myDir to /sdcard/myDir-backup is okay but
Copy /sdcard/myDir to /sdcard/myDir/backup should thow an INVALID_MODIFICATION_ERR
2011-06-07 03:12:55 +08:00
macdonst
3ce0fc4897 Updating Connection object to conform with recently released spec
- Replacing currentNW and homeNW with networkName.
- Changing Connection constants to strings instead of ints.
- Firing online/offline events on network change.
2011-06-07 02:36:01 +08:00
Nitobi
8d1722ad67 Fixed droidgap update command 2011-06-03 10:59:48 -07:00
macdonst
7d41646a35 Improve performance of our encoding
Move from using String.replaceAll() to a modified version or URLEncoder.encode().
2011-06-02 10:31:56 +08:00
macdonst
992ee0bca4 Issue #80: Unable to open large json files on android 2.2 + phonegap 0.9.5
I could not get rid of the url encoding and decoding without hampering some users ability to pass non-ascii characters back to JavaScript.  However, I was able to reduce the amount of data being passed from Java to JavaScript by 40% by decoding common characters that occur in JSON and XML.  These characters will survive the round trip just fine and don't need to be encoded.

This is the best solution I could come up with.  You won't be able to read files as large as you could in 0.9.4 but it will get close and it will support non-ascii characters.
2011-06-01 21:27:27 +08:00
Joe Bowser
d00a9f33cd Merge branch 'master' of github.com:phonegap/phonegap-android into keyboard 2011-05-31 15:41:03 -07:00
Joe Bowser
431c80782e Changing the layout class so it has the screen dimensions to take into account Device Orientation 2011-05-31 15:38:03 -07:00
Bryce Curtis
39ec9c095d Need to unregister for network intent receiver on shutdown to prevent leaks. 2011-05-31 15:13:54 -05:00
Bryce Curtis
10e1808c56 Clean up CallbackServer when about:blank page has loaded. This fixes errors when shutting down. 2011-05-31 15:11:02 -05:00
macdonst
9036eb8fcc Issue #94: feature request: Event for Keyboard show/hide 2011-05-30 15:12:31 -04:00
Fil Maj
4280fdf252 Fix for ticket #58: Certain 1.5/1.6 devices would throw a FileNotFoundException when taking pictures. Patch submitted by Agustin of AVANTIC (thanks!). 2011-05-26 12:42:44 -07:00
macdonst
ca5e141b5b Changing Media class to return seconds
The media commands getCurrentPosition() and getDuration() will now return seconds (float) instead of milliseconds to line up with iOS and the docs.
2011-05-27 01:54:48 +08:00
Dave Johnson
8f7a5decb6 Add DS_Store to gitignore 2011-05-25 17:28:24 -07:00
macdonst
1d79b6617b JavaScript cleanup to pass jsHint
I did my best to clean up the JavaScript so it would pass through jsHint more cleanly.  There still are issues but there are a lot fewer now.  This helped to make the JS code more consistent.
2011-05-21 02:31:24 +08:00
macdonst
6c3eefe6f9 Issue #85: window.openDatabase throws DOM Exception 18 on Android 3.1
Instead of checking the userAgent catch the exception.  If we do get an exception it will setup our version of Droid Db.
2011-05-21 02:13:03 +08:00
macdonst
2177cd0a39 Moving navigator.connection to navigator.device.connection
Android 2.2 introduces the navigation.connection interface but it does not work properly in WebView.  So in order to get the proper connection information we had to implement our own connection interface which is accessible at navigator.network.connection.
2011-05-18 03:26:31 +08:00
macdonst
6618015151 Fixing a number of issues in File API
Issue #82: The RandomAccessFile class in Android's version of Java does not write non-ASCII characters very well.  I've switched to using a FileOutputStream which seems to work just great.  Tested by myself and folks from Egypt and the Netherlands.

Issue #87: Fixed a problem where the file errors were being returned as evt.target.result.code.code.
2011-05-17 22:11:38 +08:00
macdonst
e99f75d59b Issue #85: window.openDatabase throws DOM Exception 18 on Android 3.1
The way were were detecting we were on an Android 3.0 device was not applicable for Android 3.1.  I've made and update so that any Android 3.X device will use our implementation of web sql databases instead of the built in one which thows a security error.
2011-05-16 23:14:24 +08:00
macdonst
ab8cfe01d0 Removing generated code from project
framework/gen/com/phonegap/R.java
2011-05-16 10:37:25 +08:00
macdonst
e84c59d23c Merge pull request #78 from kernelsandirs/master
Added Media.seekTo(int milliseconds);

Merging this code in now and making some notes to enhance the Media class.
2011-05-15 19:32:02 -07:00
macdonst
e81fc239a7 Setting defaults in Media Capture
Some tests of Media Capture were failing as the CaptureAudio/Image/VideoOptions objects did not have defaults set.
2011-05-14 01:10:18 +08:00
Bryce Curtis
839c577243 Need to use EclairClient for 3.x devices too. This fixes the HTML5 geolocation problem on Android 3.x. 2011-05-10 11:44:09 -05:00
macdonst
116169a4c5 Issue #79: FileWriter.seek() is broken in 0.9.5.
The FileEntry.createWriter() method passes in a FileEntry object instead of a File object. As a result the FileWriter.length was not being set properly so when you do a writer.seek(writer.length) it would go to 0, so your next write would overwrite your file.

In order to fix this issue the FileEntry.createWriter() method now makes a call to FileEntry.file() to get the correct file size.  The File object is now passed to the FileWriter constructor.
2011-05-07 00:41:57 +08:00
macdonst
346ed60f0d Android 2.2+ supports W3C Connection API
For Android version 2.2 or better the navigator.connection object already
exists. If this case we should immediately fire the onPhoneGapConnectionReady
event so we don't tie up the 'deviceready' event.
2011-05-06 04:22:38 +08:00
defrex
bde59adc04 Add docs and fixed to pass through the Google Closure Compiler without warnings 2011-05-04 16:00:03 -07:00
kernelsandirs
ffbc010d7b Added Media.seekTo(int milliseconds); 2011-05-04 11:51:26 -07:00
macdonst
bdadbbc339 Implement W3C Network Information API
Adding a new object to navigator called 'connection'.  Users can query the
connection object to find out what type of network, if any, the device is
connected to.  The connection object will be updated each time there is a
connectivity change on the device.
2011-05-04 22:23:16 +08:00
kernelsandirs
b94eedaf07 Added Media.seekTo(int milliseconds); 2011-05-03 21:27:08 -07:00
macdonst
58ecac335b Capture modifications:
Renaming supportedAudioFormats to supportedAudioModes.
Renaming supportedImageFormats to supportedImageModes.
Renaming supportedVideoFormats to supportedVideoModes.
Adding copywrite header to the Capture.java file.
2011-05-03 00:12:19 +08:00
macdonst
fd8bb2f671 Issue 72: Contact.Save: onSuccess callback is called when contact is not saved. 2011-04-29 02:08:25 +08:00
Bryce Curtis
0aacfbdd50 Update version to 0.9.5 2011-04-27 14:10:13 -05:00
macdonst
2cd116e4e7 Issue 60: Contact search unicode problem
Contact search was not working for unicode letters.  The CallbackServer was changed so that it returned url encode strings.  On the JavaScript side the PhoneGap callback handler decodes the returned string.
2011-04-25 22:22:12 +08:00
Bryce Curtis
673a8871df Ticket 136: window.openDatabase() in Android 3.0 throws SECURITY_ERR (most code written by Simon MacDonald - I just tested and checked in)
When you call window.openDatabase() on an Android 3.0 device you get and error something like this:

E/Web Console( 1791): SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

Simon worked with Pat for a bit and they think this is a WebKit or Android/WebKit interaction bug. In the meantime this fix determines if you are on Android 3.0 and uses Droid_DB if so.
2011-04-19 16:54:16 -05:00
Fil Maj
44945f9d5e Partial resolution for ticket 57: some issues with camera functionality not firing callbacks properly. 2011-04-18 18:12:01 -07:00
Roman
887f754014 Hidden NPE fixed, which appeared when someone pass null as arguments
(for such SQL as e.g. CREATE TABLE).

It is especially important when work with dome 3d party persistemce
libraries, like e.g. http://github.com/zefhemel/persistencejs which
passes these nulls.
2011-04-18 17:02:55 -07:00
macdonst
674015460f Fixing file commands so that they run async 2011-04-13 03:13:10 +08:00
macdonst
40084293c3 Ticket 127: Android FileReader/FileWriter methods should return FileError object on error. 2011-04-07 07:17:41 +08:00
Fil Maj
ed4c57e791 Woops, finger slipped. 2011-04-06 11:01:36 -07:00
Fil Maj
bf164f4161 Fix for ticket 121: Checking for null return on native openDatabase call not enough as only allowed one DB per PhoneGap app. Have to proxy openDatabase and check at runtime. 2011-04-06 10:50:24 -07:00
Bryce Curtis
626119ae3b Bug 126: NullPointerException in onDestroy() 2011-04-05 15:42:25 -05:00
Ron Reiter
307f9d1871 Add maxResolution flag 2011-04-04 02:57:10 +03:00
macdonst
e766188689 W3C Media Capture API
An implementation of the W3C Media Capture spec:
http://dev.w3.org/2009/dap/camera/Overview-API

Capture operations are supported for audio, video, and images.  Each
capture operation launches the native audio recorder, video recorder,
or camera application, respectively.
2011-04-01 15:52:53 -04:00
macdonst
d74569ffa7 Read As Text missing load event call
FileReader.readAsText didn't call the onload callback on success.
2011-04-01 23:04:14 +08:00
macdonst
d424af03e4 Ticket 124: File Transfer multipart badly formed trips mod_security
A standard from has no trailing whitespace after a content-disposition line like so: "Content-Disposition: form-data; name="data";" however when using the extra params of Android FileTransfer a space is added on the end "Content-Disposition: form-data; name="data"; "

This fix simply removes the trailing whitespace.
2011-04-01 22:43:38 +08:00
Bryce Curtis
f6f80537c3 Merge branch 'master' of https://github.com/jos3000/phonegap-android into jos3000-master 2011-03-30 13:48:51 -05:00
Bryce Curtis
908485751b Add check to only init and run JS code once - even if included multiple times. 2011-03-30 13:29:24 -05:00
macdonst
b850d225f4 Support old way of adding service in PhoneGap 0.9.5
PhoneGap 0.9.4 replaced PluginManager.addService() with navigator.app.addService().  This is problematic with the older plugin as they are not being maintained.  I'm adding in a PluginManger JavaScript class which will implement the addService method and call navigator.app.addService() method under the hood.  This way we won't break old code.
2011-03-30 21:04:03 +08:00
Jos Shepherd
010c774988 Added native prompt() dialog support 2011-03-25 16:31:27 +00:00
macdonst
969f0c87d7 PhoneGap Android Ticket 113:
FileTransfer returns FILE_NOT_FOUND_ERR on http 500 error

For some reason on Android if you do a getInputStream() on a HTTP Connection and the server returns a 500 error it will report a FileNotFoundException.  Catching this exception and throwing an IOException so that we can report a more accurate error in JavaScript.
2011-03-24 23:31:12 +08:00
Fil Maj
b3e9794189 Fix for lighthouse ticket 115: certain versions of Android 2.2 return "null" for window.openDatabase. Hook in PhoneGap fallback for storage in this case. 2011-03-23 11:07:45 -07:00
Bryce Curtis
935295c9b8 Bug 110 - When you close an app on Android you see a JS error in logcat. 2011-03-18 17:27:36 -05:00
Anis Kadri
648df2624f Merge github.com:phonegap/phonegap-android 2011-03-15 16:27:11 -07:00
Fil Maj
04de2052fd As best a fix as can be made for issue 95: on HTC devices, if text input is in bottom half of page, it does not get scrolled up to top half of page when you tap it and virtual keyboard comes up. 2011-03-15 12:46:05 -07:00
Fil Maj
60eb60b4f5 Merge branch 'master' of github.com:phonegap/phonegap-android 2011-03-14 16:15:28 -07:00
Fil Maj
ec307fdda8 Null check in droidgap classic (build script). 2011-03-14 16:15:19 -07:00
Bryce Curtis
7344964c05 Add support for setting sms body using uri "sms:#?body=text". 2011-03-13 22:36:09 -05:00
Anis Kadri
1e4dc1bf5d Merge github.com:phonegap/phonegap-android
Conflicts:
	framework/assets/www/phonegap.js
	framework/src/com/phonegap/DroidGap.java
2011-03-13 15:07:23 -07:00
macdonst
1fc56921aa Ticket #90: Move _createEvent from File to PhoneGap
Got rid of _createEvent from file.js as it is redundant code.
2011-03-10 04:26:11 +08:00
Bryce Curtis
21a34a8980 Ticket 106 - Simplify splash screen logic based upon idea from vadim. 2011-03-08 22:00:33 -06:00
Fil Maj
8d73b364f2 Issue 107: always send resume event to JS. 2011-03-07 16:50:10 -08:00
Fil Maj
fb2c25c6c6 Issue 107: Always send pause event to JS. 2011-03-07 16:48:23 -08:00
Mark Darbyshire
47ca081f36 Implement localStorage.key() and localStorage.length
This brings PhoneGap's implementation in line with the spec at http://dev.w3.org/html5/webstorage/
It makes the following demo work when you include PhoneGap: http://people.w3.org/mike/localstorage.html
I was hopeful it would make my app, which makes use of LawnChair, work, but I've had no such luck as of yet.
2011-03-07 15:55:14 -08:00
Fil Maj
939b70243d Use icon with no width/height if specified. Set default icon to highest-resolution icon when possible. 2011-03-07 13:27:52 -08:00
Fil Maj
d44bb7a9d8 Fix so that if not all icons are specified, doesnt error the build out. 2011-03-07 13:27:52 -08:00
Fil Maj
dccc29daf2 Syntax fixes to my ruby :P 2011-03-07 13:27:52 -08:00
Fil Maj
b402efd1f7 First pass at extracting icon width/height info and assigning to proper resolution dirs (i.e. ldpi, mdpi, hdpi) during build. 2011-03-07 13:27:52 -08:00
macdonst
0c3a8fb9f7 File API: System and Directories
http://www.w3.org/TR/file-system-api/

User can retrieve PERSISTENT and TEMPORARY file systems, list their
contents, and manipulate files and directories within them.

Modify existing FileWriter implementation
-----------------------------------------

  - Change the way user creates a FileWriter.  User must either pass a
    File object to the FileWriter constructor, or use the
    FileEntry.createWriter() method.

  - Drop support for the 'filePath' and 'append' parameters in the
    FileWriter constructor.  The file path is determined from either the
    File object passed to the FileWriter constructor, or the FileEntry
    object used to create the FileWriter.  To append to a file, use the
    FileWriter object's seek method:

    // writer is a FileWriter object
    // seek to length of file to append
    writer.seek(writer.length);

Replace FileMgr JavaScript APIs not specified in any File API spec
------------------------------------------------------------------

  - Remove navigator.fileMgr.createDirectory(dirName) function.  To
    create a directory, use the DirectoryEntry.getDirectory() method,
    which is part of the File API: Directories and System spec.  Set
    the Flags.create to 'true':

    // directory is a DirectoryEntry object
    directory.getDirectory(path, {create:true}, successCB, failCB);

  - Remove navigator.fileMgr.getRootPaths() function.  To retrieve the
    root file systems, use the window.requestFileSystem() function,
    which is part of the File API: Directories and System spec.

  - Remove navigator.fileMgr.getFileProperties(fileName) function.  To
    get the properties of a file, use the FileEntry.file() method, which
    is part of the File API: Directories and System spec.

  - Remove navigator.fileMgr.deleteFile(fileName) function.  To delete a
    file, use the Entry.remove() method, which is part of the File API:
    Directories and System spec.

  - Remove navigator.fileMgr.deleteDirectory(dirName) function.  To
    delete a directory, use the Entry.remove() (if it is empty), or
    DirectoryEntry.removeRecursively() methods, which are part of the
    File API: Directories and System spec.

Clean up existing FileManager native code.  Move some functionality to
file utility class.
2011-03-05 04:26:31 +08:00
paulb777
64d4337d5f Update index.html to Add networking to example 2011-02-28 23:49:14 +08:00
paulb777
a9e1751812 Add networking to example and fix contacts 2011-02-28 23:46:26 +08:00
Bryce Curtis
2bc7bd6768 Worked around JavaScript bridge exception for Android 2.3. Use "prompt" instead of calling objects directly. There were several objects called from JavaScript, including BrowserKey, so key events had to be reworked. 2011-02-27 20:07:24 -06:00
Fil Maj
1711fb07d7 Small patch to build script: ruby needs double quotes to interpolate variables into it properly. 2011-02-16 16:26:01 -08:00
paulb777
6f4673f590 JSLint clean JavaScript sources. No fatal errors remain. Options can turn off rest of warnings 2011-02-15 16:10:09 -08:00
Vadim Voituk
5e858f8bc3 Added CupcakeLocalStorage.clear() method (in according to http://dev.w3.org/html5/webstorage/#the-storage-interface) 2011-02-04 12:08:22 -08:00
Fil Maj
691b093ccd Upped script version in assets. 2011-02-04 11:55:20 -08:00
Fil Maj
99002f9dce Fix for build: version needs to be included in .jar and .js generated files. 2011-02-04 11:35:05 -08:00
Fil Maj
b07072c12b Fix for ticket 86 (build fail if phonegap-android dir is located under a dir with "lib" in it). Also bug fix in build if config.xml didnt contain an <icon> element. 2011-02-04 11:20:22 -08:00
Bryce Curtis
36dd964ba4 Logging status from wrong object. 2011-02-03 21:11:06 -06:00
macdonst
f848527c28 Upping version to 0.9.4 2011-02-03 09:48:31 +08:00
Bryce Curtis
6aa055f46e Change super.setProperty() to use super.set<type>Property() in example comments. 2011-02-02 14:37:09 -06:00
macdonst
7952668cf7 Throwing error on FileWriter.abort() if writer is not in the correct state. Lining up with iPhone and BlackBerry 2011-02-03 02:26:49 +08:00
macdonst
a0c761664d Call onwriteend not onloadend in FileWriter.abort() 2011-02-03 02:08:41 +08:00
macdonst
9fd9cf55cf Adding version number to phonegap jar/js files 2011-02-03 01:51:59 +08:00
macdonst
3c9089b9c7 Enable hardware volume control buttons in DroidGap applications 2011-02-02 23:33:01 +08:00
Bryce Curtis
f220489543 Disable picture listener once event has occurred. 2011-02-01 11:25:01 -06:00
Bryce Curtis
b65f9517db Merge branch 'filmaj-splashscreenfix' 2011-02-01 11:00:02 -06:00
Bryce Curtis
1a0de5f626 Merge branch 'splashscreenfix' of https://github.com/filmaj/phonegap-android into filmaj-splashscreenfix 2011-02-01 10:46:38 -06:00
Fil Maj
3c0bef6cc1 Ticket 81: Tweak to label of local path to index.html in example app, now properly shows actual project-relative path. 2011-01-31 17:51:15 -08:00
Fil Maj
040194157f Ticket 80: running "droidgap gen example" leads to recursive directory creation. README fix included. 2011-01-31 17:48:56 -08:00
macdonst
7ebf8130e4 Set type to url for returned photos 2011-01-29 04:19:06 +08:00
macdonst
64310dc85c Fixing clone issue adding photos, removing relationships 2011-01-27 05:59:22 +08:00
macdonst
cd2e86af2f Removing excess logging in contact.save() 2011-01-27 03:44:27 +08:00
macdonst
b353f3608d Updating to latest W3C spec 2011-01-27 03:41:27 +08:00
macdonst
cda154209d Fixing merge issue 2011-01-26 11:22:08 -05:00
Sveinung Kval Bakken
e3c72fa915 Will now use a "smarter" approach to finding an account for Contact.save, the order of account search will be:
1. Exchange provider
2. Google
3. Any valid email address account
2011-01-25 11:36:08 +01:00
Fil Maj
9354b429f3 Fix for ticket #55: if phonegap source was on a path with "bin" in it would cause major fail. 2011-01-24 15:51:26 -08:00
Fil Maj
b1f0c037bd Getting rid of black screen between native loading screen and actual PhoneGap app. 2011-01-24 12:43:28 -08:00
macdonst
726f1094d9 Fixing bug found by tiny hippos 2011-01-25 03:05:59 +08:00
macdonst
1b8ab156df Adding http: and file: support when saving a contact photo. 2011-01-25 01:58:31 +08:00
macdonst
ee01b5058f Adding support to set a Contact photo 2011-01-22 01:52:20 +08:00
macdonst
03ea8a0b5a Enable the return of photos in a Contact object 2011-01-20 04:27:40 +08:00
macdonst
f090f9a70c Merge branch 'master' of https://github.com/filmaj/phonegap-android into filmaj 2011-01-17 11:54:52 -05:00
Bryce Curtis
b7abc2c344 Skip over beginning / in request when comparing to token. 2011-01-16 15:15:24 -06:00
Fil Maj
53bdf2dd6b Fix for specifying icon in config.xml; the @icon attribute would get overriden by defaults when going from create => classic::build. 2011-01-15 23:12:07 -08:00
Joe Bowser
b9e1b1d280 Adding Blank HTML page 2011-01-13 16:27:54 -08:00
Bryce Curtis
9051b157f8 Ticket 63: Android CallbackServer crashes on external attacks. 2011-01-13 14:45:15 -06:00
macdonst
f16d9b01b7 Fixing geo listner callback fail to send 3 args instead of 4. 2011-01-14 02:07:47 +08:00
macdonst
2a9bc2ddf8 Fixing issue where Android 2.1 and 2.2 don't return the same results on contact.find() 2011-01-14 02:02:21 +08:00
macdonst
6e39c46b07 Middle name for contact being updated incorrectly 2011-01-12 21:58:20 +08:00
macdonst
567ca94245 Adding debug mode so FileTransfer will accept self signed SSL certificates 2011-01-12 10:32:26 +08:00
macdonst
812a4b32b4 Adding file key properly 2011-01-07 23:17:05 +08:00
Bryce Curtis
023df10f31 Allow features/modules to initialize code before deviceready fires. CupcakeLocalStorage uses this capability to delay deviceready until local storage has been read and inited. 2011-01-06 22:50:13 -06:00
macdonst
8d513e2765 Remaining FileUploader to FileTransfer 2011-01-07 01:43:12 +08:00
Bryce Curtis
1eae6786c4 Better memory management when taking pictures. 2011-01-06 11:12:14 -06:00
macdonst
73f278963b Adding File Upload functionality 2011-01-06 07:09:07 +08:00
macdonst
54eff557d9 Guard against null request in Android 1.5/1.6 2011-01-06 04:08:23 +08:00
Bryce Curtis
a7415bcfc9 Support all URIs by passing them to their default activity. This works for market:// and content://. 2011-01-04 13:22:25 -06:00
macdonst
b6bd9ad5b8 Support Market Uri 2011-01-05 03:03:38 +08:00
macdonst
f71d9deb5e Fixing mimetypes for content:// Uri's. 2011-01-05 02:45:04 +08:00
macdonst
115b428a9d Fixing issue where Date's aren't cloned 2010-12-30 00:53:06 +08:00
macdonst
92a1e4a2d9 Remove destroyed AudioPlayer from list of AudioPlayers 2010-12-23 02:51:39 +08:00
macdonst
2504db13d7 Adding release method to Media object 2010-12-23 02:44:52 +08:00
macdonst
43c72e684c Setting content type properly in readAsDataURL 2010-12-23 00:26:38 +08:00
stevengill
46f0bf60c4 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-12-16 13:29:52 -08:00
macdonst
8bad4eb7eb Fixing issue where Camera returned a content URI that File Reader could not read 2010-12-17 05:08:45 +08:00
paulb777
fbe96f891b 1. Split out js to main.js 2. Show a contact 3. Toggle accelerometer 4. More device info 5. Enable scrolling 2010-12-15 11:24:01 -08:00
Bryce Curtis
ab8950a5af Re-enable multitasking in onResume Java callback so that onResume JS handlers are called - it was being re-enabled too soon. 2010-12-09 14:13:23 -06:00
Bryce Curtis
26adfb6346 If multitasking is turned on (keepRunning=true), then temporarily disable it when starting a new activity that returns a result - such as camera. 2010-12-06 16:48:06 -06:00
Bryce Curtis
43b6b6d34e Update version number to 0.9.3 in preparation for next release. 2010-12-03 18:15:00 -06:00
Bryce Curtis
04ddc68dfd Fix bug with saving name in new contact. 2010-12-03 14:14:37 -06:00
Bryce Curtis
42cd10cf56 Need license header since it is removed by minification. 2010-12-01 16:13:22 -06:00
Bryce Curtis
5f3bc33f8e Update comments. 2010-12-01 11:21:49 -06:00
Bryce Curtis
2131070ee9 Add JavaScript minification using YUICompressor. 2010-11-30 19:00:30 -06:00
Bryce Curtis
b2a82975e5 Merge branch 'jos3000-master' 2010-11-29 12:30:49 -06:00
Bryce Curtis
ddeba91faf Merge branch 'master' of https://github.com/jos3000/phonegap-android into jos3000-master 2010-11-29 12:27:00 -06:00
macdonst
6e572f05e4 Put trailing / into getRootPaths() to remain consistent with BBW 2010-11-26 00:45:02 +08:00
macdonst
50b435c4d1 Following File API spec. 2010-11-25 03:11:43 +08:00
Bryce Curtis
af5c5dc021 Update splash screen example and list of properties that can be set in commented code. 2010-11-23 09:53:43 -06:00
Bryce Curtis
87fd9665fe Merge branch 'localStorage' of https://github.com/ascorbic/phonegap-android into ascorbic-localStorage 2010-11-21 17:58:49 -06:00
Bryce Curtis
5e9ca84b40 Expose certain methods from DroidGap to JavaScript so that a PhoneGap web app can better control program configuration and flow. 2010-11-21 17:33:13 -06:00
Bryce Curtis
090ad56d0b Don't need special method to load a splash screen. Instead, the regular loadUrl() and clearHistory() can be used. 2010-11-21 16:47:35 -06:00
Bryce Curtis
e3ebfea064 Improve handling of timeout error when loading URL, and enable WebViewClient to be overridden by app, so developer can intercept webview events. 2010-11-21 16:42:00 -06:00
Bryce Curtis
44761f87d2 Remove comment for unused parameter. 2010-11-21 16:31:49 -06:00
Bryce Curtis
04e3ceac96 Define window.plugins object so plugins can check to see if they have already been created. 2010-11-21 16:30:46 -06:00
Bryce Curtis
afc7e605ff Fix bug when not doing cast - temp isn't defined. 2010-11-20 21:23:15 -06:00
macdonst
1c5aa6cd00 Adding a cast for contacts.find() 2010-11-20 01:42:52 +08:00
macdonst
c1a87ebaaa Adding and optional call to cast Plugin Result 2010-11-20 01:42:43 +08:00
macdonst
46babe7a48 Calling correct events from FileWriter.abort() 2010-11-17 15:30:08 -05:00
Bryce Curtis
0dc64d2aa7 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-11-16 18:15:15 -06:00
Bryce Curtis
1d9e522bd9 Fix quality issue with base64 encoded images. Quality parameter wasn't being set. 2010-11-16 18:14:24 -06:00
macdonst
5dcac6d7fe Fixing issue in File Reader/Writer when newlines in file 2010-11-16 13:30:18 -05:00
macdonst
07418a3606 Small fix to File API 2010-11-17 00:06:49 +08:00
Bryce Curtis
0e08af98ca Better way to handle splash screen when back button pressed. 2010-11-15 16:32:55 -06:00
Bryce Curtis
b8b1ad8421 Add property that lets a PhoneGap app continue to run when another Android app or activity is started. 2010-11-14 17:33:06 -06:00
Bryce Curtis
4fa1f40b44 Add load URL capability, and enable an HTML file to be used as a splash screen. 2010-11-12 22:38:27 -06:00
macdonst
5f55ebf1d9 Adding Contact.save() for Android 1.X and Android 2.X 2010-11-13 05:34:44 +08:00
Bryce Curtis
9798de7efa Remove unused and unneeded getPort() method. 2010-11-12 12:53:34 -06:00
Bryce Curtis
102745875c Allow user to set the loading dialog message. Change default from show to not shown. 2010-11-11 22:24:20 -06:00
Bryce Curtis
dce0d93df8 Replace deprecated debug.log with console.log. 2010-11-11 22:03:12 -06:00
Bryce Curtis
1428ac5ed5 Add error checking for PhoneGap.addPlugin(). 2010-11-11 21:58:07 -06:00
Bryce Curtis
4f1bc1401f Add delay so splash screen can be shown for a specific amount of time. 2010-11-11 21:56:56 -06:00
Bryce Curtis
28ff6e1150 Merged code for bryfox: Re-add support for search & menu key triggers.
See original commit: 799515fa7b
2010-11-11 16:20:32 -06:00
Bryce Curtis
5ffe5fa3c5 Merged code for imhotep: Cleaner way for handling splashscreens.
See original commit: 1761cbb3dc
2010-11-11 15:59:35 -06:00
Bryce Curtis
49341356d7 Add comments to onKeyDown() method. 2010-11-11 14:08:55 -06:00
Bryce Curtis
e8b85f6cf7 Fix formatting and rearrange method order. 2010-11-11 14:00:56 -06:00
Bryce Curtis
4b2398b487 Add properties to DroidGap that can be set when the intent/activity is called. This enables the developer to show app loading dialog, splashscreen, or set other properties. 2010-11-11 11:34:12 -06:00
Bryce Curtis
10f3313ed5 Use polling if PhoneGap app is loaded from server, since XHR doesn't work to localhost due to cross-domain security policy. 2010-11-10 14:19:17 -06:00
Matt Kane
46664c6494 Remove dependency on JSON support 2010-11-10 08:44:33 +00:00
Matt Kane
8ce7e61ed7 Adds localStorage support to older versions 2010-11-10 08:34:59 +00:00
Matt Kane
912458c679 Fix order of args to match w3c spec. 2010-11-09 22:58:13 +08:00
macdonst
e117b95057 Fixing issue with addEventListener and Sencha 2010-11-09 21:48:48 +08:00
Jos Shepherd
3a0101261d Move data transfer for storage to completeQuery for speed up 2010-11-06 20:01:22 +00:00
Bryce Curtis
48d3bc09f3 Add method for dynamic loading of a JavaScript file. 2010-11-05 16:00:58 -05:00
Bryce Curtis
0b3e27b3fa Load url into DroidGap if it was passed in to intent. 2010-11-05 14:50:48 -05:00
Bryce Curtis
b66535a17d Introduce PhonegapActivity class to separate plugin development from base Phonegap. 2010-11-06 03:10:28 +08:00
Jos Shepherd
fdc78e1b08 Fix for troublesome values being returned from DroidDB stores. Stick to one level of JSON serialization. 2010-11-05 17:03:05 +00:00
Bryce Curtis
36064c564e Reduce timeout from 30 sec to 10 sec for CallbackServer. Some devices have shorter timeouts than others for XHR. 2010-11-04 13:07:15 -05:00
Bryce Curtis
7102810283 Fix problem with CallbackServer for certain HTC phones. 2010-11-03 22:45:14 -05:00
Bryce Curtis
ab4d4e22da Include the device's name in Device.name per API docs. 2010-11-03 10:23:12 -05:00
Bryce Curtis
80c15de606 Return error conditions from CallbackServer instead of just closing connection. 2010-11-01 13:59:08 -05:00
Matt Kane
be5cac6d0b This is being called from java code, but callback didn't exist 2010-11-01 05:58:24 +08:00
Matt Kane
2bb67ee4b0 Change use "geo:" instead of WebView.SCHEME_GEO
The constant is "geo:0,0?q=", which means it doesn't match urls that specify the coordinates. The gmap app can handle these though, so we can pass any geo: url to it.
2010-11-01 05:50:55 +08:00
Bryce Curtis
f7254044ee Require security token when calling CallbackServer via XHR. 2010-10-29 22:07:23 +08:00
macdonst
2e5d6f5b74 Adding truncate to FileWriter 2010-10-28 22:17:20 -04:00
macdonst
b7024ad1f5 Small FileWriter fix 2010-10-29 08:46:37 +08:00
Bryce Curtis
577284b960 Remove unneeded debug log statements. 2010-10-28 16:28:24 -05:00
Joe Bowser
35b3808701 Fixing typo 2010-10-27 15:00:35 -07:00
Joe Bowser
45c9a88fd7 Merge branch 'master' of git@github.com:phonegap/phonegap-android 2010-10-27 14:53:32 -07:00
Bryce Curtis
831670e4ae Modify camera to use NO_RESULT, thus eliminating extra JS callback methods. 2010-10-27 21:33:50 +08:00
Bryce Curtis
37a9307681 Enable JS callbacks to be kept around for multiple callbacks from Java. 2010-10-27 21:33:49 +08:00
Joe Bowser
34f6e878d5 Merge branch 'master' of git@github.com:phonegap/phonegap-android 2010-10-26 16:23:37 -07:00
Bryce Curtis
bc1e039ea1 Use polling instead of XHR for callbacks from Java to JavaScript when device has a proxy set. 2010-10-26 15:09:54 -05:00
Joe Bowser
8c624c7f22 Adding a console.log statement to debug errors in callback 2010-10-25 15:01:17 -07:00
Bryce Curtis
f63b8140af Add quotes when returning status message. 2010-10-25 14:59:23 -05:00
Bryce Curtis
153d42f693 Alert and notification dialogs should be run on UI thread. 2010-10-25 14:35:02 -05:00
Bryce Curtis
5647e54399 Add PluginResult status values to handle RESULT_TO_BE_SENT, NEXT_RESULT, NO_MORE_RESULTS . 2010-10-25 14:33:48 -05:00
Bryce Curtis
8663ed412f Made notification.alert and notification.confirm async.
notification.confirm matches iOS and BB widget implementation (invoke callback with result).
2010-10-25 11:20:41 -05:00
Anis Kadri
1761cbb3dc cleaner way for handling splashscreens 2010-10-22 12:07:02 -07:00
Bryce Curtis
072613be99 Rename PhoneGap.execAsync() to PhoneGap.exec(). 2010-10-22 13:08:54 -05:00
Bryce Curtis
6b7fc8119f Rename PhoneGap.execAsync() to PhoneGap.exec() and change all JS files that use it. 2010-10-20 23:53:33 -05:00
Bryce Curtis
29549b835a Add error checking around user callbacks. 2010-10-18 16:04:39 -05:00
Bryce Curtis
60fc61065e Fix variable change error. 2010-10-18 16:02:42 -05:00
Bryce Curtis
de23753204 Update license and copyright notices in each source file. PhoneGap is licensed under modified BSD and MIT (2008). 2010-10-18 15:31:16 -05:00
macdonst
9cd4d4c603 Adding comments to Contact code 2010-10-19 04:06:49 +08:00
macdonst
bc086cb93d Setting ContactFindOptions to correct defaults 2010-10-19 00:30:00 +08:00
brianleroux
f15bdf9445 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-10-14 17:04:19 -07:00
brianleroux
9358e23726 Merge branch 'commandline' of github.com:davejohnson/phonegap-android 2010-10-14 17:02:45 -07:00
Bryce Curtis
6d605c1cbf Set prepareListener before calling prepare. 2010-10-14 09:58:37 -05:00
Bryce Curtis
be16eebf55 Remove logging from storage.js. 2010-10-13 13:47:43 -05:00
Bryce Curtis
1f3bd9f51c Add support for multiple executeSql statements in transaction that returns results.
If a transaction had more than one "SELECT * FROM TABLE" statement, then only one of the executeSql callbacks would be called.  The others would not be called, even though they were successful.  This is because a transaction object had only one result set.  Changed code so that each executeSql has a result set and unique "query id" so that the query results can be sent back to the correct statement's callback.
2010-10-13 13:43:52 -05:00
Jos Shepherd
5bdc81e84d Fix to new Android 1.6 storage code - callback wasn't being called for empty result sets. 2010-10-13 22:12:36 +08:00
Dave Johnson
08963b5e5f Add IPlugin to isPhoneGapPlugin check 2010-10-12 23:36:08 +01:00
Dave Johnson
522a7225db Change PluginManager.isPhoneGapPlugin() to be much shorter like on the BlackBerry 2010-10-12 23:18:11 +01:00
Bryce Curtis
032db387f8 Fix database for Android 1.x devices. It now behaves like HTML5 database API. 2010-10-12 15:53:57 -05:00
davejohnson
5164464d28 Change droidgap create to not use 'grep' and have better error messages 2010-10-13 01:30:00 +08:00
davejohnson
a66ef4641f Change droidgap create to not use 'grep' and have better error messages 2010-10-11 05:30:54 -07:00
macdonst
3fd372f9d1 Remove logs 2010-10-09 02:58:14 +08:00
macdonst
b125f4e74b Fixing if/else condition 2010-10-09 02:58:04 +08:00
macdonst
3a9c106aba Small changes for older Android SDK 2010-10-09 02:43:27 +08:00
brianleroux
a31ce5ef2a Merge branch 'master' of github.com:phonegap/phonegap-android 2010-10-08 11:40:09 -07:00
brianleroux
bf3b38036b tiny fix to droidgap gen for windows 2010-10-08 11:39:56 -07:00
macdonst
34859ec479 Reduced everything to single database query 2010-10-08 23:44:07 +08:00
macdonst
4a6105de6b Do one table query per contact 2010-10-08 23:43:23 +08:00
Bryce Curtis
50ab0e0834 Add confirm, start/stopActivity, start/stopProgress to notification service. Add "application loading" spinner that user can optionally show when app is starting. 2010-10-08 09:18:10 -05:00
macdonst
72b2ec804c Removing unused functions 2010-10-07 06:17:24 +08:00
brianleroux
086e6ea56b Merge branch 'master' of github.com:phonegap/phonegap-android 2010-10-06 11:51:59 -07:00
brianleroux
122395e0d0 small tweaks to the build script 2010-10-06 11:51:42 -07:00
Bryce Curtis
98206852de Update alert() to implement navigator.notification.alert API. This update is from janmonschke (Jan Monschke). 2010-10-06 13:31:30 -05:00
Bryce Curtis
dc960b9835 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-10-06 13:01:13 -05:00
Bryce Curtis
9adb85a64b Add callbackId to Plugin.execute() so result can be sent back when overlapping calls to same plugin occur. 2010-10-06 12:56:34 -05:00
Bryce Curtis
23b02e7267 Change initialization of Storage for 1.x devices to use service call. 2010-10-06 12:56:34 -05:00
Bryce Curtis
e3cef16629 Remove getClassForService() and make addPlugin() private. 2010-10-06 12:56:34 -05:00
Dave Johnson
5a2398dbea Add call to setCallbackdId in addPlugin 2010-10-06 12:56:34 -05:00
Dave Johnson
f1421bc724 Add callbackId and JS callback sugar to plugin class and interface 2010-10-06 12:56:34 -05:00
Dave Johnson
7d6ffc676d Update PluginManager to not call Class.forName twice 2010-10-06 12:56:34 -05:00
Bryce Curtis
385be26046 Check plugin against new Plugin and IPlugin to determine if valid plugin class. 2010-10-06 12:56:34 -05:00
Bryce Curtis
68146329b9 Add IPlugin interface and change Plugin to be abstract class. Plugins can either implement IPlugin or extend Plugin. 2010-10-06 12:56:34 -05:00
brianleroux
1231268a6b updated readme to reflect change to droidgap 2010-10-06 10:56:23 -07:00
brianleroux
cbff3812e8 made gen create a fullout android proj 2010-10-06 10:54:18 -07:00
brianleroux
f8ae11993f Merge branch 'master' of github.com:phonegap/phonegap-android 2010-10-06 10:53:25 -07:00
macdonst
3138178fea Speeding up contacts.find 2010-10-07 00:45:07 +08:00
macdonst
f20e5cf943 Shave .2 sec off each contact returned in a query 2010-10-06 02:24:31 +08:00
macdonst
a1b35b7636 Remove logging 2010-10-06 00:24:33 +08:00
macdonst
8eaaa04746 Small fix to speed up contact retrieval 2010-10-06 00:19:58 +08:00
macdonst
2bbf62c489 Fixing Contacts.find to use PluginResult 2010-10-04 09:50:48 +08:00
macdonst
c80397ad68 Fix duplicate method name 2010-10-02 05:11:06 +08:00
macdonst
c91ea37438 Adding Contacts.create method 2010-10-02 05:10:42 +08:00
macdonst
9671083bed Removing logging messages 2010-10-01 11:29:24 +08:00
macdonst
6071b9c75a Adding Contact.remove method 2010-10-01 11:22:20 +08:00
Justin Tyberg
668bc9e0ca Corrected check for existence of accelerometer timer to allow clearWatch to clearInterval correctly. 2010-10-01 10:34:39 +08:00
macdonst
297ddb99fe Adding clone functionality to Contact object 2010-10-01 00:01:30 +08:00
brianleroux
cbd5686e7d merge of latest phonegap/android bs 2010-09-30 13:39:10 +02:00
Bryce Curtis
a772acbd89 Update lastAccessTime when calling getAcceleration() so we don't timeout. 2010-09-29 20:52:39 -05:00
macdonst
c2240966ef Removing extra log calls 2010-09-30 05:46:32 +08:00
macdonst
36984f4697 Merge remote branch 'macdonst-contactSpec/contactSpec' 2010-09-29 17:13:58 -04:00
macdonst
ac92498594 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2010-09-29 16:31:34 -04:00
macdonst
7bfe94ffc7 Removing commented out code 2010-09-29 15:35:57 -04:00
Bryce Curtis
f85f4e6b69 Update notification service to implement plugin class. 2010-09-29 11:10:08 -05:00
macdonst
c13c0c37e3 Only query what is required as passed by filter 2010-09-28 14:19:40 -04:00
macdonst
2098436a2c Fixing query so that it uses wildcards 2010-09-24 16:15:16 -04:00
macdonst
a427b8cead Merge branch 'master' into contactSpec 2010-09-24 13:27:53 -04:00
macdonst
bcf920669b Merge branch 'master' of git://github.com/phonegap/phonegap-android
Conflicts:
	framework/src/com/phonegap/ContactManager.java
2010-09-24 13:22:46 -04:00
macdonst
a9f057c278 Cleaning up some accessor code 2010-09-24 11:43:10 -04:00
macdonst
4e4207f294 Merge branch 'master' of git://github.com/phonegap/phonegap-android into contactSpec 2010-09-24 11:42:08 -04:00
brianleroux
c86f7d053c Merge branch 'master' of github.com:phonegap/phonegap-android into test 2010-09-24 14:12:24 +02:00
Bryce Curtis
7f7cc1db2a Add geolocation options as defined by W3C spec. 2010-09-23 14:34:56 -05:00
Bryce Curtis
edfa41c9f9 Update geolocation to follow W3C spec, add comments, add error checking. 2010-09-22 14:47:52 -05:00
macdonst
1768b507f8 Cleaning up logs from ContactAccessors 2010-09-22 11:37:12 -04:00
brianleroux
36949f4af1 tiny fix for config file containing spaces in name 2010-09-22 16:13:25 +02:00
macdonst
328bc106e5 Able to query contact DB on Android 1.6 2010-09-21 22:08:45 -04:00
Bryce Curtis
063e189bb7 Change isReachable() to return NetworkStatus constant to reachableCallback(reachability) as specified in the API documentation. 2010-09-20 22:25:57 -05:00
Bryce Curtis
1a9173d2c3 Added comments. 2010-09-20 21:09:35 -05:00
macdonst
fdca4c5ecb First pass as pre 2.0 Android contacts 2010-09-20 21:38:29 -04:00
Bryce Curtis
b079a24373 Need to listen for XHR callbacks before constructors are run, since constructors could call native code that returns data in callback. 2010-09-20 15:48:37 -05:00
Bryce Curtis
ace84227cc Fix problem with deviceready being called before device properties are guaranteed to be set. 2010-09-20 15:39:54 -05:00
macdonst
f68b75c1cf Small refactor on birthday and anniversary 2010-09-20 15:51:12 -04:00
macdonst
f272748c5b Adding queries for IM, Note, Nickname, Website, Relationship, Birthday and Anniversary 2010-09-20 14:52:02 -04:00
Bryce Curtis
a59cad68e2 Device returns string, but for some reason emulator returns object - so convert to string. 2010-09-17 16:53:52 -05:00
Bryce Curtis
eff7c92dae FileWriter should use its own states object. 2010-09-17 16:17:06 -05:00
macdonst
ca4d7f7fd2 Adding queries for addresses and organization 2010-09-17 17:15:30 -04:00
Bryce Curtis
0ed522481f Read and write operations are async. 2010-09-17 16:05:05 -05:00
Bryce Curtis
2d4a321cc1 Update files.js to be closer to iPhone impl and W3C File API working draft at http://www.w3.org/TR/FileAPI/. 2010-09-17 15:43:20 -05:00
Bryce Curtis
00dc18a488 Convert FileUtils to plugin architecture. 2010-09-17 15:41:48 -05:00
Bryce Curtis
b95ad44c18 Add general ERROR to plugin result status. 2010-09-17 15:38:18 -05:00
Bryce Curtis
9d3306ccc5 Add comments to directory manager source file. 2010-09-17 15:37:34 -05:00
macdonst
c2bcc29cfb Merge branch 'master' of git://github.com/phonegap/phonegap-android into contactSpec 2010-09-17 10:24:30 -04:00
macdonst
0a2d7bf536 reducing code 2010-09-17 10:24:22 -04:00
Bryce Curtis
0895083f1f Use same option name as iPhone. 2010-09-16 12:47:13 -05:00
macdonst
8de6d9ce15 Merge branch 'master' of git://github.com/phonegap/phonegap-android into contactSpec 2010-09-16 13:40:17 -04:00
macdonst
c483ebd1d7 Fixing merge conflict 2010-09-16 13:39:59 -04:00
Bryce Curtis
92d2b5812c Change camera to be more consistent with iPhone and BB widgets. Add support to choose image from library instead of only camera. 2010-09-16 11:31:42 -05:00
Bryce Curtis
9c2e4cfd9c Check to make sure result was returned to eliminate parse warning messages. 2010-09-16 11:28:52 -05:00
macdonst
8da131cc45 Changed search function to take filter and option parameters 2010-09-16 11:35:49 -04:00
Bryce Curtis
5cd25316fa Change JS to call navigator.contacts instead of navigator.ContactManager, which no longer exists. 2010-09-15 14:38:57 -05:00
Bryce Curtis
705b8f6874 Change Device JS object to include only platform, uuid, version, and phonegap properties as defined in API, and modify Device Java class to implement plugin interface. 2010-09-15 14:27:46 -05:00
Bryce Curtis
c050e00b8f Use timeout to break out of possible infinite loop waiting for sensor to start. 2010-09-15 14:17:40 -05:00
Bryce Curtis
03f6267c82 Add JSON stringify equivalent not implemented in older Android (1.6) devices. This is needed for args passed to PhoneGap.exec(). 2010-09-15 14:06:05 -05:00
macdonst
d955502ca2 Fixing whitespace 2010-09-14 14:51:31 -04:00
macdonst
f606012c87 Merge branches 'master' and 'contactSpec' 2010-09-14 14:43:46 -04:00
macdonst
3f24c63fc5 Changing navigator.contacts to navigator.service.contacts 2010-09-14 14:21:20 -04:00
macdonst
b78896e5f0 Modify ContactFindOptions to pass Mobile Spec tests 2010-09-14 14:21:20 -04:00
macdonst
0efe871efe Adding new data model to contact.js to conform to W3C spec 2010-09-14 14:21:20 -04:00
macdonst
633100a3ce Merging Fil's contact changes with Bryce's Plugins 2010-09-14 14:21:19 -04:00
Bryce Curtis
1c0de5ad8d Change hasReturnValue to isSynch to be more accurate about purpose of method. 2010-09-13 11:01:44 -05:00
Bryce Curtis
e4d1087b72 Clean up unused variables. 2010-09-10 18:41:39 -05:00
Bryce Curtis
040a3d7d43 Modify JS code to use service name rather than class name. 2010-09-10 15:13:53 -05:00
Bryce Curtis
fb281ddc9f JS execAsync to handle changes to plugins. 2010-09-10 15:12:55 -05:00
Bryce Curtis
afd278cf80 Modify contacts to use async plugin. Contacts doesn't work on Android, but needed to update JS side to work with plugin. 2010-09-10 14:54:31 -05:00
Bryce Curtis
53fca124ab Modify camera capture to use async plugin. Use option instead of method to specify capture type (base64 or file). 2010-09-10 14:45:32 -05:00
Bryce Curtis
d72c77d6f3 Modify network queries to use async plugin. 2010-09-10 14:20:34 -05:00
Bryce Curtis
0a7762743e Optimize accelerometer to use new PluginManager. 2010-09-10 13:44:45 -05:00
Bryce Curtis
863807a7a5 Add position callback and do some optimization of audio player. 2010-09-10 11:38:23 -05:00
Bryce Curtis
5c20ba57e9 Optimize compass to use new PluginManager. 2010-09-10 11:35:10 -05:00
Bryce Curtis
a13b8fc124 Implement ReturnValue() for each plugin. 2010-09-10 11:34:06 -05:00
Bryce Curtis
2b015164f4 Add hasReturnValue() so that PluginManager can make decision to run an action sync or async. 2010-09-10 11:32:18 -05:00
Bryce Curtis
a21080fb76 Add services supported and their class names. 2010-09-10 11:31:22 -05:00
Bryce Curtis
cda0319be3 Refer to services instead of class names, which don't translate across devices. 2010-09-10 11:30:32 -05:00
Bryce Curtis
7108076260 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-09-09 13:00:40 -05:00
Bryce Curtis
7f3cf4a884 Remove unused module classes. 2010-09-09 11:04:29 -05:00
Bryce Curtis
2d2adf29fd Cleanup plugin code. 2010-09-09 11:04:04 -05:00
Bryce Curtis
b02f376826 Catch exceptions in async callbacks. 2010-09-09 11:03:46 -05:00
Bryce Curtis
1fa41df3f1 Cleanup code and add comments. 2010-09-09 11:01:56 -05:00
Bryce Curtis
77801de1ae Cleanup accelerometer code. 2010-09-09 11:00:45 -05:00
Bryce Curtis
3c9bae3402 Optimize accelerometer for plugin manager. 2010-09-08 17:09:22 -05:00
brianleroux
d208f7bea7 update build target detection to actually fucking detect 2010-09-07 19:03:53 -07:00
Bryce Curtis
4f360c2680 Change commands to plugins. 2010-09-07 13:59:54 -05:00
Bryce Curtis
9e931cc3f6 Change to use Commands and CommandManager. 2010-09-07 10:39:55 -05:00
Bryce Curtis
5c24abcafd Alert dialog only has OK button. Add confirm dialog with OK and CANCEL. 2010-09-07 10:33:08 -05:00
brianleroux
6d403c5864 updated readme 2010-09-05 15:13:32 -07:00
brianleroux
0417a9873b added classic mode for droidgap and implmented test command first pass 2010-09-05 14:32:16 -07:00
brianleroux
22e9530c66 seperating out config 2010-09-05 11:38:48 -07:00
Bryce Curtis
40997b4cb8 Update classes to use module, and make constructors consistent. 2010-09-03 17:24:55 -05:00
Bryce Curtis
5d83a44ec3 Set default camera image to base64. Add comments. 2010-09-03 16:00:21 -05:00
Bryce Curtis
d39781f3fb Start CameraLauncher using module. 2010-09-03 14:27:06 -05:00
Bryce Curtis
75636f7f00 Add modules that can be started without changing DroidGap.java. 2010-09-03 14:14:28 -05:00
Bryce Curtis
f77e51290b Add automatic handling of onActivityResult, so modules that start activities with result callback can do so without modifying DroidGap.java. 2010-09-03 14:01:24 -05:00
brianleroux
8163416e27 cleanup for merge 2010-09-02 16:58:24 -07:00
brianleroux
9185848cbc fixing dasherish 2010-09-02 16:44:56 -07:00
brianleroux
d2e19d8818 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-09-02 16:42:12 -07:00
brianleroux
5c481ebe40 changed to loadInWebView 2010-09-02 12:54:35 -07:00
Bryce Curtis
1febba48ff Moved camera code from DroidGap into CameraLauncher. Added comments and error messages. 2010-09-02 11:27:48 -05:00
brianleroux
a6faa68a5c undefined is not falsy in java land apparently 2010-09-01 11:55:18 -07:00
brianleroux
48ace80183 added a backdoor ;O 2010-09-01 11:49:56 -07:00
brianleroux
b06d02028a updated create script to remove dashes 2010-09-01 11:26:57 -07:00
brianleroux
c53427d7ec Merge branch 'master' of github.com:phonegap/phonegap-android 2010-09-01 11:13:10 -07:00
brianleroux
f818f9bda9 merged dave 2010-08-31 16:50:39 -07:00
brianleroux
83070fc4ea updated pkg to create as per daves suggestion 2010-08-31 15:40:19 -07:00
brianleroux
6cd1d8113e updates to output and rmoved uniq package name 2010-08-31 15:36:09 -07:00
brianleroux
5a90792e0d Merge branch 'master', remote branch 'dave/command_line' 2010-08-31 15:19:12 -07:00
Bryce Curtis
90b708fe83 Update audio playback and recording. 2010-08-31 15:39:37 -05:00
Dave Johnson
f48a19554c readme 2010-08-31 13:27:43 -07:00
Dave Johnson
cf7a4f0fb6 Add more windows compatibility. run does not actually put the app on the simulator though 2010-08-31 13:21:23 -07:00
Dave Johnson
86a7a0d9e3 Add windows build scripts 2010-08-31 13:08:07 -07:00
brianleroux
a5323d77f5 updated readme 2010-08-30 16:02:47 -07:00
brianleroux
190cec7730 removed frameowrk bs 2010-08-30 15:58:47 -07:00
brianleroux
be7f0a2496 whoops 2010-08-30 15:58:11 -07:00
brianleroux
06779773dd reworking in new droidgap lite 2010-08-30 15:57:07 -07:00
brianleroux
2384714138 unused example is unused 2010-08-30 12:02:21 -07:00
macdonst
91f1f475e9 fixing error in if statement 2010-08-30 22:56:24 +08:00
macdonst
b1af7d8739 Adding altituteAccuracy into Coordinates object 2010-08-30 22:56:24 +08:00
Bryce Curtis
86d6053d2d Don't need to manage resume/pause state - the OS does it. 2010-08-27 09:31:57 -05:00
Bryce Curtis
c6280edbed Set type of channel. 2010-08-27 09:28:49 -05:00
Dave Johnson
4fd8a4dad8 Remove channel.js. Remove double call to nativeReady in DroidGap. Niceify CommandResult.java 2010-08-26 12:15:34 -07:00
Dave Johnson
fb2b8345d1 One last fix for a merge problem 2010-08-26 12:10:05 -07:00
Bryce Curtis
c9a579af8c Change resume and pause to use same event mechanism used by deviceready. 2010-08-26 10:39:02 -05:00
filmaj
92b838e07a Was there a reason we had some code duplication? 2010-08-25 22:44:56 -07:00
filmaj
f0cd97de72 Don`t hardcode the android sdk path in the build script before you push (im looking at you Dave) 2010-08-25 22:38:37 -07:00
filmaj
764c9191b7 Merged in latest. 2010-08-25 22:32:31 -07:00
Dave Johnson
fbcaf15353 Fix for merge problem. Tests passing again 2010-08-25 20:37:25 -07:00
Dave Johnson
4eec4c0801 updategap 2010-08-25 16:26:26 -07:00
Dave Johnson
b01668d262 Fix for a merge problem 2010-08-25 15:12:23 -07:00
Dave Johnson
ae800455b1 no more silly json strings in there 2010-08-24 18:59:05 -07:00
Dave Johnson
56f0e8e087 undo the splash screen for now 2010-08-24 18:59:05 -07:00
Dave Johnson
8ca1804de9 the plugins were executing on the UI thread. now on background thread. calls to loadUrl are now automatically on the ui thread 2010-08-24 18:58:41 -07:00
Dave Johnson
0c52ed44a0 changed FileUtils to public for testing purposes. added updategap that can updated a project with the latest phonegap jar and js 2010-08-24 18:58:40 -07:00
Dave Johnson
bb5a628a28 no longer copy preview.xml - preview.xml is never used for anything so removed from it 2010-08-24 18:58:16 -07:00
Dave Johnson
49de553ee8 refactored the Command stuff a bit more, added a spashscreen 2010-08-24 18:58:16 -07:00
Dave Johnson
1af469c8b1 check if file exists or not 2010-08-24 18:57:21 -07:00
Dave Johnson
2b2b4f5dd4 javascript and native side of a URL caching plugin + android plugin framework is complete 2010-08-24 18:57:21 -07:00
Dave Johnson
742910f369 added onNativeReady and onDOMContentLoaded events 2010-08-24 18:56:09 -07:00
Dave Johnson
3365dba870 fixed up things so that deviceready now uses DOMContentLoaded and if DCL fires before something is attached to deviceready the function will be called immediately 2010-08-24 18:51:58 -07:00
filmaj
ac0ba41ccf Merged in bryce`s latest. 2010-08-24 15:01:58 -07:00
filmaj
745aa7201c For some reason have to check typeof? 2010-08-24 14:59:02 -07:00
Bryce Curtis
ea8dc73525 Don't need to fire native ready event during constructor. It gets fired when page has been loaded. 2010-08-24 15:03:38 -05:00
filmaj
8683667041 Semi-colon + new-line addition otherwise built phonegap.js is bad :( 2010-08-24 11:34:32 -07:00
filmaj
24869b637d Merge branch 'master' of http://github.com/thedeftone/phonegap-android 2010-08-24 11:26:00 -07:00
Bryce Curtis
13679fe00d Make sure JavaScript PhoneGap code is initialized and deviceready is fired for a new HTML page loaded from link in initial index.html. 2010-08-24 13:19:22 -05:00
Dave Johnson
9f1730ae47 Add back JSCallback to deviceready event 2010-08-23 17:14:08 -07:00
Dave Johnson
5e46fad0e9 utils for checking lint 2010-08-23 17:00:03 -07:00
Dave Johnson
e0d1414c4a tweaks to PhoneGap.Channel 2010-08-23 17:00:03 -07:00
Dave Johnson
8e5de2cb7b added onNativeReady and onDOMContentLoaded events 2010-08-23 17:00:02 -07:00
Dave Johnson
ca01781766 undoing a test change to droidgap 2010-08-23 16:58:21 -07:00
Dave Johnson
f7a4a0aef8 fixed up things so that deviceready now uses DOMContentLoaded and if DCL fires before something is attached to deviceready the function will be called immediately 2010-08-23 16:58:21 -07:00
Jan Monschke
27ff3068f5 changed back button behavior to use the native way to test if a webview can go back 2010-08-23 15:35:56 +02:00
Bryce Curtis
27c4de6aa0 Change compass listener and optimize accelerometer listener. 2010-08-20 10:59:45 -05:00
Bryce Curtis
e5bbbbe35c Add onpause & onresume events to javascript. 2010-08-19 15:41:06 -05:00
Bryce Curtis
b4d3a10773 Change loadUrl(javascript...) to use new callback mechanism. 2010-08-19 14:37:49 -05:00
Bryce Curtis
1850d2c04e Add callback server class. 2010-08-19 13:35:31 -05:00
Bryce Curtis
5bdad8c0ca Add XHR-based callbacks from Java to JavaScript. 2010-08-18 13:12:53 -05:00
Bryce Curtis
4b3255e4fd Accelerometer updates:
- Removed thread delay to get accelerometer values.
- Override Activity lifecycle methods to manage JavaScript timers and enable window.onunload to be called.  This is needed for accelerometer to shut down correctly.
2010-08-12 10:51:12 -05:00
Bryce Curtis
d5646584ee Change accelerometer to use JavaScript setInterval for watch. 2010-08-11 13:47:50 -05:00
Joe Bowser
f15555ee34 Calling the Quota method over and over is bad, use the estimated size 2010-08-06 13:59:28 -07:00
Joe Bowser
b18657cf72 Fixing Java to match callback 2010-08-04 12:43:17 -07:00
Joe Bowser
32b68f568b Adding the new keyword again 2010-08-04 12:38:19 -07:00
Joe Bowser
4e02179bf8 Merge branch 'master' of git://github.com/davejohnson/phonegap-android 2010-07-18 20:44:57 -07:00
Joe Bowser
853dc0d8aa Removed console.log in accel 2010-07-16 09:41:47 -07:00
Joe Bowser
4d5d8d253b Merge branch 'master' of git@github.com:bowserj/phonegap-android 2010-07-15 17:00:10 -07:00
Dave Johnson
ab4ca5ec8b changed 'deviceReady' to 'deviceready' in index.html. fixed up the file utils a bit so that they sort of work. 2010-07-15 16:59:11 -07:00
Jan Monschke
9ff45f70e2 this should fix the windows encoding bug described here: http://phonegap.lighthouseapp.com/projects/20118-android/tickets/23 2010-07-15 16:59:11 -07:00
Dave Johnson
3cba58ce57 Beep does not crash your app if there is no notification sound 2010-07-15 16:59:11 -07:00
Dave Johnson
8e7ce8780e undoing those changes for target on joes' recommendation 2010-07-15 16:59:11 -07:00
Dave Johnson
707738c3ee added target to the droidgap script and updated the readme and getting started wiki page 2010-07-15 16:59:11 -07:00
Joe Bowser
e3b32e7679 Setting the Geolocation to be only initalized on Android 1.x 2010-07-15 16:58:38 -07:00
Joe Bowser
ea1184cdd3 Fixed up geolocation to use the native geolocation when available 2010-07-15 16:55:00 -07:00
Dave Johnson
89dd0396fe changed gotAccel to gotCurrentAcceleration since that is what is called from getCurrentAcceleration 2010-07-12 14:44:34 -07:00
Dave Johnson
8c0cb5716d Merge remote branch 'phonegap/master' 2010-07-12 14:43:13 -07:00
Dave Johnson
6d60a2b012 fixed bug with accelerometer z value not being set #36 2010-07-12 14:08:09 -07:00
Joe Bowser
7304741164 Merge branch 'master' of git://github.com/thedeftone/phonegap-android 2010-07-08 17:19:50 -07:00
Dave Johnson
d2048a7c5a changed 'deviceReady' to 'deviceready' in index.html. fixed up the file utils a bit so that they sort of work. 2010-07-08 15:51:18 -07:00
Jan Monschke
ac952b25bb this should fix the windows encoding bug described here: http://phonegap.lighthouseapp.com/projects/20118-android/tickets/23 2010-07-09 00:13:55 +02:00
Dave Johnson
d6e79f158f Beep does not crash your app if there is no notification sound 2010-07-07 15:54:33 -07:00
Joe Bowser
9bf83337c9 Switching to native 2010-07-07 15:18:14 -07:00
Dave Johnson
36bd034ee5 Merge branch 'master' of git://github.com/phonegap/phonegap-android 2010-07-07 15:03:38 -07:00
Joe Bowser
dc58c67883 Merge branch 'master' of git@github.com:phonegap/phonegap-android 2010-07-06 13:37:44 -07:00
Joe Bowser
88eef5df66 Not in line with HTML5 spec, editing 2010-07-06 13:37:19 -07:00
Joe Bowser
c75e66a2fc Removing the GapViewClient handler, since it breaks PhoneGap, reverting. Rather have every other URI working except for sms: 2010-07-06 11:43:25 -07:00
alunny
4e31d4af63 browserkey fix 2010-06-30 15:23:26 -07:00
Dave Johnson
5972147e36 undoing those changes for target on joes' recommendation 2010-06-28 16:19:54 -07:00
Dave Johnson
8ec0de457f added target to the droidgap script and updated the readme and getting started wiki page 2010-06-28 16:02:10 -07:00
Joe Bowser
310766180f Forgot to add mailto to the activities launched by intent 2010-06-25 14:31:47 -07:00
Joe Bowser
db9d603881 Fixing equals. However, perhaps object equivalence is better, because it will be the same object if we attempt to go back and fail, where as we can go back and forth numerous times in a web history 2010-06-15 10:43:28 -07:00
Joe Bowser
e5f03b6aed Fixing compass so it actually works 2010-06-11 14:19:37 -07:00
Joe Bowser
bde54704d3 fixing the merge 2010-06-09 10:26:06 -07:00
Joe Bowser
d20abc9aad framework/assets/js/media.js 2010-06-09 10:24:35 -07:00
Joe Bowser
945c0d95e6 Removed PhoneGap.java, renaming to device and audio 2010-06-09 10:24:35 -07:00
Joe Bowser
bb501de22c Hacking together a work-around for the default back behaviour 2010-06-09 10:24:35 -07:00
Joe Bowser
bab03882e1 framework/assets/js/media.js 2010-06-08 16:36:07 -07:00
Joe Bowser
7ad30dfc63 Removed PhoneGap.java, renaming to device and audio 2010-06-08 16:30:20 -07:00
Joe Bowser
4c5f820316 Hacking together a work-around for the default back behaviour 2010-06-08 15:55:57 -07:00
Joe Bowser
b65a0b1bd6 Fixing quality bug in Camera 2010-06-04 15:21:57 -07:00
Joe Bowser
8f18dae2c1 Changed to use the Camera Intents to our own peril. 2010-06-04 14:54:16 -07:00
Joe Bowser
653190c6a1 Switching around attributes so they are similar 2010-06-04 13:32:00 -07:00
Joe Bowser
e55cef9c14 Fixing accel 2010-06-04 13:25:28 -07:00
Joe Bowser
c1e628f44c Fixing up the accelerometer. Weird issue with where zero is 2010-06-04 11:42:12 -07:00
Joe Bowser
cd5788c3ce Merge branch 'master' of git@github.com:phonegap/phonegap-android into accel_hack 2010-05-31 11:37:41 -07:00
Joe Bowser
5c8e029da1 Updating to 2.2 2010-05-31 10:59:44 -07:00
Igor Anic
a65b578449 adding useful telephony information to Device; sim serial number and some oters
(cherry picked from commit da8c4f4a7539b2e6165d48ad6859f65c3133fc59)
2010-05-14 16:24:30 -07:00
Igor Anic
7506548ae2 little better database quota management, increse db size in steps of 1Mb
(cherry picked from commit f5cd1fe73d6cd24ad48b36def86ead5a1f5141ea)
2010-05-14 16:24:19 -07:00
Igor Anic
dfe0b6ff27 console.log for api level 7
(cherry picked from commit a2b08f305b33de38c1ffa93f2a13ed4636482bc1)
2010-05-14 16:23:32 -07:00
Joe Bowser
a179fbd095 Attempt to fix the HTML 5 storage 2010-05-14 15:49:14 -07:00
Joe Bowser
9c1a1207bb Merge branch 'master' of http://github.com/stevengill/phonegap-android 2010-05-10 16:10:04 -07:00
Steven Gill
4ff406f9df fixed geolocation null bug 2010-05-06 15:43:56 -07:00
Joe Bowser
64671184a6 Initial Commit - Fixing Accelerometer 2010-04-28 15:46:15 -07:00
Joe Bowser
36e90c9e22 Adding sms:// to DroidGap, not quite working, since it doesn't pre-populate the number 2010-04-26 10:44:13 -07:00
Joe Bowser
2f6a9e18d0 Adding a WebViewClient with verbose checking 2010-04-23 16:18:11 -07:00
Joe Bowser
ceabaf1e37 Fixing the WebViewClient so we view pages in PhoneGap 2010-04-23 15:08:15 -07:00
filmaj
020178e40b Merged Joe`s turning off of native geolocation in WebView. 2010-03-31 14:02:08 -07:00
Joe Bowser
69e580136a Forgot the min SDK is 2, not 3 2010-03-30 12:02:08 -07:00
Joe Bowser
72fd058b9e Turning off the Native WebKit Geolcation 2010-03-29 16:56:07 -07:00
Joe Bowser
827c0ec81f Removing junk Orientation class 2010-03-26 15:34:29 -07:00
filmaj
887ab4a28b Added explicit disabling of native Geolocation object in the web client, added a fallback measure to JavaScript geolocation PhoneGap constructor so that it builds/proxies the the instantiated Geo objects properly if it still does exist. 2010-03-23 16:37:30 -07:00
filmaj
655c6ac130 Merge branch 'master' of github.com:phonegap/phonegap-android 2010-03-19 16:47:24 -07:00
Brock Whitten
87dd64d36c Adding LICENSE file 2010-03-17 15:19:59 -07:00
filmaj
24d5948d0d Minor changes to droidgap to make it work on my shell (cygwin), merging in Joe`s changes/fixes to geo + JavaScript 2010-03-17 11:02:10 -07:00
filmaj
f53b4ec109 Merged imhotep`s changes, still need to fix droidgap and the android shell call on Windows vs. other OSes. 2010-03-17 10:50:43 -07:00
Anis
915bf19378 Merge branch 'master' of github.com:imhotep/phonegap-android 2010-03-15 17:44:44 -07:00
Anis
a4cc222a43 fixing some minor js issue 2010-03-15 17:38:46 -07:00
Brock Whitten
fade602c0b Merge branch 'master' of github.com:phonegap/phonegap-android 2010-03-15 17:01:27 -07:00
Brock Whitten
f32bb7057e Fixed ridiculous error in Javascript for GeoLocation 2010-03-15 17:01:12 -07:00
Brock Whitten
57a41b7b2f Found syntax error in Geolocation. Probably been lurking here for months 2010-03-15 16:07:14 -07:00
Brock Whitten
db03ff397f Fixing stuff 2010-03-15 15:32:12 -07:00
filmaj
52a49aaaea Fixed droidgap to handle spaces in SDK directory. 2010-03-11 16:11:39 -08:00
filmaj
941d6805ec Adding newly-built phonegap.js to repo post-build. 2010-03-04 15:14:40 -08:00
filmaj
bdf01735cd Merging. 2010-03-04 15:11:49 -08:00
Brock Whitten
c750109bd7 Fixes to make it work with the cancer that is Android 1.5 2010-03-03 17:07:15 -08:00
Brock Whitten
6b269b85d2 Adding 2.1 DOM Storage 2010-03-02 11:14:20 -08:00
Brock Whitten
1d4a67cdad Adding console.log capability to PhoneGap 2010-02-26 11:25:28 -08:00
Brock Whitten
64574be133 Can't get the disk space until we get the disk space 2010-02-25 11:45:57 -08:00
Brock Whitten
be5c31ee1c Fixed pathing issues. Calls it absolutely now based on PhoneGap SDK 2010-02-25 10:28:16 -08:00
Brock Whitten
c3c5d522a3 Adding the tutorial to the project 2010-02-25 10:12:31 -08:00
Brock Whitten
f93c2badcc Minor change for synchronous write. This seems like a bad idea. 2010-02-25 10:09:58 -08:00
Brock Whitten
9c0259c2c1 Changing File Behaviour to sync with iPhone 2010-02-25 09:46:46 -08:00
Brock Whitten
2fa78679cb Adding Javascript Interface for Crypto 2010-02-24 16:19:01 -08:00
Brock Whitten
cb90852dfc Adding Built-In Crypto Library 2010-02-24 16:18:35 -08:00
Brock Whitten
c4ac7e5383 Merge branch 'master' of git://github.com/brianleroux/phonegap-android 2010-02-24 16:00:36 -08:00
Brock Whitten
693cb4695f Fixed a null error on NetworkManager 2010-02-24 15:43:00 -08:00
filmaj
73b18de56f Tweaked status message. 2010-02-24 15:42:49 -08:00
filmaj
fcce200701 More weird merge bs. 2010-02-24 15:42:23 -08:00
filmaj
de8dc4af2a Merging droidgap changes from LeRoux. 2010-02-24 15:36:07 -08:00
Brian LeRoux
466c7ccaff some cleanup of droidgap 2010-02-24 15:23:33 -08:00
Brian LeRoux
fa2776d3d7 merge of inaseer cleanup 2010-02-24 15:06:44 -08:00
Brian LeRoux
17d4d521e7 minor edits 2010-02-24 15:00:03 -08:00
ARenzi
c8bfbab522 I am using the inline editor (github) and i forgot a "type =" before info.getTypeName();
:)
ARenzi
2010-02-23 14:51:56 -07:00
filmaj
32e8ecc772 Oops forgot semi-colon. 2010-02-23 11:42:41 -08:00
filmaj
02c750134c Added ARenzi`s Reachability fixes. 2010-02-23 11:07:30 -08:00
Fil Maj
b0054aa1b4 Merge branch 'master' of git@github.com:phonegap/phonegap-android 2010-02-19 10:15:45 -08:00
Immad Naseer
594e77690c droidgap parses the output of android list targets to find the id for 'android-5' or defaults to 5 if it can't find the id in the output 2010-02-17 15:31:40 -08:00
Immad Naseer
37c3c2528d Refactored the code dealing w/ file/directory manipulation.
- The code makes sure the target directory structure exists before copying files.
  - Minimized usage of Dir.chdir
  - Cleaned up the code dealing w/ cross-platform file paths.
2010-02-16 15:22:42 -08:00
Immad Naseer
10d455d560 Changing the tabs in droidgap to spaces 2010-02-16 14:59:22 -08:00
Immad Naseer
7820451108 small string concatenation performance optimization 2010-02-16 14:34:50 -08:00
Brock Whitten
3d91a98b3a Fixing up StandAlone for debugging purposes 2010-02-16 12:11:43 -08:00
Brock Whitten
c638fbfa69 Fixing nulls 2010-02-16 10:28:07 -08:00
Brock Whitten
17528c15bb Merge branch 'master' of github.com:phonegap/phonegap-android 2010-02-15 14:00:25 -08:00
Brian LeRoux
f491a69769 Merge branch 'master' of git://github.com/filmaj/phonegap-android 2010-02-14 23:41:20 -08:00
Brian LeRoux
bf01ba0aea whatever small changes 2010-02-14 23:40:35 -08:00
filmaj
76a8203176 Fixed small contacts and accelerometer object instantiation bugs. Added a bit more delay to PhoneGap constructor, 1ms caused issues sometimes I *think*. 2010-02-13 18:58:45 -08:00
filmaj
5255f63237 Fixed building of phonegap.js in build script. Fixed GPS on Android 2.0+ - I guess they updated the version of WebKit being used on Android (similar now to how it works on iPhone) and thus the browser has a native navigator.geolocation object. Employed Jesses approach to proxying an objects method since we can`t directly overwrite it. 2010-02-13 17:09:02 -08:00
filmaj
0c585b7416 Added JS concatenation and copy over to assets/www to build script. 2010-02-13 15:01:10 -08:00
filmaj
edd0a2caf6 Updated build file after mergin in thorstens changes. 2010-02-10 13:09:39 -08:00
filmaj
91c4174f19 Merging build script... 2010-02-10 12:44:32 -08:00
Thorsten Rinne
3862632af1 Fixed paths and project generation 2010-02-10 08:19:36 +01:00
Brock Whitten
1f9571a3da Changing the simple example 2010-02-05 16:08:24 -08:00
unknown
c023c3d8cc Updated the Ruby build script so that this shiat works on Windows! 2010-02-03 16:41:39 -08:00
Brock Whitten
4c0da8e241 Fixing Build 2010-02-03 10:27:49 -08:00
Brock Whitten
e01dfec400 Hacky fix for GeoLocation on the 2.1 Emulator 2010-01-29 16:02:20 -08:00
Brian LeRoux
cf70f7d4a7 being picky about md formatting 2010-01-27 15:14:49 -08:00
Brian LeRoux
4934877515 fix for the readme 2010-01-27 15:13:26 -08:00
Brian LeRoux
c3cd44c04c updated readme to reflect change to build process 2010-01-27 15:11:25 -08:00
Brian LeRoux
bb7b973bf0 sweet one line building! 2010-01-27 15:00:21 -08:00
Brian LeRoux
816341030f generating apps works; needs to build js from assets 2010-01-26 17:58:27 -08:00
Brian LeRoux
923c29aa2b cleanup continued 2010-01-26 16:24:35 -08:00
Brian LeRoux
e3dc010b97 reorg of project assets 2010-01-26 13:54:02 -08:00
Brian LeRoux
fc6f2f5d39 removes and .gitignore framework/local.properties, updated README 2010-01-25 22:03:19 -08:00
unknown
4144587640 Expanded instructions in README. 2010-01-21 00:22:39 -08:00
Joe Bowser
d81f53465f Fixing the 1.5 Storage. Got inheritance wrong in this case 2010-01-04 11:53:26 -08:00
221 changed files with 28553 additions and 5001 deletions

20
.gitignore vendored
View File

@@ -1,4 +1,20 @@
.DS_Store
default.properties
bin
gen
assets/www/phonegap.js
assets/www/cordova.js
local.properties
framework/proguard.cfg
framework/cordova.jar
framework/cordova-*.jar
framework/phonegap-*.jar
framework/bin
framework/test/org/apache/cordova/*.class
framework/assets/www/.DS_Store
framework/assets/www/cordova-*.js
framework/assets/www/phonegap-*.js
example
./test
tmp
*.tmp
test/libs/*.jar
bin/node_modules

202
LICENSE Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

5
NOTICE Normal file
View File

@@ -0,0 +1,5 @@
Apache Callback
Copyright 2011 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org)

124
README.md Normal file → Executable file
View File

@@ -1,33 +1,107 @@
Cordova Android
===
PhoneGap Android
=============================================================
PhoneGap Android is an Android application library that allows
for PhoneGap based projects to be built for the Android Platform.
Cordova Android is an Android application library that allows for Cordova based projects to be built for the Android Platform. Cordova based applications are, at the core, an application written with web technology: HTML, CSS and JavaScript.
Pre-requisites
-------------------------------------------------------------
* Java JDK 1.5
* Android SDK Package [http://developer.android.com](http://developer.android.com)
* Apache ANT (For build script)
Apache Cordova is an effort undergoing incubation at The Apache
Software Foundation (ASF), sponsored by the Apache Incubator project.
Incubation is required of all newly accepted projects until a further
review indicates that the infrastructure, communications, and decision
making process have stabilized in a manner consistent with other
successful ASF projects. While incubation status is not necessarily
a reflection of the completeness or stability of the code, it does
indicate that the project has yet to be fully endorsed by the ASF.
Recommended:
----------------------------------------------------------------
* Ruby, Rubygems (for build.rb)
* Eclipse (Recommended for back-end debugging, not required)
Requires
---
Getting Started from Command Line
--------------------------------------
Step 1: cd framework && ant jar
Step 2: In the root directory, run:
- Java JDK 1.5
- Apache ANT
- Android SDK [http://developer.android.com](http://developer.android.com)
- Apache Commons Codec [http://commons.apache.org/codec/](http://commons.apache.org/codec/)
ruby build.rb <app-name> <package_name> <wwwdir> <path>
Building
---
app-name: Name of application without spaces
package name: Java namespace of package ( i.e. com.nitobi.demo)
www-dir: www directory which includes an icon.png file for the icon
path: The path you wish to put your PhoneGap Application
To create your cordova.jar, copy the commons codec:
Using Eclipse with PhoneGap
-------------------------------------------------------------
The wiki article to get started with Eclipse can be found at [http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse](http://phonegap.pbworks.com/Getting-started-with-Android-PhoneGap-in-Eclipse)
mv commons-codec-1.6.jar framework/libs
then run in the framework directory:
android update project -p . -t android-15
ant jar
Cordova Android Developer Tools
---
The Cordova developer tooling is split between general tooling and project level tooling.
To enable the command-line tools available in the ./bin directory, make
sure you have all of the dependencies installed. You will need
[NodeJS](http://nodejs.org) (which should come with `npm`). To install
the dependencies:
$ cd bin
$ npm install
General Commands
./bin/create [path package activity] ... create the ./example app or a cordova android project
./bin/bench ............................ generate a bench proj
./bin/autotest ......................... test the cli tools
./bin/test ............................. run mobile-spec
Project Commands
These commands live in a generated Cordova Android project.
./cordovap/debug [path] ..................... install to first device
./cordova/emulate .......................... start avd (emulator) named default
./cordova/log .............................. starts logcat
Running the Example Project
---
Start avd (emulator) named `default`:
./bin/emulate
Create the example project and build it to the first device:
./bin/create
cd example
./cordova/debug
Start adb logcat (console.log calls output here):
./cordova/log
Running the [callback/callback-test](http://github.com/callback/callback-test) tests:
---
./bin/test
Creating a new Cordova Android Project
---
./bin/create ~/Desktop/myapp com.phonegap.special MyApp
Importing a Cordova Android Project into Eclipse
----
1. File > New > Project...
2. Android > Android Project
3. Create project from existing source (point to the generated app found in tmp/android)
4. Right click on libs/cordova.jar and add to build path
5. Right click on the project root: Run as > Run Configurations
6. Click on the Target tab and select Manual (this way you can choose the emulator or device to build to)
Further Reading
---
- [http://developer.android.com](http://developer.android.com)
- [http://docs.phonegap.com](http://docs.phonegap.com)
- [http://wiki.phonegap.com](http://wiki.phonegap.com)

1
VERSION Normal file
View File

@@ -0,0 +1 @@
1.8.0rc1

21
bin/BOOM Executable file
View File

@@ -0,0 +1,21 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
./bin/create
cd ./example && ./cordova/debug && ./cordova/log

2
bin/autotest Executable file
View File

@@ -0,0 +1,2 @@
#! /usr/bin/env node
require('nodeunit').reporters.default.run(['bin/tests'])

47
bin/bench Executable file
View File

@@ -0,0 +1,47 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
#
# Creates an app in `./bench` that posts results to http://cordova-bench.heroku.com with current cordova/Android sha.
#
# USAGE
# ./bin/bench
#
# clobber any existing bench
if [ -e ./bench ]
then
rm -rf ./bench
fi
# create a benching app
./bin/create ./bench org.apache.cordova.bench cordovaBench
# grab the latest bench www code
git clone git@github.com:brianleroux/cordova-bench.git
# copy it into the app
cat ./cordova-bench/www/index.html > ./bench/assets/www/index.html
#cat ~/Desktop/cordova-bench/www/index.html > ./bench/assets/www/index.html
# clean up
rm -rf ./cordova-bench
# launch to the first device found
./bin/debug ./bench

71
bin/create Executable file
View File

@@ -0,0 +1,71 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
# create a cordova/android project
#
# USAGE
# ./create [path package activity]
#
set -e
PROJECT_PATH=${1:-"./example"}
PACKAGE=${2:-"org.apache.cordova.example"}
ACTIVITY=${3:-"cordovaExample"}
TARGET=$(android list targets | grep 'id: ' | sed 's/id: \([0-9]*\).*/\1/g' | tail -1)
VERSION=$(cat ./VERSION)
# clobber any existing example
if [ $# -eq 0 ]
then
rm -rf $PROJECT_PATH
fi
# update the cordova-android framework for the desired target
android update project --target $TARGET --path ./framework
# Use curl to get the jar (TODO: Support Apache Mirrors)
curl -OL http://mirror.symnds.com/software/Apache//commons/codec/binaries/commons-codec-1.6-bin.zip
unzip commons-codec-1.6-bin.zip
cp commons-codec-1.6/commons-codec-1.6.jar ./framework/libs
# compile cordova.js and cordova.jar
cd ./framework && ant jar && cd ../
# copy all the bin scripts etc in there
cp -R ./bin/templates/project/ $PROJECT_PATH
# copy in cordova.js
cp ./framework/assets/www/cordova-$VERSION.js $PROJECT_PATH/.cordova/android/cordova-$VERSION.js
# copy in cordova.jar
cp ./framework/cordova-$VERSION.jar $PROJECT_PATH/.cordova/android/cordova-$VERSION.jar
# copy in res/xml
cp ./framework/res/xml/cordova.xml $PROJECT_PATH/.cordova/android/cordova.xml
cp ./framework/res/xml/plugins.xml $PROJECT_PATH/.cordova/android/plugins.xml
# app properties
cat > $PROJECT_PATH/.cordova/config <<eom
VERSION=$VERSION
PROJECT_PATH=$PROJECT_PATH
PACKAGE=$PACKAGE
ACTIVITY=$ACTIVITY
TARGET=$TARGET
eom
(cd $PROJECT_PATH && ./cordova/create)

1
bin/create.bat Normal file
View File

@@ -0,0 +1 @@
cscript bin\create.js %*

174
bin/create.js Normal file
View File

@@ -0,0 +1,174 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
/*
* create a cordova/android project
*
* USAGE
* ./create [path package activity]
*/
function read(filename) {
WScript.Echo('Reading in ' + filename);
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile(filename, 1);
var s=f.ReadAll();
f.Close();
return s;
}
function write(filename, contents) {
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile(filename, 2, true);
f.Write(contents);
f.Close();
}
function replaceInFile(filename, regexp, replacement) {
write(filename, read(filename).replace(regexp, replacement));
}
function exec(s, output) {
WScript.Echo('Executing ' + s);
var o=shell.Exec(s);
while (o.Status == 0) {
WScript.Sleep(100);
}
WScript.Echo("Command exited with code " + o.Status);
}
function fork(s) {
WScript.Echo('Executing ' + s);
var o=shell.Exec(s);
while (o.Status != 1) {
WScript.Sleep(100);
}
WScript.Echo(o.StdOut.ReadAll());
WScript.Echo(o.StdErr.ReadAll());
WScript.Echo("Command exited with code " + o.Status);
}
var args = WScript.Arguments, PROJECT_PATH="example",
PACKAGE="org.apache.cordova.example", ACTIVITY="cordovaExample",
shell=WScript.CreateObject("WScript.Shell");
// working dir
var ROOT = WScript.ScriptFullName.split('\\bin\\create.js').join('');
if (args.Count() == 3) {
WScript.Echo('Found expected arguments');
PROJECT_PATH=args(0);
PACKAGE=args(1);
ACTIVITY=args(2);
}
var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\');
var ACTIVITY_PATH=PROJECT_PATH+'\\src\\'+PACKAGE_AS_PATH+'\\'+ACTIVITY+'.java';
var MANIFEST_PATH=PROJECT_PATH+'\\AndroidManifest.xml';
var TARGET=shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s([0-9]).*/)[1];
var VERSION=read('VERSION').replace(/\r\n/,'').replace(/\n/,'');
WScript.Echo("Project path: " + PROJECT_PATH);
WScript.Echo("Package: " + PACKAGE);
WScript.Echo("Activity: " + ACTIVITY);
WScript.Echo("Package as path: " + PACKAGE_AS_PATH);
WScript.Echo("Activity path: " + ACTIVITY_PATH);
WScript.Echo("Manifest path: " + MANIFEST_PATH);
WScript.Echo("Cordova version: " + VERSION);
// TODO: clobber any existing example
/*
if [ $# -eq 0 ]
then
rm -rf $PROJECT_PATH
fi
*/
// create the project
exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --package '+PACKAGE+' --activity '+ACTIVITY);
// update the cordova framework project to a target that exists on this machine
exec('android.bat update project --target '+TARGET+' --path framework');
// pull down commons codec if necessary
var fso = WScript.CreateObject('Scripting.FileSystemObject');
if (!fso.FileExists(ROOT + '\\framework\\libs\\commons-codec-1.6.jar')) {
// We need the .jar
var url = 'http://mirror.symnds.com/software/Apache//commons/codec/binaries/commons-codec-1.6-bin.zip';
var savePath = ROOT + '\\framework\\libs\\commons-codec-1.6-bin.zip';
if (!fso.FileExists(savePath)) {
// We need the zip to get the jar
var xhr = WScript.CreateObject('MSXML2.XMLHTTP');
xhr.open('GET', url, false);
xhr.send();
if (xhr.status == 200) {
var stream = WScript.CreateObject('ADODB.Stream');
stream.Open();
stream.Type = 1;
stream.Write(xhr.ResponseBody);
stream.Position = 0;
stream.SaveToFile(savePath);
stream.Close();
} else {
WScript.Echo('Could not retrieve the commons-codec. Please download it yourself and put into the framework/libs directory. This process may fail now. Sorry.');
}
}
var app = WScript.CreateObject('Shell.Application');
var source = app.NameSpace(savePath).Items();
var target = app.NameSpace(ROOT + '\\framework\\libs');
target.CopyHere(source, 256);
// Move the jar into libs
fso.MoveFile(ROOT + '\\framework\\libs\\commons-codec-1.6\\commons-codec-1.6.jar', ROOT + '\\framework\\libs\\commons-codec-1.6.jar');
// Clean up
fso.DeleteFile(ROOT + '\\framework\\libs\\commons-codec-1.6-bin.zip');
fso.DeleteFolder(ROOT + '\\framework\\libs\\commons-codec-1.6', true);
}
// compile cordova.js and cordova.jar
// if you see an error about "Unable to resolve target" then you may need to
// update your android tools or install an additional Android platform version
exec('ant.bat -f framework\\build.xml jar');
// copy in the project template
exec('cmd /c xcopy bin\\templates\\project\\* '+PROJECT_PATH+' /S /Y');
// copy example www assets
exec('cmd /c xcopy ' + PROJECT_PATH + '\\cordova\\assets ' + PROJECT_PATH + ' /S /Y');
// copy in cordova.js
exec('cmd /c copy framework\\assets\\js\\cordova.android.js '+PROJECT_PATH+'\\.cordova\\android\\cordova-'+VERSION+'.js /Y');
// copy in cordova.jar
exec('cmd /c copy framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\.cordova\\android\\cordova-'+VERSION+'.jar /Y');
// copy in xml
exec('cmd /c copy framework\\res\\xml\\cordova.xml ' + PROJECT_PATH + '\\.cordova\\android\\cordova.xml /Y');
exec('cmd /c copy framework\\res\\xml\\plugins.xml ' + PROJECT_PATH + '\\.cordova\\android\\plugins.xml /Y');
// write out config file
write(PROJECT_PATH + '\\.cordova\\config',
'VERSION=' + VERSION + '\r\n' +
'PROJECT_PATH=' + PROJECT_PATH + '\r\n' +
'PACKAGE=' + PACKAGE + '\r\n' +
'ACTIVITY=' + ACTIVITY + '\r\n' +
'TARGET=' + TARGET);
// run project-specific create process
fork('cscript.exe ' + PROJECT_PATH + '\\cordova\\create.js');

98
bin/create.xml Normal file
View File

@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<project name="cordova" default="create" basedir="../">
<property name="project.path" value="${basedir}/example"/>
<property name="package" value="org.apache.cordova.example"/>
<property name="activity" value="cordovaExample"/>
<target name="create">
<!-- this stuff is seriously stupid -->
<echo file="tmp/package.tmp">package-as-path=${package}</echo>
<replace file="tmp/package.tmp" token="." value="\\" />
<property file="tmp/package.tmp" />
<property name="activity.path" value="${project.path}/src/${package-as-path}/${activity}.java" />
<property name="manifest.path" value="${project.path}/AndroidManifest.xml" />
<!-- get the highest target on this machine -->
<!-- this stuff is also seriously stupid -->
<exec executable="cmd" osfamily="windows" output="tmp/target.list.tmp">
<arg line="/c android.bat list targets"/>
</exec>
<exec executable="android" osfamily="mac" output="tmp/target.list.tmp">
<arg line="list targets"/>
</exec>
<replaceregexp file="tmp/target.list.tmp" match=".*id:\s([0-9]).*" replace="target=\1" flags="s" />
<property file="tmp/target.list.tmp" />
<!-- var VERSION=read('VERSION').replace(/\r\n/,'').replace(/\n/,''); -->
<copy file="VERSION" tofile="tmp/VERSION.tmp" overwrite="true" />
<replaceregexp file="tmp/VERSION.tmp" match="^" replace="version=" />
<replaceregexp file="tmp/VERSION.tmp" match="\r\n" replace="" />
<property file="tmp/VERSION.tmp" />
<!-- clobber any existing example -->
<!-- create the project -->
<exec executable="cmd" osfamily="windows">
<arg line="/c android.bat create project --target ${target} --path ${project.path} --package ${package} --activity ${activity}"/>
</exec>
<exec executable="android" osfamily="mac">
<arg line="create project --target ${target} --path ${project.path} --package ${package} --activity ${activity}"/>
</exec>
<!-- update the framework dir -->
<exec executable="cmd" osfamily="windows">
<arg line="/c android.bat update project --target ${target} --path ${basedir}/framework"/>
</exec>
<exec executable="android" osfamily="mac">
<arg line="update project --target ${target} --path ${basedir}/framework"/>
</exec>
<!-- compile cordova.js and cordova.jar -->
<!-- // if you see an error about "Unable to resolve target" then you may need to
// update your android tools or install an additional Android platform version -->
<ant antfile="${basedir}/framework/build.xml" useNativeBasedir="true" inheritAll="false" />
<!-- copy in the project template -->
<copy todir="${project.path}" overwrite="true">
<fileset dir="${basedir}/bin/templates/project"/>
</copy>
<!-- copy in cordova.js -->
<copy file="${basedir}/framework/assets/www/cordova-${version}.js" todir="${project.path}/assets/www/" />
<!-- copy in cordova.jar -->
<copy file="${basedir}/framework/cordova-${version}.jar" todir="${project.path}/libs/" />
<!-- copy in default activity -->
<copy file="${basedir}/bin/templates/Activity.java" tofile="${activity.path}" overwrite="true" />
<!-- interpolate the activity name and package -->
<replaceregexp file="${activity.path}" match="__ACTIVITY__" replace="${activity}" />
<replaceregexp file="${activity.path}" match="__ID__" replace="${package}" />
<replaceregexp file="${manifest.path}" match="__ACTIVITY__" replace="${activity}" />
<replaceregexp file="${manifest.path}" match="__PACKAGE__" replace="${package}" />
</target>
</project>

26
bin/package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "cordova-android-cli",
"description": "CLI tooling for the cordova-android project",
"version": "0.0.1",
"licenses": [{
"type": "APL 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0"
}],
"main" : "./create",
"bin": {
"create": "./create",
"bench": "./bench",
"autotest": "./autotest",
"BOOM": "./BOOM",
"test": "./test"
},
"homepage": "http://incubator.apache.org/cordova",
"repository": {
"type": "git",
"url": "http://git-wip-us.apache.org/repos/asf/incubator-cordova-android.git"
},
"dependencies":{
"coffee-script":"1.1.2",
"nodeunit":"0.5.3"
}
}

View File

@@ -0,0 +1 @@
ok...

View File

@@ -0,0 +1,3 @@
this is local config for cordova stuff to be eventually moved to
config.xml ...we think. feedback to @davejohnson/@brianleroux
appreciated here!

View File

@@ -0,0 +1,58 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
# create a cordova/android project
#
# USAGE
# ./create [path package activity]
#
# load up the config
. ./.cordova/config
PACKAGE_AS_PATH=$(echo $PACKAGE | sed 's/\./\//g')
ACTIVITY_PATH=./src/$PACKAGE_AS_PATH/$ACTIVITY.java
MANIFEST_PATH=./AndroidManifest.xml
# create the project
android create project --target $TARGET --path . --package $PACKAGE --activity $ACTIVITY
# copy all the cordova scripts etc in there
cp -R ./cordova/templates/project/* .
# copy in cordova.js
cp ./.cordova/android/cordova-$VERSION.js ./assets/www
# copy in cordova.jar
cp ./.cordova/android/cordova-$VERSION.jar ./libs
# copy in res/xml
mkdir ./res/xml
cp ./.cordova/android/cordova.xml ./res/xml
cp ./.cordova/android/plugins.xml ./res/xml
# copy in default activity
cat ./cordova/templates/Activity.java > $ACTIVITY_PATH
# interpolate the acivity name and package
find "$ACTIVITY_PATH" | xargs grep '__ACTIVITY__' -sl | xargs -L1 sed -i -e "s/__ACTIVITY__/${ACTIVITY}/g"
find "$ACTIVITY_PATH" | xargs grep '__ID__' -sl | xargs -L1 sed -i -e "s/__ID__/${PACKAGE}/g"
find "$MANIFEST_PATH" | xargs grep '__ACTIVITY__' -sl | xargs -L1 sed -i -e "s/__ACTIVITY__/${ACTIVITY}/g"
find "$MANIFEST_PATH" | xargs grep '__PACKAGE__' -sl | xargs -L1 sed -i -e "s/__PACKAGE__/${PACKAGE}/g"

View File

@@ -0,0 +1,2 @@
echo "BALLS"
cscript cordova\create.js

69
bin/templates/project/cordova/create.js vendored Normal file
View File

@@ -0,0 +1,69 @@
var shell=WScript.CreateObject("WScript.Shell");
function exec(s, output) {
WScript.Echo('Executing ' + s);
var o=shell.Exec(s);
while (o.Status == 0) {
WScript.Sleep(100);
}
WScript.Echo("Command exited with code " + o.Status);
}
function read(filename) {
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile(filename, 1);
var s=f.ReadAll();
f.Close();
return s;
}
function write(filename, contents) {
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile(filename, 2, true);
f.Write(contents);
f.Close();
}
function replaceInFile(filename, regexp, replacement) {
write(filename, read(filename).replace(regexp, replacement));
}
// working dir
var PWD = WScript.ScriptFullName.split('\\cordova\\create.js').join('');
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile(PWD + '\\.cordova\\config', 1);
while (!f.AtEndOfStream) {
var prop = f.ReadLine().split('=');
var line = 'var ' + prop[0] + '=' + "'" + prop[1] + "';";
eval(line); // hacky shit to load config but whatevs
}
var PACKAGE_AS_PATH=PACKAGE.replace(/\./g, '\\');
var ACTIVITY_PATH=PWD+'\\src\\'+PACKAGE_AS_PATH+'\\'+ACTIVITY+'.java';
var MANIFEST_PATH=PWD+'\\AndroidManifest.xml';
exec('android.bat create project --target ' + TARGET + ' --path ' + PWD + ' --package ' + PACKAGE + ' --activity ' + ACTIVITY);
// copy in activity and other android assets
exec('cmd /c xcopy ' + PWD + '\\cordova\\templates\\project\\* ' + PWD +' /Y /S');
// copy in cordova.js
exec('cmd /c copy ' + PWD + '\\.cordova\\android\\cordova-' + VERSION + '.js ' + PWD + '\\assets\\www /Y');
// copy in cordova.jar
exec('cmd /c copy ' + PWD + '\\.cordova\\android\\cordova-' + VERSION + '.jar ' + PWD + '\\libs /Y');
// copy in res/xml
exec('cmd /c md ' + PWD + '\\res\\xml');
exec('cmd /c copy ' + PWD + '\\.cordova\\android\\cordova.xml ' + PWD + '\\res\\xml /Y');
exec('cmd /c copy ' + PWD + '\\.cordova\\android\\plugins.xml ' + PWD + '\\res\\xml /Y');
// copy in default activity
exec('cmd /c copy ' + PWD + '\\cordova\\templates\\Activity.java ' + ACTIVITY_PATH + ' /Y');
// interpolate the activity name and package
replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY);
replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE);
replaceInFile(MANIFEST_PATH, /__ACTIVITY__/, ACTIVITY);
replaceInFile(MANIFEST_PATH, /__PACKAGE__/, PACKAGE);
WScript.Echo('Create completed successfully.');

View File

@@ -0,0 +1,27 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
. ./.cordova/config
# if there are no devices listed then emulate
ant clean
ant debug install
adb shell am start -n $PACKAGE/$PACKAGE.$ACTIVITY

View File

View File

@@ -0,0 +1,31 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
#Available Android Virtual Devices:
# Name: default
# Path: /Users/davejohnson/.android/avd/default.avd
# Target: Android 2.2 (API level 8)
# Skin: WVGA800
# Sdcard: 100M
# get the name of the first virtual device or use command line arg or use "default"
emulator -cpu-delay 0 -no-boot-anim -cache ./tmp/cache -avd default > /dev/null 2>&1 & # put the avd's chatty ass in the background

View File

@@ -0,0 +1,21 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
adb logcat

View File

View File

@@ -0,0 +1,35 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 __ID__;
import android.app.Activity;
import android.os.Bundle;
import org.apache.cordova.*;
public class __ACTIVITY__ extends DroidGap
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.loadUrl("file:///android_asset/www/index.html");
}
}

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:windowSoftInputMode="adjustPan"
package="__PACKAGE__" android:versionName="1.1" android:versionCode="5">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true">
<activity android:name="__ACTIVITY__" android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="5" />
</manifest>

View File

@@ -0,0 +1,60 @@
<!DOCTYPE HTML>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<html>
<head>
<meta name="viewport" content="width=320; user-scalable=no" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>PhoneGap</title>
<link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title">
<script type="text/javascript" charset="utf-8" src="cordova-1.8.0rc1.js"></script>
<script type="text/javascript" charset="utf-8" src="main.js"></script>
</head>
<body onload="init();" id="stage" class="theme">
<h1>Welcome to Cordova!</h1>
<h2>this file is located at assets/www/index.html</h2>
<div id="info">
<h4>Platform: <span id="platform"> &nbsp;</span>, Version: <span id="version">&nbsp;</span></h4>
<h4>UUID: <span id="uuid"> &nbsp;</span>, Name: <span id="name">&nbsp;</span></h4>
<h4>Width: <span id="width"> &nbsp;</span>, Height: <span id="height">&nbsp;
</span>, Color Depth: <span id="colorDepth"></span></h4>
</div>
<dl id="accel-data">
<dt>X:</dt><dd id="x">&nbsp;</dd>
<dt>Y:</dt><dd id="y">&nbsp;</dd>
<dt>Z:</dt><dd id="z">&nbsp;</dd>
</dl>
<a href="#" class="btn large" onclick="toggleAccel();">Toggle Accelerometer</a>
<a href="#" class="btn large" onclick="getLocation();">Get Location</a>
<a href="tel:411" class="btn large">Call 411</a>
<a href="#" class="btn large" onclick="beep();">Beep</a>
<a href="#" class="btn large" onclick="vibrate();">Vibrate</a>
<a href="#" class="btn large" onclick="show_pic();">Get a Picture</a>
<a href="#" class="btn large" onclick="get_contacts();return false;">Get Phone's Contacts</a>
<a href="#" class="btn large" onclick="check_network();return false;">Check Network</a>
<dl>
<dt>Compass Heading:</dt><dd id="h">Off</dd>
</dl>
<a href="#" class="btn large" onclick="toggleCompass();return false;">Toggle Compass</a>
<div id="viewport" class="viewport" style="display: none;">
<img style="width:60px;height:60px" id="test_img" src="" />
</div>
</body>
</html>

View File

@@ -0,0 +1,165 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
var deviceInfo = function() {
document.getElementById("platform").innerHTML = device.platform;
document.getElementById("version").innerHTML = device.version;
document.getElementById("uuid").innerHTML = device.uuid;
document.getElementById("name").innerHTML = device.name;
document.getElementById("width").innerHTML = screen.width;
document.getElementById("height").innerHTML = screen.height;
document.getElementById("colorDepth").innerHTML = screen.colorDepth;
};
var getLocation = function() {
var suc = function(p) {
alert(p.coords.latitude + " " + p.coords.longitude);
};
var locFail = function() {
};
navigator.geolocation.getCurrentPosition(suc, locFail);
};
var beep = function() {
navigator.notification.beep(2);
};
var vibrate = function() {
navigator.notification.vibrate(0);
};
function roundNumber(num) {
var dec = 3;
var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
return result;
}
var accelerationWatch = null;
function updateAcceleration(a) {
document.getElementById('x').innerHTML = roundNumber(a.x);
document.getElementById('y').innerHTML = roundNumber(a.y);
document.getElementById('z').innerHTML = roundNumber(a.z);
}
var toggleAccel = function() {
if (accelerationWatch !== null) {
navigator.accelerometer.clearWatch(accelerationWatch);
updateAcceleration({
x : "",
y : "",
z : ""
});
accelerationWatch = null;
} else {
var options = {};
options.frequency = 1000;
accelerationWatch = navigator.accelerometer.watchAcceleration(
updateAcceleration, function(ex) {
alert("accel fail (" + ex.name + ": " + ex.message + ")");
}, options);
}
};
var preventBehavior = function(e) {
e.preventDefault();
};
function dump_pic(data) {
var viewport = document.getElementById('viewport');
console.log(data);
viewport.style.display = "";
viewport.style.position = "absolute";
viewport.style.top = "10px";
viewport.style.left = "10px";
document.getElementById("test_img").src = data;
}
function fail(msg) {
alert(msg);
}
function show_pic() {
navigator.camera.getPicture(dump_pic, fail, {
quality : 50
});
}
function close() {
var viewport = document.getElementById('viewport');
viewport.style.position = "relative";
viewport.style.display = "none";
}
function contacts_success(contacts) {
alert(contacts.length
+ ' contacts returned.'
+ (contacts[2] && contacts[2].name ? (' Third contact is ' + contacts[2].name.formatted)
: ''));
}
function get_contacts() {
var obj = new ContactFindOptions();
obj.filter = "";
obj.multiple = true;
navigator.contacts.find(
[ "displayName", "name" ], contacts_success,
fail, obj);
}
function check_network() {
var networkState = navigator.network.connection.type;
var states = {};
states[Connection.UNKNOWN] = 'Unknown connection';
states[Connection.ETHERNET] = 'Ethernet connection';
states[Connection.WIFI] = 'WiFi connection';
states[Connection.CELL_2G] = 'Cell 2G connection';
states[Connection.CELL_3G] = 'Cell 3G connection';
states[Connection.CELL_4G] = 'Cell 4G connection';
states[Connection.NONE] = 'No network connection';
confirm('Connection type:\n ' + states[networkState]);
}
var watchID = null;
function updateHeading(h) {
document.getElementById('h').innerHTML = h.magneticHeading;
}
function toggleCompass() {
if (watchID !== null) {
navigator.compass.clearWatch(watchID);
watchID = null;
updateHeading({ magneticHeading : "Off"});
} else {
var options = { frequency: 1000 };
watchID = navigator.compass.watchHeading(updateHeading, function(e) {
alert('Compass Error: ' + e.code);
}, options);
}
}
function init() {
// the next line makes it impossible to see Contacts on the HTC Evo since it
// doesn't have a scroll button
// document.addEventListener("touchmove", preventBehavior, false);
document.addEventListener("deviceready", deviceInfo, true);
}

View File

@@ -1,4 +1,24 @@
body {
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
body {
background:#222 none repeat scroll 0 0;
color:#666;
font-family:Helvetica;

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

44
bin/test Executable file
View File

@@ -0,0 +1,44 @@
#! /bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
#
set -e
VERSION=$(cat ./VERSION)
# get the latest mobile-spec
git clone git@github.com:callback/callback-test.git
# clobber test if it exists
if [ -e ./test ]
then
rm -rf ./test
fi
# generate a working proj
./bin/create ./test org.apache.cordova.test CordovaTest
# kill the default app and replace it w/ mobile-spec
rm -rf ./test/assets/www
mv ./callback-test ./test/assets/www
# copy in cordova.js since www dir was replaced above
cp ./framework/assets/www/cordova-$VERSION.js ./test/assets/www/cordova-$VERSION.js
# build it, launch it and start logging on stdout
cd ./test && ./cordova/debug && ./cordova/log

24
bin/tests/autotest.coffee Normal file
View File

@@ -0,0 +1,24 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
exports['you are sane'] = (test) ->
test.expect 1
test.ok true, "this assertion should always pass"
test.done()

40
bin/tests/create.coffee Normal file
View File

@@ -0,0 +1,40 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/
util = require 'util'
exec = require('child_process').exec
path = require 'path'
exports['default example project is generated'] = (test) ->
test.expect 1
exec './bin/create', (error, stdout, stderr) ->
test.ok true, "this assertion should pass" unless error?
test.done()
exports['default example project has a ./.cordova folder'] = (test) ->
test.expect 1
path.exists './example/.cordova', (exists) ->
test.ok exists, 'the cordova folder exists'
test.done()
exports['default example project has a /cordova folder'] = (test) ->
test.expect 1
path.exists './example/cordova', (exists) ->
test.ok exists, 'the other cordova folder exists'
test.done()

18
bin/tests/debug.coffee Normal file
View File

@@ -0,0 +1,18 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
*/

0
bin/tests/test.coffee Normal file
View File

View File

@@ -1,80 +0,0 @@
require 'rubygems'
require 'nokogiri'
require 'fileutils'
class Build
attr_reader :path
attr_reader :name
attr_reader :package_name
attr_reader :www_dir
def start(name, pkg_name, www, path)
create_android(name, pkg_name, path)
@www_dir = www
generate_manifest
copy_libs
write_java
end
def create_android(name, pkg_name, path)
@name = name
@pkg_name = pkg_name
@path = path
`android create project -t 5 -k #{pkg_name} -a #{name} -n #{name} -p #{path}`
end
def generate_manifest
f = File.open('framework/AndroidManifest.xml', 'r')
doc = Nokogiri::XML(f.read)
manifest = doc.search('//manifest')
manifest[0]['package'] = @pkg_name
actions = doc.search('//activity')
actions[0]['android:name'] = ".#{@name}"
actions[1]['android:name'] = "com.phonegap.CameraPreview"
f = File.open("#{@path}/AndroidManifest.xml", 'w')
f.write(doc.to_xml)
end
def copy_libs
FileUtils.cp('framework/phonegap.jar', "#{@path}/libs")
FileUtils.cp('framework/res/values/strings.xml', "#{@path}/res/values/strings.xml")
FileUtils.mkdir_p("#{@path}/res/drawable/")
FileUtils.mkdir_p("#{@path}/assets")
FileUtils.cp_r("#{@www_dir}/", "#{@path}/assets/www")
FileUtils.cp("#{@www_dir}/icon.png", "#{@path}/res/drawable/icon.png")
end
def write_java
package_path = "#{@path}/src/" + @pkg_name.gsub('.', '/')
doc = File.open("#{package_path}/#{@name}.java", 'r')
data = doc.read.split(/\n/)
result = ""
data.each do |line|
if line.include? "android.os.Bundle"
line += "\n\nimport com.phonegap.*;"
end
if line.include? "extends Activity"
line = "public class #{@name} extends DroidGap"
end
if line.include? "setContentView"
line = " super.loadUrl(\"file:///android_asset/www/index.html\");"
end
result += line + "\n"
end
doc.close
package_path = "#{@path}/src/" + @pkg_name.gsub('.', '/')
target = File.open(package_path + "/#{@name}.java", 'w')
target.write(result);
end
end
b = Build.new
if(ARGV.length >= 3)
b.start(ARGV[0], ARGV[1], ARGV[2], ARGV[3])
else
str = "Android PhoneGap Build Tool \n Usage: build <name> <package_name> <wwwdir> <path> \n name: The name of your application \n package_name: The name of your package: i.e. com.nitobi.demo \n wwwdir: The name of your Web App \n path: Location of where you want to work on your application"
puts str
end

View File

@@ -3,6 +3,6 @@
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="lib" path="libs/commons-codec-1.3.jar"/>
<classpathentry kind="output" path="bin"/>
<classpathentry kind="lib" path="libs/commons-codec-1.6.jar"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>PhoneGap</name>
<name>Cordova</name>
<comment></comment>
<projects>
</projects>

57
framework/AndroidManifest.xml Normal file → Executable file
View File

@@ -1,43 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.phonegap" android:versionName="1.1" android:versionCode="3">
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:windowSoftInputMode="adjustPan"
package="org.apache.cordova" android:versionName="1.1" android:versionCode="5">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<!-- android:xlargeScreens="true" screen supported only after Android-9 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true">
<activity android:name=".StandAlone"
android:debuggable="true">
<activity android:name=".StandAlone" android:windowSoftInputMode="adjustPan"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".CameraPreview"
android:label="@string/app_name" android:screenOrientation="landscape"
<activity android:name="org.apache.cordova.DroidGap" android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<action android:name="android.intent.action.PICK" />
<intent-filter>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-sdk android:minSdkVersion="2" />
</manifest>

View File

@@ -1,6 +0,0 @@
Note: phonegap.js goes in the assets/www directory. To get this file, please
build it from the top level by running make:
make
The file will be concatenated and minified, and will be stored in lib/android

34
framework/ant.properties Normal file
View File

@@ -0,0 +1,34 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
# This file is used to override default values used by the Ant build system.
#
# This file must be checked in Version Control Systems, as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' for the location of your java source folder and
# 'out.dir' for the location of your output folder.
# You can also use it define how the release builds are signed by declaring
# the following properties:
# 'key.store' for the location of your keystore and
# 'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

File diff suppressed because it is too large Load Diff

View File

@@ -1,148 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<html>
<head>
<meta name="viewport" content="width=320; user-scalable=no" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>PhoneGap</title>
<link rel="stylesheet" href="master.css" type="text/css" media="screen" title="no title" charset="utf-8">
<script type="text/javascript" charset="utf-8" src="phonegap.js"></script>
<script type="text/javascript" charset="utf-8">
var deviceInfo = function(){
document.getElementById("platform").innerHTML = device.platform;
document.getElementById("version").innerHTML = device.version;
document.getElementById("uuid").innerHTML = device.uuid;
console.log("Height:" + window.innerHeight);
console.log("Width:" + window.innerWidth);
}
var getLocation = function() {
var suc = function(p){
alert(p.coords.latitude + " " + p.coords.longitude);
};
var fail = function(){};
navigator.geolocation.getCurrentPosition(suc,fail);
}
var beep = function(){
navigator.notification.beep(2);
}
var vibrate = function(){
navigator.notification.vibrate(0);
}
var getContact = function(){
var suc = function(c){ alert("Contact 4: " + c.contacts[3].name); };
var fail = function(){};
navigator.ContactManager.get(suc, fail);
}
var watchAccel = function() {
var suc = function(a){
document.getElementById('x').innerHTML = roundNumber(a.x);
document.getElementById('y').innerHTML = roundNumber(a.y);
document.getElementById('z').innerHTML = roundNumber(a.z);
};
var fail = function(){};
var opt = {};
opt.frequency = 100;
timer = navigator.accelerometer.watchAcceleration(suc,fail,opt);
}
function roundNumber(num) {
var dec = 3;
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
return result;
}
var preventBehavior = function(e) {
e.preventDefault();
};
function show_pic()
{
var viewport = document.getElementById('viewport');
viewport.style.display = "";
navigator.camera.getPicture(dump_pic, fail, { quality: 50 });
}
function dump_pic(data)
{
var viewport = document.getElementById('viewport');
console.log(data);
viewport.style.display = "";
viewport.style.position = "absolute";
viewport.style.top = "10px";
viewport.style.left = "10px";
document.getElementById("test_img").src = "data:image/jpeg;base64," + data;
}
function close()
{
var viewport = document.getElementById('viewport');
viewport.style.position = "relative";
viewport.style.display = "none";
}
function fail(fail)
{
alert(fail);
}
// This is just to do this.
function readFile()
{
navigator.file.read('/sdcard/phonegap.txt', fail , fail);
}
function writeFile()
{
navigator.file.write('foo.txt', "This is a test of writing to a file", fail, fail);
}
function get_contacts()
{
navigator.ContactManager.getAllContacts(count_contacts, fail, null);
}
function count_contacts(contacts)
{
alert(contacts.length);
}
function init(){
document.addEventListener("touchmove", preventBehavior, false);
document.addEventListener("deviceReady", deviceInfo, true);
}
</script>
<title></title>
<script src="cordova-1.8.0rc1.js"></script>
</head>
<body onload="init();" id="stage" class="theme">
<h1>Welcome to PhoneGap!</h1>
<h2>this file is located at assets/index.html</h2>
<div id="info">
<h4>Platform: <span id="platform">&nbsp;</span></h4>
<h4>Version: <span id="version">&nbsp;</span></h4>
<h4>UUID: <span id="uuid">&nbsp;</span></h4>
</div>
<dl id="accel-data">
<dt>X:</dt><dd id="x">&nbsp;</dd>
<dt>Y:</dt><dd id="y">&nbsp;</dd>
<dt>Z:</dt><dd id="z">&nbsp;</dd>
</dl>
<a href="#" class="btn large" onclick="watchAccel();">Watch Accelerometer</a>
<a href="#" class="btn large" onclick="getLocation();">Get Location</a>
<a href="tel://411" class="btn large">Call 411</a>
<a href="#" class="btn large" onclick="beep();">Beep</a>
<a href="#" class="btn large" onclick="vibrate();">Vibrate</a>
<a href="#" class="btn large" onclick="show_pic();">Get a Picture</a>
<a href="#" class="btn large" onclick="get_contacts();">Get phone's contacts</a>
<div id="viewport" class="viewport" style="display: none;">
<img style="width:60px;height:60px" id="test_img" src="" />
</div>
<body>
</body>
</html>

View File

@@ -1,953 +0,0 @@
if (typeof(DeviceInfo) != 'object')
DeviceInfo = {};
/**
* This represents the PhoneGap API itself, and provides a global namespace for accessing
* information about the state of PhoneGap.
* @class
*/
PhoneGap = {
queue: {
ready: true,
commands: [],
timer: null
},
_constructors: []
};
/**
* Boolean flag indicating if the PhoneGap API is available and initialized.
*/
PhoneGap.available = DeviceInfo.uuid != undefined;
/**
* Add an initialization function to a queue that ensures it will run and initialize
* application constructors only once PhoneGap has been initialized.
* @param {Function} func The function callback you want run once PhoneGap is initialized
*/
PhoneGap.addConstructor = function(func) {
var state = document.readyState;
if (state != 'loaded' && state != 'complete')
PhoneGap._constructors.push(func);
else
func();
};
(function() {
var timer = setInterval(function() {
var state = document.readyState;
if (state != 'loaded' && state != 'complete')
return;
clearInterval(timer);
while (PhoneGap._constructors.length > 0) {
var constructor = PhoneGap._constructors.shift();
try {
constructor();
} catch(e) {
if (typeof(debug['log']) == 'function')
debug.log("Failed to run constructor: " + debug.processMessage(e));
else
alert("Failed to run constructor: " + e.message);
}
}
}, 1);
})();
/**
* Execute a PhoneGap command in a queued fashion, to ensure commands do not
* execute with any race conditions, and only run when PhoneGap is ready to
* recieve them.
* @param {String} command Command to be run in PhoneGap, e.g. "ClassName.method"
* @param {String[]} [args] Zero or more arguments to pass to the method
*/
PhoneGap.exec = function() {
PhoneGap.queue.commands.push(arguments);
if (PhoneGap.queue.timer == null)
PhoneGap.queue.timer = setInterval(PhoneGap.run_command, 10);
};
/**
* Internal function used to dispatch the request to PhoneGap. This needs to be implemented per-platform to
* ensure that methods are called on the phone in a way appropriate for that device.
* @private
*/
PhoneGap.run_command = function() {
};
function Acceleration(x, y, z)
{
this.x = x;
this.y = y;
this.z = z;
}
// Need to define these for android
_accel = {}
_accel.x = 0;
_accel.y = 0;
_accel.z = 0;
function gotAccel(x, y, z)
{
_accel.x = x;
_accel.y = y;
_accel.z = z;
}
/**
* This class provides access to device accelerometer data.
* @constructor
*/
function Accelerometer() {
/**
* The last known acceleration.
*/
this.lastAcceleration = null;
}
/**
* Asynchronously aquires the current acceleration.
* @param {Function} successCallback The function to call when the acceleration
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the acceleration data.
* @param {AccelerationOptions} options The options for getting the accelerometer data
* such as timeout.
*/
Accelerometer.prototype.getCurrentAcceleration = function(successCallback, errorCallback, options) {
// If the acceleration is available then call success
// If the acceleration is not available then call error
// Created for iPhone, Iphone passes back _accel obj litteral
if (typeof successCallback == "function") {
var accel = new Acceleration(_accel.x,_accel.y,_accel.z);
Accelerometer.lastAcceleration = accel;
successCallback(accel);
}
}
/**
* Asynchronously aquires the acceleration repeatedly at a given interval.
* @param {Function} successCallback The function to call each time the acceleration
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the acceleration data.
* @param {AccelerationOptions} options The options for getting the accelerometer data
* such as timeout.
*/
Accelerometer.prototype.watchAcceleration = function(successCallback, errorCallback, options) {
// TODO: add the interval id to a list so we can clear all watches
var frequency = (options != undefined)? options.frequency : 10000;
Accel.start(frequency);
return setInterval(function() {
navigator.accelerometer.getCurrentAcceleration(successCallback, errorCallback, options);
}, frequency);
}
/**
* Clears the specified accelerometer watch.
* @param {String} watchId The ID of the watch returned from #watchAcceleration.
*/
Accelerometer.prototype.clearWatch = function(watchId) {
Accel.stop();
clearInterval(watchId);
}
PhoneGap.addConstructor(function() {
if (typeof navigator.accelerometer == "undefined") navigator.accelerometer = new Accelerometer();
});
/**
* This class provides access to the device camera.
* @constructor
*/
function Camera() {
}
/**
*
* @param {Function} successCallback
* @param {Function} errorCallback
* @param {Object} options
*/
Camera.prototype.getPicture = function(successCallback, errorCallback, options) {
this.winCallback = successCallback;
this.failCallback = errorCallback;
if (options.quality)
{
GapCam.takePicture(options.quality);
}
else
{
GapCam.takePicture(80);
}
}
Camera.prototype.win = function(picture)
{
this.winCallback(picture);
}
Camera.prototype.fail = function(err)
{
this.failCallback(err);
}
PhoneGap.addConstructor(function() {
if (typeof navigator.camera == "undefined") navigator.camera = new Camera();
});
/**
* This class provides access to device Compass data.
* @constructor
*/
function Compass() {
/**
* The last known Compass position.
*/
this.lastHeading = null;
this.lastError = null;
this.callbacks = {
onHeadingChanged: [],
onError: []
};
};
/**
* Asynchronously aquires the current heading.
* @param {Function} successCallback The function to call when the heading
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the heading data.
* @param {PositionOptions} options The options for getting the heading data
* such as timeout.
*/
Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) {
if (this.lastHeading == null) {
this.start(options);
}
else
if (typeof successCallback == "function") {
successCallback(this.lastHeading);
}
};
/**
* Asynchronously aquires the heading repeatedly at a given interval.
* @param {Function} successCallback The function to call each time the heading
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the heading data.
* @param {HeadingOptions} options The options for getting the heading data
* such as timeout and the frequency of the watch.
*/
Compass.prototype.watchHeading= function(successCallback, errorCallback, options) {
// Invoke the appropriate callback with a new Position object every time the implementation
// determines that the position of the hosting device has changed.
this.getCurrentHeading(successCallback, errorCallback, options);
var frequency = 100;
if (typeof(options) == 'object' && options.frequency)
frequency = options.frequency;
var self = this;
return setInterval(function() {
self.getCurrentHeading(successCallback, errorCallback, options);
}, frequency);
};
/**
* Clears the specified heading watch.
* @param {String} watchId The ID of the watch returned from #watchHeading.
*/
Compass.prototype.clearWatch = function(watchId) {
clearInterval(watchId);
};
/**
* Called by the geolocation framework when the current heading is found.
* @param {HeadingOptions} position The current heading.
*/
Compass.prototype.setHeading = function(heading) {
this.lastHeading = heading;
for (var i = 0; i < this.callbacks.onHeadingChanged.length; i++) {
var f = this.callbacks.onHeadingChanged.shift();
f(heading);
}
};
/**
* Called by the geolocation framework when an error occurs while looking up the current position.
* @param {String} message The text of the error message.
*/
Compass.prototype.setError = function(message) {
this.lastError = message;
for (var i = 0; i < this.callbacks.onError.length; i++) {
var f = this.callbacks.onError.shift();
f(message);
}
};
PhoneGap.addConstructor(function() {
if (typeof navigator.compass == "undefined") navigator.compass = new Compass();
});
/**
* This class provides access to the device contacts.
* @constructor
*/
function Contact(jsonObject) {
this.firstName = "";
this.lastName = "";
this.name = "";
this.phones = {};
this.emails = {};
this.address = "";
}
Contact.prototype.displayName = function()
{
// TODO: can be tuned according to prefs
return this.name;
}
function ContactManager() {
// Dummy object to hold array of contacts
this.contacts = [];
this.timestamp = new Date().getTime();
}
ContactManager.prototype.getAllContacts = function(successCallback, errorCallback, options) {
// Interface
}
PhoneGap.addConstructor(function() {
if (typeof navigator.ContactManager == "undefined") navigator.ContactManager = new ContactManager();
});
ContactManager.prototype.getAllContacts = function(successCallback, errorCallback, options) {
this.win = successCallback;
this.fail = errorCallback;
ContactHook.getContactsAndSendBack();
}
ContactManager.prototype.droidAddContact = function(name, phone, email)
{
var contact = new Contact();
contact.name = name;
contact.phones.primary = phone;
contact.emails.primary = email;
this.contacts.push(contact);
}
ContactManager.prototype.droidDone = function()
{
win(this.contacts);
}
/**
* this represents the mobile device, and provides properties for inspecting the model, version, UUID of the
* phone, etc.
* @constructor
*/
function Device() {
this.available = PhoneGap.available;
this.platform = null;
this.version = null;
this.name = null;
this.gap = null;
this.uuid = null;
try {
if (window.DroidGap) {
this.available = true;
this.uuid = window.DroidGap.getUuid();
this.version = window.DroidGap.getOSVersion();
this.gapVersion = window.DroidGap.getVersion();
this.platform = window.DroidGap.getPlatform();
this.name = window.DroidGap.getProductName();
} else {
this.platform = DeviceInfo.platform;
this.version = DeviceInfo.version;
this.name = DeviceInfo.name;
this.gap = DeviceInfo.gap;
this.uuid = DeviceInfo.uuid;
}
} catch(e) {
this.available = false;
}
}
PhoneGap.addConstructor(function() {
navigator.device = window.device = new Device();
var event = document.createEvent("Events");
event.initEvent('deviceReady', false, false);
document.dispatchEvent(event);
});
/**
* This class provides generic read and write access to the mobile device file system.
*/
function File() {
/**
* The data of a file.
*/
this.data = "";
/**
* The name of the file.
*/
this.name = "";
}
/**
* Reads a file from the mobile device. This function is asyncronous.
* @param {String} fileName The name (including the path) to the file on the mobile device.
* The file name will likely be device dependent.
* @param {Function} successCallback The function to call when the file is successfully read.
* @param {Function} errorCallback The function to call when there is an error reading the file from the device.
*/
File.prototype.read = function(fileName, successCallback, errorCallback) {
}
/**
* Writes a file to the mobile device.
* @param {File} file The file to write to the device.
*/
File.prototype.write = function(file) {
}
PhoneGap.addConstructor(function() {
if (typeof navigator.file == "undefined") navigator.file = new File();
});
File.prototype.read = function(fileName, successCallback, errorCallback) {
this.failCallback = errorCallback;
this.winCallback = successCallback;
return FileUtil.read(fileName);
}
File.prototype.hasRead = function(data)
{
if(data.substr("FAIL"))
this.failCallback(data);
else
this.winCallback(data);
}
/**
* Writes a file to the mobile device.
* @param {File} file The file to write to the device.
*/
File.prototype.write = function(file, str, mode, successCallback, failCallback) {
this.winCallback = successCallback;
this.failCallback = failCallback;
var call = FileUtil.write(file, str, mode);
}
File.prototype.testFileExists = function(file, successCallback, failCallback)
{
var exists = FileUtil.testFileExists(file);
if(exists)
successCallback();
else
failCallback();
return exists;
}
File.prototype.testDirectoryExists = function(file, successCallback, failCallback)
{
var exists = FileUtil.testDirectoryExists(file);
if(exists)
successCallback();
else
failCallback();
return exists;
}
File.prototype.createDirectory = function(dir, successCallback, failCallback)
{
var good = FileUtils.createDirectory(dir);
good ? successCallback() : failCallback();
}
File.prototype.deleteDirectory = function(dir, successCallback, failCallback)
{
var good = FileUtils.deleteDirectory(dir);
good ? successCallback() : failCallback();
}
File.prototype.deleteFile = function(dir, successCallback, failCallback)
{
var good = FileUtils.deleteFile(dir);
good ? successCallback() : failCallback();
}
File.prototype.getFreeDiskSpace = function(successCallback, failCallback)
{
var diskSpace = FileUtils.getFreeDiskSpace();
if(diskSpace > 0)
successCallback();
else
failCallback();
return diskSpace;
}
/**
* This class provides access to device GPS data.
* @constructor
*/
function Geolocation() {
/**
* The last known GPS position.
*/
this.lastPosition = null;
this.lastError = null;
this.callbacks = {
onLocationChanged: [],
onError: []
};
};
/**
* Asynchronously aquires the current position.
* @param {Function} successCallback The function to call when the position
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the position data.
* @param {PositionOptions} options The options for getting the position data
* such as timeout.
*/
Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options) {
var referenceTime = 0;
if (this.lastPosition)
referenceTime = this.lastPosition.timeout;
else
this.start(options);
var timeout = 20000;
var interval = 500;
if (typeof(options) == 'object' && options.interval)
interval = options.interval;
if (typeof(successCallback) != 'function')
successCallback = function() {};
if (typeof(errorCallback) != 'function')
errorCallback = function() {};
var dis = this;
var delay = 0;
var timer = setInterval(function() {
delay += interval;
if (typeof(dis.lastPosition) == 'object' && dis.lastPosition.timestamp > referenceTime) {
successCallback(dis.lastPosition);
clearInterval(timer);
} else if (delay >= timeout) {
errorCallback();
clearInterval(timer);
}
}, interval);
};
/**
* Asynchronously aquires the position repeatedly at a given interval.
* @param {Function} successCallback The function to call each time the position
* data is available
* @param {Function} errorCallback The function to call when there is an error
* getting the position data.
* @param {PositionOptions} options The options for getting the position data
* such as timeout and the frequency of the watch.
*/
Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options) {
// Invoke the appropriate callback with a new Position object every time the implementation
// determines that the position of the hosting device has changed.
this.getCurrentPosition(successCallback, errorCallback, options);
var frequency = 10000;
if (typeof(options) == 'object' && options.frequency)
frequency = options.frequency;
var that = this;
return setInterval(function() {
that.getCurrentPosition(successCallback, errorCallback, options);
}, frequency);
};
/**
* Clears the specified position watch.
* @param {String} watchId The ID of the watch returned from #watchPosition.
*/
Geolocation.prototype.clearWatch = function(watchId) {
clearInterval(watchId);
};
/**
* Called by the geolocation framework when the current location is found.
* @param {PositionOptions} position The current position.
*/
Geolocation.prototype.setLocation = function(position) {
this.lastPosition = position;
for (var i = 0; i < this.callbacks.onLocationChanged.length; i++) {
var f = this.callbacks.onLocationChanged.shift();
f(position);
}
};
/**
* Called by the geolocation framework when an error occurs while looking up the current position.
* @param {String} message The text of the error message.
*/
Geolocation.prototype.setError = function(message) {
this.lastError = message;
for (var i = 0; i < this.callbacks.onError.length; i++) {
var f = this.callbacks.onError.shift();
f(message);
}
};
PhoneGap.addConstructor(function() {
if (typeof navigator.geolocation == "undefined") navigator.geolocation = new Geolocation();
});
/*
* Since we can't guarantee that we will have the most recent, we just try our best!
*
* Also, the API doesn't specify which version is the best version of the API
*/
Geolocation.prototype.getCurrentPosition = function(successCallback, errorCallback, options)
{
var position = Geo.getCurrentLocation();
this.global_success = successCallback;
this.fail = errorCallback;
}
// Run the global callback
Geolocation.prototype.gotCurrentPosition = function(lat, lng, alt, altacc, head, vel, stamp)
{
if (lat == "undefined" || lng == "undefined")
{
this.fail();
}
else
{
coords = new Coordinates(lat, lng, alt, altacc, head, vel);
loc = new Position(coords, stamp);
this.global_success(loc);
}
}
/*
* This turns on the GeoLocator class, which has two listeners.
* The listeners have their own timeouts, and run independently of this process
* In this case, we return the key to the watch hash
*/
Geolocation.prototype.watchPosition = function(successCallback, errorCallback, options)
{
var frequency = (options != undefined)? options.frequency : 10000;
if (!this.listeners)
{
this.listeners = [];
}
var key = this.listeners.push( {"success" : successCallback, "fail" : failCallback }) - 1;
// TO-DO: Get the names of the method and pass them as strings to the Java.
return Geolocation.start(frequency, key);
}
/*
* Retrieve and stop this listener from listening to the GPS
*
*/
Geolocation.prototype.success = function(key, lat, lng, alt, altacc, head, vel, stamp)
{
var coords = new Coordinates(lat, lng, alt, altacc, head, vel);
var loc = new Position(coords, stamp);
this.listeners[key].success(loc);
}
Geolocation.prototype.fail = function(key)
{
this.listeners[key].fail();
}
Geolocation.prototype.clearWatch = function(watchId)
{
Geo.stop(watchId);
}
/**
* This class provides access to the device media, interfaces to both sound and video
* @constructor
*/
function Media(src, successCallback, errorCallback) {
this.src = src;
this.successCallback = successCallback;
this.errorCallback = errorCallback;
}
Media.prototype.record = function() {
}
Media.prototype.play = function() {
}
Media.prototype.pause = function() {
}
Media.prototype.stop = function() {
}
/**
* This class contains information about any Media errors.
* @constructor
*/
function MediaError() {
this.code = null,
this.message = "";
}
MediaError.MEDIA_ERR_ABORTED = 1;
MediaError.MEDIA_ERR_NETWORK = 2;
MediaError.MEDIA_ERR_DECODE = 3;
MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
//if (typeof navigator.audio == "undefined") navigator.audio = new Media(src);
/**
* This class provides access to the device media, interfaces to both sound and video
* @constructor
*/
Media.prototype.play = function() {
DroidGap.startPlayingAudio(this.src);
}
Media.prototype.stop = function() {
DroidGap.stopPlayingAudio();
}
Media.prototype.startRecord = function() {
DroidGap.startRecordingAudio(this.src);
}
Media.prototype.stopRecordingAudio = function() {
DroidGap.stopRecordingAudio();
}
/**
* This class contains information about any NetworkStatus.
* @constructor
*/
function NetworkStatus() {
this.code = null;
this.message = "";
}
NetworkStatus.NOT_REACHABLE = 0;
NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK = 1;
NetworkStatus.REACHABLE_VIA_WIFI_NETWORK = 2;
/**
* This class provides access to device Network data (reachability).
* @constructor
*/
function Network() {
/**
* The last known Network status.
* { hostName: string, ipAddress: string,
remoteHostStatus: int(0/1/2), internetConnectionStatus: int(0/1/2), localWiFiConnectionStatus: int (0/2) }
*/
this.lastReachability = null;
};
/**
*
* @param {Function} successCallback
* @param {Function} errorCallback
* @param {Object} options (isIpAddress:boolean)
*/
Network.prototype.isReachable = function(hostName, successCallback, options) {
}
/**
* Called by the geolocation framework when the reachability status has changed.
* @param {Reachibility} reachability The current reachability status.
*/
Network.prototype.updateReachability = function(reachability) {
this.lastReachability = reachability;
};
PhoneGap.addConstructor(function() {
if (typeof navigator.network == "undefined") navigator.network = new Network();
});
Network.prototype.isReachable = function(uri, win, options)
{
var status = new NetworkStatus();
if(NetworkManager.isReachable(uri))
{
if (NetworkManager.isWifiActive)
status.code = 2;
else
status.code = 1;
}
else
status.code = 0;
win(status);
}
/**
* This class provides access to notifications on the device.
*/
function Notification() {
}
/**
* Open a native alert dialog, with a customizable title and button text.
* @param {String} message Message to print in the body of the alert
* @param {String} [title="Alert"] Title of the alert dialog (default: Alert)
* @param {String} [buttonLabel="OK"] Label of the close button (default: OK)
*/
Notification.prototype.alert = function(message, title, buttonLabel) {
// Default is to use a browser alert; this will use "index.html" as the title though
alert(message);
};
/**
* Start spinning the activity indicator on the statusbar
*/
Notification.prototype.activityStart = function() {
};
/**
* Stop spinning the activity indicator on the statusbar, if it's currently spinning
*/
Notification.prototype.activityStop = function() {
};
/**
* Causes the device to blink a status LED.
* @param {Integer} count The number of blinks.
* @param {String} colour The colour of the light.
*/
Notification.prototype.blink = function(count, colour) {
};
/**
* Causes the device to vibrate.
* @param {Integer} mills The number of milliseconds to vibrate for.
*/
Notification.prototype.vibrate = function(mills) {
};
/**
* Causes the device to beep.
* @param {Integer} count The number of beeps.
* @param {Integer} volume The volume of the beep.
*/
Notification.prototype.beep = function(count, volume) {
};
// TODO: of course on Blackberry and Android there notifications in the UI as well
PhoneGap.addConstructor(function() {
if (typeof navigator.notification == "undefined") navigator.notification = new Notification();
});
Notification.prototype.vibrate = function(mills)
{
DroidGap.vibrate(mills);
}
/*
* On the Android, we don't beep, we notify you with your
* notification! We shouldn't keep hammering on this, and should
* review what we want beep to do.
*/
Notification.prototype.beep = function(count, volume)
{
DroidGap.beep(count);
}
/**
* This class contains position information.
* @param {Object} lat
* @param {Object} lng
* @param {Object} acc
* @param {Object} alt
* @param {Object} altacc
* @param {Object} head
* @param {Object} vel
* @constructor
*/
function Position(coords, timestamp) {
this.coords = coords;
this.timestamp = new Date().getTime();
}
function Coordinates(lat, lng, alt, acc, head, vel) {
/**
* The latitude of the position.
*/
this.latitude = lat;
/**
* The longitude of the position,
*/
this.longitude = lng;
/**
* The accuracy of the position.
*/
this.accuracy = acc;
/**
* The altitude of the position.
*/
this.altitude = alt;
/**
* The direction the device is moving at the position.
*/
this.heading = head;
/**
* The velocity with which the device is moving at the position.
*/
this.speed = vel;
}
/**
* This class specifies the options for requesting position data.
* @constructor
*/
function PositionOptions() {
/**
* Specifies the desired position accuracy.
*/
this.enableHighAccuracy = true;
/**
* The timeout after which if position data cannot be obtained the errorCallback
* is called.
*/
this.timeout = 10000;
}
/**
* This class contains information about any GSP errors.
* @constructor
*/
function PositionError() {
this.code = null;
this.message = "";
}
PositionError.UNKNOWN_ERROR = 0;
PositionError.PERMISSION_DENIED = 1;
PositionError.POSITION_UNAVAILABLE = 2;
PositionError.TIMEOUT = 3;

View File

@@ -1,83 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="PhoneGap">
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<project name="Cordova" default="jar">
<!-- LOAD VERSION -->
<loadfile property="version" srcFile="../VERSION">
<filterchain>
<striplinebreaks/>
</filterchain>
</loadfile>
<!-- The local.properties file is created and updated by the 'android' tool.
It contain the path to the SDK. It should *NOT* be checked in in Version
Control Systems. -->
<property file="local.properties"/>
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<loadproperties srcFile="local.properties" />
<!-- The build.properties file can be created by you and is never touched
by the 'android' tool. This is the place to change some of the default property values
used by the Ant rules.
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
application-package
the name of your application package as defined in the manifest. Used by the
'uninstall' rule.
source-folder
the name of the source folder. Default is 'src'.
out-folder
the name of the output folder. Default is 'bin'.
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
Properties related to the SDK location or the project target should be updated
using the 'android' tool with the 'update' action.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems.
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="build.properties"/>
<property file="ant.properties" />
<!-- We need to setup the double quote. -->
<property name="dblQuote">"</property>
<!-- The default.properties file is created and updated by the 'android' tool, as well
as ADT.
This file is an integral part of the build system for your application and
should be checked in in Version Control Systems. -->
<property file="default.properties"/>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
<!-- Custom Android task to deal with the project target, and import the proper rules.
This requires ant 1.6.0 or above. -->
<path id="android.antlibs">
<pathelement path="${sdk-location}/tools/lib/anttasks.jar" />
<pathelement path="${sdk-location}/tools/lib/sdklib.jar" />
<pathelement path="${sdk-location}/tools/lib/androidprefs.jar" />
<pathelement path="${sdk-location}/tools/lib/apkbuilder.jar" />
<pathelement path="${sdk-location}/tools/lib/jarutils.jar" />
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project'"
unless="sdk.dir"
/>
<!-- version-tag: custom -->
<!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<!--
<target name="-pre-build">
</target>
<target name="-pre-compile">
</target>
/* This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir} */
<target name="-post-compile">
</target>
-->
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<import file="${sdk.dir}/tools/ant/build.xml" />
<!-- Combine JavaScript files into one cordova-uncompressed.js file. -->
<target name="build-javascript" depends="clean">
<!-- Clean up existing files -->
<!--<delete file="assets/www/cordova_${version}.js"/>-->
<!-- Create uncompressed JS file -->
<concat destfile="assets/www/cordova-${version}.js">
<filelist dir="assets/js" files="cordova.android.js"/>
</concat>
<!-- update project files to reference cordova-x.x.x.min.js -->
<replaceregexp match="cordova(.*)\.js" replace="cordova-${version}.js" byline="true">
<fileset file="assets/www/index.html" />
<fileset file="../bin/templates/project/cordova/templates/project/assets/www/index.html" />
</replaceregexp>
<!-- This is sketchy, but it works, ${dblQuote} does not -->
<replaceregexp match="cordovaVersion = [\u0022].*[\u0022];" replace='cordovaVersion = ${dblQuote}${version}${dblQuote};' byline="true">
<fileset file="src/org/apache/cordova/Device.java" />
</replaceregexp>
</target>
<!-- Build Cordova jar file that includes all native code, and Cordova JS file
that includes all JavaScript code.
-->
<target name="jar" depends="build-javascript, -compile">
<jar jarfile="cordova-${version}.jar" basedir="bin/classes" excludes="org/apache/cordova/R.class,org/apache/cordova/R$*.class"/>
</target>
<!-- tests for Java files -->
<property name="test.dir" location="test/org/apache/cordova" />
<path id="test.classpath">
<!-- requires both junit and cordova -->
<pathelement location="libs/junit-4.10.jar" />
<pathelement location="cordova-${version}.jar" />
<pathelement location="${test.dir}" />
</path>
<taskdef name="setup"
classname="com.android.ant.SetupTask"
classpathref="android.antlibs"/>
<!-- Execute the Android Setup task that will setup some properties specific to the target,
and import the rules files.
To customize the rules, copy/paste them below the task, and disable import by setting
the import attribute to false:
<setup import="false" />
This will ensure that the properties are setup correctly but that your customized
targets are used.
-->
<setup />
<!-- Grab the files, concatenate them and shove them in the
assets directory -->
<target name="move_files">
<concat destfile="assets/www/phonegap.js">
<fileset dir="../js" includes="phonegap.js.base" />
<fileset dir="../js" includes="*.js" />
</concat>
<target name="compile-test">
<javac srcdir="${test.dir}" >
<classpath refid="test.classpath" />
</javac>
</target>
<target name="jar" depends="move_files, compile">
<jar jarfile="phonegap.jar" basedir="bin/classes" excludes="**/R*.class" />
<target name="test" depends="jar, compile-test">
<junit showoutput="true">
<classpath refid="test.classpath" />
<formatter type="brief" usefile="false" />
<batchtest fork="yes">
<fileset dir="${test.dir}">
<include name="*Test.java" />
<include name="**/*Test.java" />
</fileset>
</batchtest>
</junit>
</target>
<target name="phonegap_debug" depends="move_files, debug">
</target>
<target name="cordova_debug" depends="build-javascript, debug">
</target>
<target name="phonegap_release" depends="move_files, release">
<target name="cordova_release" depends="build-javascript, release">
</target>
</project>

View File

@@ -7,8 +7,8 @@
# "build.properties", and override values to adapt the script to your
# project structure.
apk-configurations=
# Project target.
target=android-5
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
target=android-14
apk-configurations=

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc>
<jar path="PhoneGap/PhoneGap.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/PhoneGap/export-phonegap.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>
<manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
<sealing sealJar="false">
<packagesToSeal/>
<packagesToUnSeal/>
</sealing>
</manifest>
<selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
<javaElement handleIdentifier="=PhoneGap/src"/>
<javaElement handleIdentifier="=PhoneGap/gen"/>
</selectedElements>
</jardesc>

View File

@@ -1,30 +0,0 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.phonegap;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int appView=0x7f050000;
public static final int go=0x7f050002;
public static final int surface=0x7f050001;
}
public static final class layout {
public static final int main=0x7f030000;
public static final int preview=0x7f030001;
}
public static final class string {
public static final int app_name=0x7f040000;
public static final int go=0x7f040002;
public static final int url=0x7f040001;
}
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked in Version Control Systems,
# as it contains information specific to your local configuration.
# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
sdk-location=/home/bowserj/android-sdk-linux_x86-1.6_r1

View File

@@ -0,0 +1,14 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
target=Google Inc.:Google APIs:15
apk-configurations=

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
framework/res/drawable/splash.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -1,4 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="horizontal">
<SurfaceView android:id="@+id/surface"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_weight="1">
</SurfaceView>
<Button
android:id="@+id/go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/go"
android:minWidth="50dip"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="5dip"
android:layout_marginTop="5dip"
/>
</RelativeLayout>

View File

@@ -1,6 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<resources>
<string name="app_name">PhoneGap</string>
<string name="url">file:///android_asset/www/index.html</string>
<string name="go">Snap</string>
<string name="app_name">Cordova</string>
<string name="go">Snap</string>
</resources>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<cordova>
<!--
access elements control the Android whitelist.
Domains are assumed blocked unless set otherwise
-->
<access origin="http://127.0.0.1*"/> <!-- allow local pages -->
<!-- <access origin="https://example.com" /> allow any secure requests to example.com -->
<!-- <access origin="https://example.com" subdomains="true" /> such as above, but including subdomains, such as www -->
<!-- <access origin=".*"/> Allow all domains, suggested development use only -->
<log level="DEBUG"/>
<preference name="classicRender" value="true" />
</cordova>

38
framework/res/xml/plugins.xml Executable file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<plugins>
<plugin name="App" value="org.apache.cordova.App"/>
<plugin name="Geolocation" value="org.apache.cordova.GeoBroker"/>
<plugin name="Device" value="org.apache.cordova.Device"/>
<plugin name="Accelerometer" value="org.apache.cordova.AccelListener"/>
<plugin name="Compass" value="org.apache.cordova.CompassListener"/>
<plugin name="Media" value="org.apache.cordova.AudioHandler"/>
<plugin name="Camera" value="org.apache.cordova.CameraLauncher"/>
<plugin name="Contacts" value="org.apache.cordova.ContactManager"/>
<plugin name="File" value="org.apache.cordova.FileUtils"/>
<plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/>
<plugin name="Notification" value="org.apache.cordova.Notification"/>
<plugin name="Storage" value="org.apache.cordova.Storage"/>
<plugin name="Temperature" value="org.apache.cordova.TempListener"/>
<plugin name="FileTransfer" value="org.apache.cordova.FileTransfer"/>
<plugin name="Capture" value="org.apache.cordova.Capture"/>
<plugin name="Battery" value="org.apache.cordova.BatteryListener"/>
<plugin name="SplashScreen" value="org.apache.cordova.SplashScreen"/>
</plugins>

View File

@@ -1,77 +0,0 @@
package com.phonegap;
import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.content.Context;
import android.webkit.WebView;
public class AccelListener implements SensorEventListener{
WebView mAppView;
Context mCtx;
String mKey;
Sensor mSensor;
int mTime = 10000;
boolean started = false;
private SensorManager sensorManager;
private long lastUpdate = -1;
public AccelListener(Context ctx, WebView appView)
{
mCtx = ctx;
mAppView = appView;
sensorManager = (SensorManager) mCtx.getSystemService(Context.SENSOR_SERVICE);
}
public void start(int time)
{
mTime = time;
List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (list.size() > 0)
{
this.mSensor = list.get(0);
this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
else
{
// Call fail
}
}
public void stop()
{
if(started)
sensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
long curTime = System.currentTimeMillis();
if (lastUpdate == -1 || (curTime - lastUpdate) > mTime) {
lastUpdate = curTime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAppView.loadUrl("javascript:gotAccel(" + x + ", " + y + "," + z + " )");
}
}
}

View File

@@ -1,193 +0,0 @@
package com.phonegap;
import java.io.File;
import java.io.IOException;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaRecorder;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.util.Log;
public class AudioHandler implements OnCompletionListener, OnPreparedListener, OnErrorListener {
private MediaRecorder recorder;
private boolean isRecording = false;
MediaPlayer mPlayer;
private boolean isPlaying = false;
private String recording;
private String saveFile;
private Context mCtx;
public AudioHandler(String file, Context ctx) {
this.recording = file;
this.mCtx = ctx;
}
protected void startRecording(String file){
if (!isRecording){
saveFile=file;
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(this.recording);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
isRecording = true;
recorder.start();
}
}
private void moveFile(String file) {
/* this is a hack to save the file as the specified name */
File f = new File (this.recording);
f.renameTo(new File("/sdcard" + file));
}
protected void stopRecording(){
try{
if((recorder != null)&&(isRecording))
{
isRecording = false;
recorder.stop();
recorder.release();
}
moveFile(saveFile);
}
catch (Exception e)
{
e.printStackTrace();
}
}
protected void startPlaying(String file) {
if (isPlaying==false) {
try {
mPlayer = new MediaPlayer();
isPlaying=true;
Log.d("Audio startPlaying", "audio: " + file);
if (isStreaming(file))
{
Log.d("AudioStartPlaying", "Streaming");
// Streaming prepare async
mPlayer.setDataSource(file);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.prepareAsync();
} else {
Log.d("AudioStartPlaying", "File");
// Not streaming prepare synchronous, abstract base directory
mPlayer.setDataSource("/sdcard/" + file);
mPlayer.prepare();
}
mPlayer.setOnPreparedListener(this);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
public void stopPlaying() {
if (isPlaying) {
mPlayer.stop();
mPlayer.release();
isPlaying=false;
}
}
public void onCompletion(MediaPlayer mPlayer) {
mPlayer.stop();
mPlayer.release();
isPlaying=false;
}
protected long getCurrentPosition() {
if (isPlaying)
{
return(mPlayer.getCurrentPosition());
} else { return(-1); }
}
private boolean isStreaming(String file)
{
if (file.contains("http://")) {
return true;
} else {
return false;
}
}
protected long getDuration(String file) {
long duration = -2;
if (!isPlaying & !isStreaming(file)) {
try {
mPlayer = new MediaPlayer();
mPlayer.setDataSource("/sdcard/" + file);
mPlayer.prepare();
duration = mPlayer.getDuration();
mPlayer.release();
} catch (Exception e) { e.printStackTrace(); return(-3); }
} else
if (isPlaying & !isStreaming(file)) {
duration = mPlayer.getDuration();
} else
if (isPlaying & isStreaming(file)) {
try {
duration = mPlayer.getDuration();
} catch (Exception e) { e.printStackTrace(); return(-4); }
}else { return -1; }
return duration;
}
public void onPrepared(MediaPlayer mPlayer) {
if (isPlaying) {
mPlayer.setOnCompletionListener(this);
mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener()
{
public void onBufferingUpdate(MediaPlayer mPlayer, int percent)
{
/* TODO: call back, e.g. update outer progress bar */
Log.d("AudioOnBufferingUpdate", "percent: " + percent);
}
});
mPlayer.start();
}
}
public boolean onError(MediaPlayer mPlayer, int arg1, int arg2) {
Log.e("AUDIO onError", "error " + arg1 + " " + arg2);
return false;
}
protected void setAudioOutputDevice(int output){
// Changes the default audio output device to speaker or earpiece
AudioManager audiMgr = (AudioManager) mCtx.getSystemService(Context.AUDIO_SERVICE);
if (output == (2))
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
else if (output == (1)){
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
}else
Log.e("AudioHandler setAudioOutputDevice", " unknown output device");
}
protected int getAudioOutputDevice(){
AudioManager audiMgr = (AudioManager) mCtx.getSystemService(Context.AUDIO_SERVICE);
if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE)
return 1;
else if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_SPEAKER)
return 2;
else
return -1;
}
}

View File

@@ -1,34 +0,0 @@
package com.phonegap;
import android.webkit.WebView;
public class CameraLauncher {
private WebView mAppView;
private DroidGap mGap;
int quality;
CameraLauncher(WebView view, DroidGap gap)
{
mAppView = view;
mGap = gap;
}
public void takePicture(int quality)
{
mGap.startCamera(quality);
}
/* Return Base64 Encoded String to Javascript */
public void processPicture( String js_out )
{
mAppView.loadUrl("javascript:navigator.camera.win('" + js_out + "');");
}
public void failPicture(String err)
{
mAppView.loadUrl("javascript:navigator.camera.fail('" + err + "');");
}
}

View File

@@ -1,218 +0,0 @@
package com.phonegap;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class CameraPreview extends Activity implements SurfaceHolder.Callback{
private static final String TAG = "PhoneGapCamera";
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private RelativeLayout root;
Camera mCamera;
boolean mPreviewRunning = false;
int quality;
Intent mIntent;
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
Log.e(TAG, "onCreate");
getWindow().setFormat(PixelFormat.TRANSLUCENT);
RelativeLayout.LayoutParams containerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
LinearLayout.LayoutParams surfaceParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 0.0F);
RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
root = new RelativeLayout(this);
root.setLayoutParams(containerParams);
mSurfaceView = new SurfaceView(this);
mSurfaceView.setLayoutParams(surfaceParams);
root.addView(mSurfaceView);
Button stopButton = new Button(this);
stopButton.setText("click");
buttonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
buttonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
buttonParams.rightMargin = 5;
buttonParams.topMargin = 5;
stopButton.setLayoutParams(buttonParams);
root.addView(stopButton);
setContentView(root);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mIntent = this.getIntent();
quality = mIntent.getIntExtra("quality", 100);
stopButton.setOnClickListener(mSnapListener);
}
private OnClickListener mSnapListener = new OnClickListener() {
public void onClick(View v) {
mCamera.takePicture(null, null, mPictureCallback);
}
};
public boolean onCreateOptionsMenu(android.view.Menu menu) {
MenuItem item = menu.add(0, 0, 0, "goto gallery");
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Uri target = Uri.parse("content://media/external/images/media");
Intent intent = new Intent(Intent.ACTION_VIEW, target);
startActivity(intent);
return true;
}
});
return true;
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
}
/*
* We got the data, send it back to PhoneGap to be handled and processed.
*
*/
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera c) {
Log.e(TAG, "PICTURE CALLBACK: data.length = " + data.length);
storeAndExit(data);
}
};
/*
* We can't just store and exit, because Android freezes up when we try to cram a picture across a process in a Bundle.
* We HAVE to compress this data and send back the compressed data
*/
public void storeAndExit(byte[] data)
{
ByteArrayOutputStream jpeg_data = new ByteArrayOutputStream();
Bitmap myMap = BitmapFactory.decodeByteArray(data, 0, data.length);
try {
if (myMap.compress(CompressFormat.JPEG, quality, jpeg_data))
{
byte[] code = jpeg_data.toByteArray();
byte[] output = Base64.encodeBase64(code);
String js_out = new String(output);
mIntent.putExtra("picture", js_out);
setResult(RESULT_OK, mIntent);
}
}
catch(Exception e)
{
//Do shit here
}
finish();
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK) {
return super.onKeyDown(keyCode, event);
}
if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_SEARCH) {
mCamera.takePicture(null, null, mPictureCallback);
return true;
}
return false;
}
protected void onResume()
{
Log.e(TAG, "onResume");
super.onResume();
}
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
}
protected void onStop()
{
Log.e(TAG, "onStop");
super.onStop();
}
public void surfaceCreated(SurfaceHolder holder)
{
Log.e(TAG, "surfaceCreated");
mCamera = Camera.open();
//mCamera.startPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Log.e(TAG, "surfaceChanged");
// XXX stopPreview() will crash if preview is not running
if (mPreviewRunning) {
mCamera.stopPreview();
}
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(w, h);
mCamera.setParameters(p);
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mCamera.startPreview();
mPreviewRunning = true;
}
public void surfaceDestroyed(SurfaceHolder holder)
{
Log.e(TAG, "surfaceDestroyed");
mCamera.stopPreview();
mPreviewRunning = false;
mCamera.release();
}
}

View File

@@ -1,54 +0,0 @@
package com.phonegap;
import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.content.Context;
import android.webkit.WebView;
public class CompassListener implements SensorEventListener{
WebView mAppView;
Context mCtx;
Sensor mSensor;
private SensorManager sensorManager;
CompassListener(Context ctx, WebView appView)
{
mCtx = ctx;
mAppView = appView;
sensorManager = (SensorManager) mCtx.getSystemService(Context.SENSOR_SERVICE);
}
public void start()
{
List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if (list.size() > 0)
{
this.mSensor = list.get(0);
this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
public void stop()
{
this.sensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// We only care about the orientation as far as it refers to Magnetic North
float heading = event.values[0];
mAppView.loadUrl("javascript:navigator.compass.setHeading(" + heading + ")");
}
}

View File

@@ -1,291 +0,0 @@
package com.phonegap;
import android.provider.Contacts.ContactMethods;
import android.provider.Contacts.People;
import android.util.Log;
import android.webkit.WebView;
import android.app.Activity;
import android.content.ContentResolver;
import android.net.Uri;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
@SuppressWarnings("deprecation")
public class ContactManager {
public class ContactTriplet
{
public String name = "";
public String email = "";
public String phone = "";
}
private static final String LOG_TAG = "Contact Query";
Activity mApp;
WebView mView;
Uri mPeople = android.provider.Contacts.People.CONTENT_URI;
Uri mPhone = android.provider.Contacts.Phones.CONTENT_URI;
Uri mEmail = android.provider.Contacts.ContactMethods.CONTENT_URI;
ContactManager(Activity app, WebView view)
{
mApp = app;
mView = view;
}
// This is to add backwards compatibility to the OLD Contacts API\
public void getContactsAndSendBack()
{
String[] projection = new String[] {
People._ID,
People.NAME,
People.NUMBER,
People.PRIMARY_EMAIL_ID
};
try{
Cursor myCursor = mApp.managedQuery(mPeople, projection,
null, null , People.NAME + " ASC");
processResults(myCursor, true);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
}
}
public void search(String name, String npa, String email)
{
if (email.length() > 0)
searchByEmail(email);
else
searchPeople(name, npa);
}
private void searchByEmail(String email)
{
String[] projection = new String[] {
ContactMethods._ID,
ContactMethods.DATA,
ContactMethods.KIND,
ContactMethods.PERSON_ID
};
String[] variables = new String[] {
email
};
try{
Cursor myCursor = mApp.managedQuery(mEmail, projection,
"contact_methods." + ContactMethods.DATA + " = ?" + "AND contact_methods.kind = 1", variables , ContactMethods.DATA + " ASC");
getMethodData(myCursor);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
}
}
private void searchPeople(String name, String number)
{
String conditions = "";
if (name.length() == 0)
{
name = "%";
conditions += People.NAME + " LIKE ? AND ";
}
else
{
conditions += People.NAME + " = ? AND ";
}
if (number.length() == 0)
number = "%";
else
{
number = number.replace('+', '%');
number = number.replace('.', '%');
number = number.replace('-', '%');
}
conditions += People.NUMBER + " LIKE ? ";
String[] projection = new String[] {
People._ID,
People.NAME,
People.NUMBER,
People.PRIMARY_EMAIL_ID
};
String[] variables = new String[] {
name, number
};
try{
Cursor myCursor = mApp.managedQuery(mPeople, projection,
conditions, variables , People.NAME + " ASC");
processResults(myCursor, false);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
}
}
private void processResults(Cursor cur, boolean all){
if (cur.moveToFirst()) {
String name;
String phoneNumber;
String email_id;
String email;
int nameColumn = cur.getColumnIndex(People.NAME);
int phoneColumn = cur.getColumnIndex(People.NUMBER);
int emailIdColumn = cur.getColumnIndex(People.PRIMARY_EMAIL_ID);
do {
// Get the field values
name = cur.getString(nameColumn);
phoneNumber = cur.getString(phoneColumn);
email_id = cur.getString(emailIdColumn);
if (email_id != null && email_id.length() > 0)
email = getEmail(email_id);
else
email = "";
// Code for backwards compatibility with the OLD Contacts API
if (all)
mView.loadUrl("javascript:navigator.ContactManager.droidAddContact('" + name + "','" + phoneNumber + "','" + email +"')");
else
mView.loadUrl("javascript:navigator.contacts.droidFoundContact('" + name + "','" + phoneNumber + "','" + email +"')");
} while (cur.moveToNext());
if (all)
mView.loadUrl("javascript:navigator.ContactManager.droidDone()");
else
mView.loadUrl("javascript:navigator.contacts.droidDone();");
}
else
{
if(all)
mView.loadUrl("javascript:navigator.ContactManager.fail()");
else
mView.loadUrl("javascript:navigator.contacts.fail('None found!')");
}
}
private void getMethodData(Cursor cur)
{
ContactTriplet data = new ContactTriplet();
String id;
String email;
if (cur.moveToFirst()) {
int idColumn = cur.getColumnIndex(ContactMethods._ID);
int emailColumn = cur.getColumnIndex(ContactMethods.DATA);
do {
// Get the field values
id = cur.getString(idColumn);
email = cur.getString(emailColumn);
data = getContactData(id);
if(data != null)
{
data.email = email;
mView.loadUrl("javascript:navigator.Contacts.droidFoundContact('" + data.name + "','" + data.phone + "','" + data.email +"')");
}
} while (cur.moveToNext());
mView.loadUrl("javascript:navigator.contacts.droidDoneContacts();");
}
}
private ContactTriplet getContactData(String id) {
ContactTriplet data = null;
String[] projection = new String[] {
People._ID,
People.NAME,
People.NUMBER,
People.PRIMARY_EMAIL_ID
};
String[] variables = new String[] {
id
};
try{
Cursor myCursor = mApp.managedQuery(mPeople, projection,
People.PRIMARY_EMAIL_ID + " = ?", variables , People.NAME + " ASC");
data = getTriplet(myCursor);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
}
return data;
}
private ContactTriplet getTriplet(Cursor cur) {
ContactTriplet data = new ContactTriplet();
if (cur.moveToFirst()) {
int nameColumn = cur.getColumnIndex(People.NAME);
int numberColumn = cur.getColumnIndex(People.NUMBER);
do {
data.name = cur.getString(nameColumn);
data.phone = cur.getString(numberColumn);
} while (cur.moveToNext());
}
return data;
}
private String getEmailColumnData(Cursor cur)
{
String email = "";
if (cur != null && cur.moveToFirst()) {
int emailColumn = cur.getColumnIndex(ContactMethods.DATA);
do {
// Get the field values
email = cur.getString(emailColumn);
} while (cur.moveToNext());
}
return email;
}
private String getEmail(String id)
{
String email = "";
String[] projection = new String[] {
ContactMethods._ID,
ContactMethods.DATA,
ContactMethods.KIND
};
String[] variables = new String[] {
id
};
try
{
Cursor myCursor = mApp.managedQuery(mEmail, projection,
"contact_methods." + ContactMethods._ID + " = ?" + " AND contact_methods.kind = 1", variables , ContactMethods.DATA + " ASC");
email = getEmailColumnData(myCursor);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
}
return email;
}
}

View File

@@ -1,126 +0,0 @@
package com.phonegap;
import java.io.File;
import android.os.Environment;
import android.os.StatFs;
import android.util.Log;
public class DirectoryManager {
protected boolean testFileExists (String name){
boolean status;
if ((testSaveLocationExists())&&(!name.equals(""))){
File path = Environment.getExternalStorageDirectory();
File newPath = constructFilePaths(path.toString(), name);
status = newPath.exists();
}else{
status = false;
}
return status;
}
protected long getFreeDiskSpace(){
/*
* gets the available SD card free space or returns -1 if the SD card is not mounted.
*/
String status = Environment.getExternalStorageState();
long freeSpace = 0;
if (status.equals(Environment.MEDIA_MOUNTED)) {
try {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
freeSpace = availableBlocks*blockSize/1024;
} catch (Exception e) {e.printStackTrace(); }
} else { return -1; }
return (freeSpace);
}
protected boolean createDirectory(String directoryName){
boolean status;
if ((testSaveLocationExists())&&(!directoryName.equals(""))){
File path = Environment.getExternalStorageDirectory();
File newPath = constructFilePaths(path.toString(), directoryName);
status = newPath.mkdir();
status = true;
}else
status = false;
return status;
}
protected boolean testSaveLocationExists(){
String sDCardStatus = Environment.getExternalStorageState();
boolean status;
if (sDCardStatus.equals(Environment.MEDIA_MOUNTED)){
status = true;
}else
status = false;
return status;
}
protected boolean deleteDirectory(String fileName){
boolean status;
SecurityManager checker = new SecurityManager();
if ((testSaveLocationExists())&&(!fileName.equals(""))){
File path = Environment.getExternalStorageDirectory();
File newPath = constructFilePaths(path.toString(), fileName);
checker.checkDelete(newPath.toString());
if(newPath.isDirectory()){
String[] listfile = newPath.list();
// delete all files within the specified directory and then delete the directory
try{
for (int i=0; i < listfile.length; i++){
File deletedFile = new File (newPath.toString()+"/"+listfile[i].toString());
deletedFile.delete();
}
newPath.delete();
Log.i("DirectoryManager deleteDirectory", fileName);
status = true;
}catch (Exception e){
e.printStackTrace();
status = false;
}
}else
status = false;
}else
status = false;
return status;
}
protected boolean deleteFile(String fileName){
boolean status;
SecurityManager checker = new SecurityManager();
if ((testSaveLocationExists())&&(!fileName.equals(""))){
File path = Environment.getExternalStorageDirectory();
File newPath = constructFilePaths(path.toString(), fileName);
checker.checkDelete(newPath.toString());
if (newPath.isFile()){
try {
Log.i("DirectoryManager deleteFile", fileName);
newPath.delete();
status = true;
}catch (SecurityException se){
se.printStackTrace();
status = false;
}
}else
status = false;
}else
status = false;
return status;
}
private File constructFilePaths (String file1, String file2){
File newPath;
newPath = new File(file1+"/"+file2);
return newPath;
}
}

View File

@@ -1,296 +0,0 @@
package com.phonegap;
/* License (MIT)
* Copyright (c) 2008 Nitobi
* website: http://phonegap.com
* 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.
*/
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.widget.LinearLayout;
import android.os.Build.*;
public class DroidGap extends Activity {
private static final String LOG_TAG = "DroidGap";
protected WebView appView;
private LinearLayout root;
private PhoneGap gap;
private GeoBroker geo;
private AccelListener accel;
private CameraLauncher launcher;
private ContactManager mContacts;
private FileUtils fs;
private NetworkManager netMan;
private CompassListener mCompass;
private Storage cupcakeStorage;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
// This builds the view. We could probably get away with NOT having a LinearLayout, but I like having a bucket!
LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 0.0F);
LinearLayout.LayoutParams webviewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT, 1.0F);
root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
root.setBackgroundColor(Color.BLACK);
root.setLayoutParams(containerParams);
appView = new WebView(this);
appView.setLayoutParams(webviewParams);
WebViewReflect.checkCompatibility();
/* This changes the setWebChromeClient to log alerts to LogCat! Important for Javascript Debugging */
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ECLAIR)
appView.setWebChromeClient(new EclairClient(this));
else
{
appView.setWebChromeClient(new GapClient(this));
cupcakeStorage = new Storage(appView);
}
appView.setInitialScale(100);
appView.setVerticalScrollBarEnabled(false);
WebSettings settings = appView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
Package pack = this.getClass().getPackage();
String appPackage = pack.getName();
WebViewReflect.setStorage(settings, true, "/data/data/" + appPackage + "/app_database/");
/* Bind the appView object to the gap class methods */
bindBrowser(appView);
root.addView(appView);
setContentView(root);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
//don't reload the current page when the orientation is changed
super.onConfigurationChanged(newConfig);
}
private void bindBrowser(WebView appView)
{
gap = new PhoneGap(this, appView);
geo = new GeoBroker(appView, this);
accel = new AccelListener(this, appView);
launcher = new CameraLauncher(appView, this);
mContacts = new ContactManager(this, appView);
fs = new FileUtils(appView);
netMan = new NetworkManager(this, appView);
mCompass = new CompassListener(this, appView);
// This creates the new javascript interfaces for PhoneGap
appView.addJavascriptInterface(gap, "DroidGap");
appView.addJavascriptInterface(geo, "Geo");
appView.addJavascriptInterface(accel, "Accel");
appView.addJavascriptInterface(launcher, "GapCam");
appView.addJavascriptInterface(mContacts, "ContactHook");
appView.addJavascriptInterface(fs, "FileUtil");
appView.addJavascriptInterface(netMan, "NetworkManager");
appView.addJavascriptInterface(mCompass, "CompassHook");
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.DONUT)
{
cupcakeStorage = new Storage(appView);
appView.addJavascriptInterface(cupcakeStorage, "droidStorage");
}
}
public void loadUrl(String url)
{
appView.loadUrl(url);
}
/**
* Provides a hook for calling "alert" from javascript. Useful for
* debugging your javascript.
*/
public class GapClient extends WebChromeClient {
Context mCtx;
public GapClient(Context ctx)
{
mCtx = ctx;
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(LOG_TAG, message);
// This shows the dialog box. This can be commented out for dev
AlertDialog.Builder alertBldr = new AlertDialog.Builder(mCtx);
GapOKDialog okHook = new GapOKDialog();
GapCancelDialog cancelHook = new GapCancelDialog();
alertBldr.setMessage(message);
alertBldr.setTitle("Alert");
alertBldr.setCancelable(true);
alertBldr.setPositiveButton("OK", okHook);
alertBldr.setNegativeButton("Cancel", cancelHook);
alertBldr.show();
result.confirm();
return true;
}
/*
* This is the Code for the OK Button
*/
public class GapOKDialog implements DialogInterface.OnClickListener {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}
public class GapCancelDialog implements DialogInterface.OnClickListener {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}
}
public final class EclairClient extends GapClient
{
private long MAX_QUOTA = 2000000;
public EclairClient(Context ctx) {
super(ctx);
// TODO Auto-generated constructor stub
}
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize,
long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
{
if( estimatedSize < MAX_QUOTA)
{
long newQuota = estimatedSize;
quotaUpdater.updateQuota(newQuota);
}
else
{
// Set the quota to whatever it is and force an error
// TODO: get docs on how to handle this properly
quotaUpdater.updateQuota(currentQuota);
}
}
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK) {
String testUrl = appView.getUrl();
appView.goBack();
if(appView.getUrl() == testUrl)
{
return super.onKeyDown(keyCode, event);
}
}
if (keyCode == KeyEvent.KEYCODE_MENU)
{
appView.loadUrl("javascript:keyEvent.menuTrigger()");
}
if (keyCode == KeyEvent.KEYCODE_SEARCH)
{
appView.loadUrl("javascript:keyEvent.searchTrigger()");
}
return false;
}
// This is required to start the camera activity! It has to come from the previous activity
public void startCamera(int quality)
{
Intent i = new Intent(this, CameraPreview.class);
i.setAction("android.intent.action.PICK");
i.putExtra("quality", quality);
startActivityForResult(i, 0);
}
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
String data;
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == RESULT_OK)
{
data = intent.getStringExtra("picture");
// Send the graphic back to the class that needs it
launcher.processPicture(data);
}
else
{
launcher.failPicture("Did not complete!");
}
}
public WebView getView()
{
return this.appView;
}
}

View File

@@ -1,124 +0,0 @@
package com.phonegap;
import java.io.*;
import android.webkit.WebView;
public class FileUtils {
WebView mView;
DirectoryManager fileManager;
FileReader f_in;
FileWriter f_out;
FileUtils(WebView view)
{
mView = view;
}
public int testSaveLocationExists(){
if (fileManager.testSaveLocationExists())
return 0;
else
return 1;
}
public long getFreeDiskSpace(){
long freeDiskSpace=fileManager.getFreeDiskSpace();
return freeDiskSpace;
}
public int testFileExists(String file){
if (fileManager.testFileExists(file))
return 0;
else
return 1;
}
public int testDirectoryExists(String file){
if (fileManager.testFileExists(file))
return 0;
else
return 1;
}
/**
* Delete a specific directory.
* Everyting in side the directory would be gone.
* TODO: JavaScript Call backs for success and error handling
*/
public int deleteDirectory (String dir){
if (fileManager.deleteDirectory(dir))
return 0;
else
return 1;
}
/**
* Delete a specific file.
* TODO: JavaScript Call backs for success and error handling
*/
public int deleteFile (String file){
if (fileManager.deleteFile(file))
return 0;
else
return 1;
}
/**
* Create a new directory.
* TODO: JavaScript Call backs for success and error handling
*/
public int createDirectory(String dir){
if (fileManager.createDirectory(dir))
return 0;
else
return 1;
}
public String read(String filename)
{
String data = "";
String output = "";
try {
FileInputStream fstream = new FileInputStream(filename);
DataInputStream in = new DataInputStream(fstream);
while (in.available() !=0)
{
data += in.readLine();
}
} catch (FileNotFoundException e) {
data = "FAIL: File not found";
} catch (IOException e) {
data = "FAIL: IO ERROR";
}
mView.loadUrl("javascript:navigator.file.hasRead('" + data + "')");
return data;
}
public int write(String filename, String data, boolean append)
{
String FilePath= filename;
try {
byte [] rawData = data.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(rawData);
FileOutputStream out= new FileOutputStream(FilePath, append);
byte buff[] = new byte[rawData.length];
in.read(buff, 0, buff.length);
out.write(buff, 0, rawData.length);
out.flush();
out.close();
mView.loadUrl("javascript:navigator.file.winCallback('File written')");
} catch (Exception e) {
mView.loadUrl("javascript:navigator.file.failCallback('Fail')");
}
return 0;
}
}

View File

@@ -1,47 +0,0 @@
package com.phonegap;
import java.util.HashMap;
import android.content.Context;
import android.location.Location;
import android.webkit.WebView;
/*
* This class is the interface to the Geolocation. It's bound to the geo object.
*
* This class only starts and stops various GeoListeners, which consist of a GPS and a Network Listener
*/
public class GeoBroker {
private WebView mAppView;
private Context mCtx;
private HashMap<String, GeoListener> geoListeners;
public GeoBroker(WebView view, Context ctx)
{
mCtx = ctx;
mAppView = view;
}
public void getCurrentLocation()
{
GeoListener listener = new GeoListener("global", mCtx, 10000, mAppView);
Location loc = listener.getCurrentLocation();
String params = loc.getLatitude() + "," + loc.getLongitude() + ", " + loc.getAltitude() + "," + loc.getAccuracy() + "," + loc.getBearing();
params += "," + loc.getSpeed() + "," + loc.getTime();
mAppView.loadUrl("javascript:navigator.geolocation.gotCurrentPosition(" + params + ")");
listener.stop();
}
public String start(int freq, String key)
{
GeoListener listener = new GeoListener(key, mCtx, freq, mAppView);
geoListeners.put(key, listener);
return key;
}
public void stop(String key)
{
GeoListener geo = geoListeners.get(key);
}
}

View File

@@ -1,71 +0,0 @@
package com.phonegap;
import android.content.Context;
import android.location.Location;
import android.webkit.WebView;
public class GeoListener {
String id;
String successCallback;
String failCallback;
GpsListener mGps;
NetworkListener mNetwork;
Context mCtx;
private WebView mAppView;
int interval;
GeoListener(String i, Context ctx, int time, WebView appView)
{
id = i;
interval = time;
mCtx = ctx;
mGps = new GpsListener(mCtx, interval, this);
mNetwork = new NetworkListener(mCtx, interval, this);
mAppView = appView;
}
void success(Location loc)
{
/*
* We only need to figure out what we do when we succeed!
*/
String params;
/*
* Build the giant string to send back to Javascript!
*/
params = loc.getLatitude() + "," + loc.getLongitude() + ", " + loc.getAltitude() + "," + loc.getAccuracy() + "," + loc.getBearing();
params += "," + loc.getSpeed() + "," + loc.getTime();
if(id != "global")
{
mAppView.loadUrl("javascript:navigator.geolocation.success(" + id + "," + params + ")");
}
}
void fail()
{
// Do we need to know why? How would we handle this?
if (id != "global") {
mAppView.loadUrl("javascript:navigator.geolocation.fail(" + id + ")");
}
else
{
mAppView.loadUrl("javascript:navigator.geolocation.fail()");
}
}
// This stops the listener
void stop()
{
mGps.stop();
mNetwork.stop();
}
public Location getCurrentLocation() {
Location loc = mGps.getLocation();
if (loc == null)
loc = mNetwork.getLocation();
return loc;
}
}

View File

@@ -1,101 +0,0 @@
package com.phonegap;
/* License (MIT)
* Copyright (c) 2008 Nitobi
* website: http://phonegap.com
* 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.
*/
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;
public class GpsListener implements LocationListener {
private Context mCtx;
private Location cLoc;
private LocationManager mLocMan;
private static final String LOG_TAG = "PhoneGap";
private GeoListener owner;
private boolean hasData = false;
public GpsListener(Context ctx, int interval, GeoListener m)
{
owner = m;
mCtx = ctx;
mLocMan = (LocationManager) mCtx.getSystemService(Context.LOCATION_SERVICE);
mLocMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, interval, 0, this);
cLoc = mLocMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
public Location getLocation()
{
cLoc = mLocMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
hasData = true;
return cLoc;
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The provider " + provider + " is disabled");
owner.fail();
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The provider "+ provider + " is enabled");
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The status of the provider " + provider + " has changed");
if(status == 0)
{
Log.d(LOG_TAG, provider + " is OUT OF SERVICE");
owner.fail();
}
else if(status == 1)
{
Log.d(LOG_TAG, provider + " is TEMPORARILY_UNAVAILABLE");
}
else
{
Log.d(LOG_TAG, provider + " is Available");
}
}
public void onLocationChanged(Location location) {
Log.d(LOG_TAG, "The location has been updated!");
owner.success(location);
}
public boolean hasLocation() {
return hasData;
}
public void stop()
{
mLocMan.removeUpdates(this);
}
}

View File

@@ -1,65 +0,0 @@
package com.phonegap;
import java.io.EOFException;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class HttpHandler {
protected Boolean get(String url, String file)
{
HttpEntity entity = getHttpEntity(url);
try {
writeToDisk(entity, file);
} catch (Exception e) { e.printStackTrace(); return false; }
try {
entity.consumeContent();
} catch (Exception e) { e.printStackTrace(); return false; }
return true;
}
private HttpEntity getHttpEntity(String url)
/**
* get the http entity at a given url
*/
{
HttpEntity entity=null;
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
entity = response.getEntity();
} catch (Exception e) { e.printStackTrace(); return null; }
return entity;
}
private void writeToDisk(HttpEntity entity, String file) throws EOFException
/**
* writes a HTTP entity to the specified filename and location on disk
*/
{
int i=0;
String FilePath="/sdcard/" + file;
try {
InputStream in = entity.getContent();
byte buff[] = new byte[1024];
FileOutputStream out=
new FileOutputStream(FilePath);
do {
int numread = in.read(buff);
if (numread <= 0)
break;
out.write(buff, 0, numread);
System.out.println("numread" + numread);
i++;
} while (true);
out.flush();
out.close();
} catch (Exception e) { e.printStackTrace(); }
}
}

View File

@@ -1,102 +0,0 @@
package com.phonegap;
/* License (MIT)
* Copyright (c) 2008 Nitobi
* website: http://phonegap.com
* 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.
*/
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.util.Log;
public class NetworkListener implements LocationListener {
private Context mCtx;
private Location cLoc;
private LocationManager mLocMan;
private static final String LOG_TAG = "PhoneGap";
GeoListener owner;
public NetworkListener(Context ctx, int interval, GeoListener m)
{
owner = m;
mCtx = ctx;
mLocMan = (LocationManager) mCtx.getSystemService(Context.LOCATION_SERVICE);
mLocMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, interval, 0, this);
cLoc = mLocMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
public Location getLocation()
{
cLoc = mLocMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
return cLoc;
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The provider " + provider + " is disabled");
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The provider "+ provider + " is enabled");
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "The status of the provider " + provider + " has changed");
if(status == 0)
{
Log.d(LOG_TAG, provider + " is OUT OF SERVICE");
}
else if(status == 1)
{
Log.d(LOG_TAG, provider + " is TEMPORARILY_UNAVAILABLE");
}
else
{
Log.d(LOG_TAG, provider + " is Available");
}
}
/*
* The GPS is the primary form of Geolocation in PhoneGap. Only fire the success variables if the GPS is down
* for some reason
*/
public void onLocationChanged(Location location) {
Log.d(LOG_TAG, "The location has been updated!");
if (!owner.mGps.hasLocation())
{
owner.success(location);
}
cLoc = location;
}
public void stop()
{
mLocMan.removeUpdates(this);
}
}

View File

@@ -1,55 +0,0 @@
package com.phonegap;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.net.*;
import android.webkit.WebView;
public class NetworkManager {
Context mCtx;
WebView mView;
ConnectivityManager sockMan;
NetworkManager(Context ctx, WebView view)
{
mCtx = ctx;
mView = view;
sockMan = (ConnectivityManager) mCtx.getSystemService(Context.CONNECTIVITY_SERVICE);
}
public boolean isAvailable()
{
NetworkInfo info = sockMan.getActiveNetworkInfo();
boolean conn = false;
if(info != null)
conn = info.isConnected();
return conn;
}
public boolean isWifiActive()
{
NetworkInfo info = sockMan.getActiveNetworkInfo();
String type = info.getTypeName();
return type.equals("WIFI");
}
public boolean isReachable(String uri)
{
if (uri.indexOf("http://") == -1)
uri = "http://" + uri;
boolean reached = isAvailable();
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(uri);
httpclient.execute(httpget);
} catch (Exception e) {
reached = false;
}
return reached;
}
}

View File

@@ -1,69 +0,0 @@
package com.phonegap;
/* License (MIT)
* Copyright (c) 2008 Nitobi
* website: http://phonegap.com
* 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.
*/
import android.content.Context;
import android.hardware.SensorManager;
import android.hardware.SensorListener;
import android.webkit.WebView;
public class Orientation implements SensorListener{
private WebView mAppView;
private SensorManager sensorManager;
private Context mCtx;
Orientation(WebView kit, Context ctx) {
mAppView = kit;
mCtx = ctx;
sensorManager = (SensorManager) mCtx.getSystemService(Context.SENSOR_SERVICE);
this.resumeAccel();
}
public void onSensorChanged(int sensor, final float[] values) {
if (sensor != SensorManager.SENSOR_ACCELEROMETER || values.length < 3)
return;
float x = values[0];
float y = values[1];
float z = values[2];
mAppView.loadUrl("javascript:gotAcceleration(" + x + ", " + y + "," + z + ")");
}
public void onAccuracyChanged(int arg0, int arg1) {
// This is a stub method.
}
public void pauseAccel()
{
sensorManager.unregisterListener(this);
}
public void resumeAccel()
{
sensorManager.registerListener(this,
SensorManager.SENSOR_ACCELEROMETER,
SensorManager.SENSOR_DELAY_GAME);
}
}

View File

@@ -1,183 +0,0 @@
package com.phonegap;
/* License (MIT)
* Copyright (c) 2008 Nitobi
* website: http://phonegap.com
* 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.
*/
import java.util.TimeZone;
import android.content.Context;
import android.content.IntentFilter;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Vibrator;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.webkit.WebView;
import android.media.Ringtone;
import android.media.RingtoneManager;
public class PhoneGap{
private static final String LOG_TAG = "PhoneGap";
/*
* UUID, version and availability
*/
public boolean droid = true;
public static String version = "0.8.0";
public static String platform = "Android";
public static String uuid;
private Context mCtx;
private WebView mAppView;
AudioHandler audio;
public PhoneGap(Context ctx, WebView appView) {
this.mCtx = ctx;
this.mAppView = appView;
audio = new AudioHandler("/sdcard/tmprecording.mp3", ctx);
uuid = getUuid();
}
public void beep(long pattern)
{
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone notification = RingtoneManager.getRingtone(mCtx, ringtone);
for (long i = 0; i < pattern; ++i)
{
notification.play();
}
}
public void vibrate(long pattern){
// Start the vibration, 0 defaults to half a second.
if (pattern == 0)
pattern = 500;
Vibrator vibrator = (Vibrator) mCtx.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(pattern);
}
public String getPlatform()
{
return this.platform;
}
public String getUuid()
{
//TelephonyManager operator = (TelephonyManager) mCtx.getSystemService(Context.TELEPHONY_SERVICE);
//String uuid = operator.getDeviceId();
String uuid = Settings.Secure.getString(mCtx.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
return uuid;
}
public String getModel()
{
String model = android.os.Build.MODEL;
return model;
}
public String getProductName()
{
String productname = android.os.Build.PRODUCT;
return productname;
}
public String getOSVersion()
{
String osversion = android.os.Build.VERSION.RELEASE;
return osversion;
}
public String getSDKVersion()
{
String sdkversion = android.os.Build.VERSION.SDK;
return sdkversion;
}
public String getVersion()
{
return version;
}
public void httpGet(String url, String file)
/**
* grabs a file from specified url and saves it to a name and location
* the base directory /sdcard is abstracted so that paths may be the same from one mobile OS to another
* TODO: JavaScript call backs and error handling
*/
{
HttpHandler http = new HttpHandler();
http.get(url, file);
}
/**
* AUDIO
* TODO: Basic functions done but needs more work on error handling and call backs, remove record hack
*/
public void startRecordingAudio(String file)
{
/* for this to work the recording needs to be specified in the constructor,
* a hack to get around this, I'm moving the recording after it's complete
*/
audio.startRecording(file);
}
public void stopRecordingAudio()
{
audio.stopRecording();
}
public void startPlayingAudio(String file)
{
audio.startPlaying(file);
}
public void stopPlayingAudio()
{
audio.stopPlaying();
}
public long getCurrentPositionAudio()
{
System.out.println(audio.getCurrentPosition());
return(audio.getCurrentPosition());
}
public long getDurationAudio(String file)
{
System.out.println(audio.getDuration(file));
return(audio.getDuration(file));
}
public void setAudioOutputDevice(int output){
audio.setAudioOutputDevice(output);
}
public int getAudioOutputDevice(){
return audio.getAudioOutputDevice();
}
public String getTimeZoneID() {
TimeZone tz = TimeZone.getDefault();
return(tz.getID());
}
}

View File

@@ -1,32 +0,0 @@
package com.phonegap;
import java.lang.reflect.Field;
import android.app.Activity;
import android.os.Bundle;
public class StandAlone extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Load a URI from the strings.xml file */
Class<R.string> c = R.string.class;
Field f;
String uri;
int i = 0;
try {
f = c.getField("url");
i = f.getInt(f);
uri = this.getResources().getString(i);
} catch (Exception e)
{
uri = "http://www.phonegap.com";
}
super.loadUrl(uri);
}
}

View File

@@ -1,71 +0,0 @@
package com.phonegap;
import android.database.Cursor;
import android.database.sqlite.*;
import android.util.Log;
import android.webkit.WebView;
public class Storage {
private static final String LOG_TAG = "SQLite Storage:";
SQLiteDatabase myDb;
String path;
String txid = "";
WebView appView;
Storage(WebView view)
{
Package pack = this.getClass().getPackage();
String appPackage = pack.getName();
path = "/data/data/" + appPackage + "/databases/";
appView = view;
}
public void openDatabase(String db, String version, String display_name, long size)
{
path += db + ".db";
myDb = SQLiteDatabase.openOrCreateDatabase(path, null);
}
public void executeSql(String query, String[] params, String tx_id)
{
try{
txid = tx_id;
Cursor myCursor = myDb.rawQuery(query, params);
processResults(myCursor);
}
catch (SQLiteException ex)
{
Log.d(LOG_TAG, ex.getMessage());
txid = "";
appView.loadUrl("droiddb.fail(" + ex.getMessage() + "," + txid + ")");
}
}
public void processResults(Cursor cur)
{
String key = "";
String value = "";
String resultString = "";
if (cur.moveToFirst()) {
int colCount = cur.getColumnCount();
do {
resultString = "{";
for(int i = 0; i < colCount; ++i)
{
key = cur.getColumnName(i);
value = cur.getString(i);
resultString += " \"" + key + "\" : \"" + value + "\"";
if (i != (colCount - 1))
resultString += ",";
}
resultString += "}";
appView.loadUrl("javascript:droiddb.addResult('" + resultString + "', " + txid + ")");
} while (cur.moveToNext());
appView.loadUrl("javascript:droiddb.completeQuery(" + txid + ")");
txid = "";
myDb.close();
}
}
}

View File

@@ -1,53 +0,0 @@
package com.phonegap;
import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.content.Context;
import android.webkit.WebView;
public class TempListener implements SensorEventListener {
WebView mAppView;
Context mCtx;
Sensor mSensor;
private SensorManager sensorManager;
TempListener(Context ctx, WebView appView)
{
mCtx = ctx;
mAppView = appView;
sensorManager = (SensorManager) mCtx.getSystemService(Context.SENSOR_SERVICE);
}
public void start()
{
List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_TEMPERATURE);
if (list.size() > 0)
{
this.mSensor = list.get(0);
this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
public void stop()
{
this.sensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
// We want to know what temp this is.
float temp = event.values[0];
mAppView.loadUrl("javascript:gotTemp(" + temp + ")");
}
}

View File

@@ -1,75 +0,0 @@
package com.phonegap;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.webkit.WebSettings;
public class WebViewReflect {
private static Method mWebSettings_setDatabaseEnabled;
private static Method mWebSettings_setDatabasePath;
static
{
checkCompatibility();
}
private static void setDatabaseEnabled(boolean e) throws IOException {
try
{
mWebSettings_setDatabaseEnabled.invoke(e);
}
catch (InvocationTargetException ite) {
/* unpack original exception when possible */
Throwable cause = ite.getCause();
if (cause instanceof IOException) {
throw (IOException) cause;
} else if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
} else if (cause instanceof Error) {
throw (Error) cause;
} else {
/* unexpected checked exception; wrap and re-throw */
throw new RuntimeException(ite);
}
} catch (IllegalAccessException ie) {
System.err.println("unexpected " + ie);
}
}
public static void checkCompatibility() {
try {
mWebSettings_setDatabaseEnabled = WebSettings.class.getMethod(
"setDatabaseEnabled", new Class[] { boolean.class } );
mWebSettings_setDatabasePath = WebSettings.class.getMethod(
"setDatabasePath", new Class[] { String.class });
/* success, this is a newer device */
} catch (NoSuchMethodException nsme) {
/* failure, must be older device */
}
}
public static void setStorage(WebSettings setting, boolean enable, String path) {
if (mWebSettings_setDatabaseEnabled != null) {
/* feature is supported */
try {
mWebSettings_setDatabaseEnabled.invoke(setting, true);
mWebSettings_setDatabasePath.invoke(setting, path);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//setting.setDatabaseEnabled(enable);
//setting.setDatabasePath(path);
} else {
/* feature not supported, do something else */
System.out.println("dump not supported");
}
}
}

View File

@@ -0,0 +1,27 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
/**
* Plugin interface must be implemented by any plugin classes.
*
* The execute method is called by the PluginManager.
*/
public interface IPlugin extends org.apache.cordova.api.IPlugin {
}

View File

@@ -0,0 +1,28 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
/**
* Log to Android logging system.
*
* Log message can be a string or a printf formatted string with arguments.
* See http://developer.android.com/reference/java/util/Formatter.html
*/
public class LOG extends org.apache.cordova.api.LOG {
}

View File

@@ -0,0 +1,28 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
import android.app.Activity;
/**
* The Cordova activity abstract class that is extended by DroidGap.
* It is used to isolate plugin development, and remove dependency on entire Cordova library.
*/
public abstract class PhonegapActivity extends Activity implements org.apache.cordova.api.CordovaInterface {
}

View File

@@ -0,0 +1,27 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
/**
* Plugin interface must be implemented by any plugin classes.
*
* The execute method is called by the PluginManager.
*/
public abstract class Plugin extends org.apache.cordova.api.Plugin {
}

View File

@@ -0,0 +1,36 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
import org.apache.cordova.api.CordovaInterface;
import android.webkit.WebView;
/**
* PluginManager is exposed to JavaScript in the Cordova WebView.
*
* Calling native plugin code can be done by calling PluginManager.exec(...)
* from JavaScript.
*/
public class PluginManager extends org.apache.cordova.api.PluginManager {
public PluginManager(WebView app, CordovaInterface ctx) {
super(app, ctx);
}
}

View File

@@ -0,0 +1,53 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.phonegap.api;
import org.json.JSONArray;
import org.json.JSONObject;
public class PluginResult extends org.apache.cordova.api.PluginResult {
public PluginResult(Status status) {
super(status);
}
public PluginResult(Status status, String message) {
super(status, message);
}
public PluginResult(Status status, JSONArray message) {
super(status, message);
}
public PluginResult(Status status, JSONObject message) {
super(status, message);
}
public PluginResult(Status status, int i) {
super(status, i);
}
public PluginResult(Status status, float f) {
super(status, f);
}
public PluginResult(Status status, boolean b) {
super(status, b);
}
}

View File

@@ -0,0 +1,275 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.cordova.api.CordovaInterface;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.util.Log;
import android.content.Context;
/**
* This class listens to the accelerometer sensor and stores the latest
* acceleration values x,y,z.
*/
public class AccelListener extends Plugin implements SensorEventListener {
public static int STOPPED = 0;
public static int STARTING = 1;
public static int RUNNING = 2;
public static int ERROR_FAILED_TO_START = 3;
private float x,y,z; // most recent acceleration values
private long timestamp; // time of most recent value
private int status; // status of listener
private int accuracy = SensorManager.SENSOR_STATUS_UNRELIABLE;
private SensorManager sensorManager; // Sensor manager
private Sensor mSensor; // Acceleration sensor returned by sensor manager
private String callbackId; // Keeps track of the single "start" callback ID passed in from JS
/**
* Create an accelerometer listener.
*/
public AccelListener() {
this.x = 0;
this.y = 0;
this.z = 0;
this.timestamp = 0;
this.setStatus(AccelListener.STOPPED);
}
/**
* Sets the context of the Command. This can then be used to do things like
* get file paths associated with the Activity.
*
* @param ctx The context of the main Activity.
*/
public void setContext(CordovaInterface ctx) {
super.setContext(ctx);
this.sensorManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);
}
/**
* 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.NO_RESULT;
String message = "";
PluginResult result = new PluginResult(status, message);
result.setKeepCallback(true);
if (action.equals("start")) {
this.callbackId = callbackId;
if (this.status != AccelListener.RUNNING) {
// If not running, then this is an async call, so don't worry about waiting
// We drop the callback onto our stack, call start, and let start and the sensor callback fire off the callback down the road
this.start();
}
}
else if (action.equals("stop")) {
if (this.status == AccelListener.RUNNING) {
this.stop();
}
} else {
// Unsupported action
return new PluginResult(PluginResult.Status.INVALID_ACTION);
}
return result;
}
/**
* Called by AccelBroker when listener is to be shut down.
* Stop listener.
*/
public void onDestroy() {
this.stop();
}
//--------------------------------------------------------------------------
// LOCAL METHODS
//--------------------------------------------------------------------------
//
/**
* Start listening for acceleration sensor.
*
* @return status of listener
*/
private int start() {
// If already starting or running, then just return
if ((this.status == AccelListener.RUNNING) || (this.status == AccelListener.STARTING)) {
return this.status;
}
this.setStatus(AccelListener.STARTING);
// Get accelerometer from sensor manager
List<Sensor> list = this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
// If found, then register as listener
if ((list != null) && (list.size() > 0)) {
this.mSensor = list.get(0);
this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_UI);
this.setStatus(AccelListener.STARTING);
} else {
this.setStatus(AccelListener.ERROR_FAILED_TO_START);
this.fail(AccelListener.ERROR_FAILED_TO_START, "No sensors found to register accelerometer listening to.");
return this.status;
}
// Wait until running
long timeout = 2000;
while ((this.status == STARTING) && (timeout > 0)) {
timeout = timeout - 100;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (timeout == 0) {
this.setStatus(AccelListener.ERROR_FAILED_TO_START);
this.fail(AccelListener.ERROR_FAILED_TO_START, "Accelerometer could not be started.");
}
return this.status;
}
/**
* Stop listening to acceleration sensor.
*/
private void stop() {
if (this.status != AccelListener.STOPPED) {
this.sensorManager.unregisterListener(this);
}
this.setStatus(AccelListener.STOPPED);
this.accuracy = SensorManager.SENSOR_STATUS_UNRELIABLE;
}
/**
* Called when the accuracy of the sensor has changed.
*
* @param sensor
* @param accuracy
*/
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Only look at accelerometer events
if (sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
return;
}
// If not running, then just return
if (this.status == AccelListener.STOPPED) {
return;
}
this.accuracy = accuracy;
}
/**
* Sensor listener event.
*
* @param SensorEvent event
*/
public void onSensorChanged(SensorEvent event) {
// Only look at accelerometer events
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
return;
}
// If not running, then just return
if (this.status == AccelListener.STOPPED) {
return;
}
this.setStatus(AccelListener.RUNNING);
if (this.accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM) {
// Save time that event was received
this.timestamp = System.currentTimeMillis();
this.x = event.values[0];
this.y = event.values[1];
this.z = event.values[2];
this.win();
}
}
// Sends an error back to JS
private void fail(int code, String message) {
// Error object
JSONObject errorObj = new JSONObject();
try {
errorObj.put("code", code);
errorObj.put("message", message);
} catch (JSONException e) {
e.printStackTrace();
}
PluginResult err = new PluginResult(PluginResult.Status.ERROR, errorObj);
err.setKeepCallback(true);
this.error(err, this.callbackId);
}
private void win() {
// Success return object
PluginResult result = new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON());
result.setKeepCallback(true);
this.success(result, this.callbackId);
}
private void setStatus(int status) {
this.status = status;
}
private JSONObject getAccelerationJSON() {
JSONObject r = new JSONObject();
try {
r.put("x", this.x);
r.put("y", this.y);
r.put("z", this.z);
r.put("timestamp", this.timestamp);
} catch (JSONException e) {
e.printStackTrace();
}
return r;
}
}

View File

@@ -0,0 +1,198 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import org.apache.cordova.api.LOG;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
/**
* This class exposes methods in DroidGap that can be called from JavaScript.
*/
public class App extends Plugin {
/**
* 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 = "";
try {
if (action.equals("clearCache")) {
this.clearCache();
}
else if (action.equals("loadUrl")) {
this.loadUrl(args.getString(0), args.optJSONObject(1));
}
else if (action.equals("cancelLoadUrl")) {
this.cancelLoadUrl();
}
else if (action.equals("clearHistory")) {
this.clearHistory();
}
else if (action.equals("backHistory")) {
this.backHistory();
}
else if (action.equals("overrideBackbutton")) {
this.overrideBackbutton(args.getBoolean(0));
}
else if (action.equals("isBackbuttonOverridden")) {
boolean b = this.isBackbuttonOverridden();
return new PluginResult(status, b);
}
else if (action.equals("exitApp")) {
this.exitApp();
}
return new PluginResult(status, result);
} catch (JSONException e) {
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
//--------------------------------------------------------------------------
// LOCAL METHODS
//--------------------------------------------------------------------------
/**
* Clear the resource cache.
*/
public void clearCache() {
((DroidGap)this.ctx).clearCache();
}
/**
* Load the url into the webview.
*
* @param url
* @param props Properties that can be passed in to the DroidGap activity (i.e. loadingDialog, wait, ...)
* @throws JSONException
*/
public void loadUrl(String url, JSONObject props) throws JSONException {
LOG.d("App", "App.loadUrl("+url+","+props+")");
int wait = 0;
boolean openExternal = false;
boolean clearHistory = false;
// If there are properties, then set them on the Activity
HashMap<String, Object> params = new HashMap<String, Object>();
if (props != null) {
JSONArray keys = props.names();
for (int i=0; i<keys.length(); i++) {
String key = keys.getString(i);
if (key.equals("wait")) {
wait = props.getInt(key);
}
else if (key.equalsIgnoreCase("openexternal")) {
openExternal = props.getBoolean(key);
}
else if (key.equalsIgnoreCase("clearhistory")) {
clearHistory = props.getBoolean(key);
}
else {
Object value = props.get(key);
if (value == null) {
}
else if (value.getClass().equals(String.class)) {
params.put(key, (String)value);
}
else if (value.getClass().equals(Boolean.class)) {
params.put(key, (Boolean)value);
}
else if (value.getClass().equals(Integer.class)) {
params.put(key, (Integer)value);
}
}
}
}
// If wait property, then delay loading
if (wait > 0) {
try {
synchronized(this) {
this.wait(wait);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
((DroidGap)this.ctx).showWebPage(url, openExternal, clearHistory, params);
}
/**
* Cancel loadUrl before it has been loaded.
*/
public void cancelLoadUrl() {
((DroidGap)this.ctx).cancelLoadUrl();
}
/**
* Clear page history for the app.
*/
public void clearHistory() {
((DroidGap)this.ctx).clearHistory();
}
/**
* Go to previous page displayed.
* This is the same as pressing the backbutton on Android device.
*/
public void backHistory() {
((DroidGap)this.ctx).backHistory();
}
/**
* Override the default behavior of the Android back button.
* If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
*
* @param override T=override, F=cancel override
*/
public void overrideBackbutton(boolean override) {
LOG.i("DroidGap", "WARNING: Back Button Default Behaviour will be overridden. The backbutton event will be fired!");
((DroidGap)this.ctx).bound = override;
}
/**
* Return whether the Android back button is overridden by the user.
*
* @return boolean
*/
public boolean isBackbuttonOverridden() {
return ((DroidGap)this.ctx).bound;
}
/**
* Exit the Android application.
*/
public void exitApp() {
((DroidGap)this.ctx).endActivity();
}
}

View File

@@ -0,0 +1,364 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import android.content.Context;
import android.media.AudioManager;
import java.util.ArrayList;
import org.apache.cordova.api.LOG;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.HashMap;
import java.util.Map.Entry;
/**
* This class called by CordovaActivity to play and record audio.
* The file can be local or over a network using http.
*
* Audio formats supported (tested):
* .mp3, .wav
*
* Local audio files must reside in one of two places:
* android_asset: file name must start with /android_asset/sound.mp3
* sdcard: file name is just sound.mp3
*/
public class AudioHandler extends Plugin {
public static String TAG = "AudioHandler";
HashMap<String,AudioPlayer> players; // Audio player object
ArrayList<AudioPlayer> pausedForPhone; // Audio players that were paused when phone call came in
/**
* Constructor.
*/
public AudioHandler() {
this.players = new HashMap<String,AudioPlayer>();
this.pausedForPhone = new ArrayList<AudioPlayer>();
}
/**
* 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 = "";
try {
if (action.equals("startRecordingAudio")) {
this.startRecordingAudio(args.getString(0), args.getString(1));
}
else if (action.equals("stopRecordingAudio")) {
this.stopRecordingAudio(args.getString(0));
}
else if (action.equals("startPlayingAudio")) {
this.startPlayingAudio(args.getString(0), args.getString(1));
}
else if (action.equals("seekToAudio")) {
this.seekToAudio(args.getString(0), args.getInt(1));
}
else if (action.equals("pausePlayingAudio")) {
this.pausePlayingAudio(args.getString(0));
}
else if (action.equals("stopPlayingAudio")) {
this.stopPlayingAudio(args.getString(0));
} else if (action.equals("setVolume")) {
try {
this.setVolume(args.getString(0), Float.parseFloat(args.getString(1)));
} catch (NumberFormatException nfe) {
//no-op
}
} else if (action.equals("getCurrentPositionAudio")) {
float f = this.getCurrentPositionAudio(args.getString(0));
return new PluginResult(status, f);
}
else if (action.equals("getDurationAudio")) {
float f = this.getDurationAudio(args.getString(0), args.getString(1));
return new PluginResult(status, f);
}
else if (action.equals("release")) {
boolean b = this.release(args.getString(0));
return new PluginResult(status, b);
}
return new PluginResult(status, result);
} catch (JSONException e) {
e.printStackTrace();
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) {
if (action.equals("getCurrentPositionAudio")) {
return true;
}
else if (action.equals("getDurationAudio")) {
return true;
}
return false;
}
/**
* Stop all audio players and recorders.
*/
public void onDestroy() {
for (AudioPlayer audio : this.players.values()) {
audio.destroy();
}
this.players.clear();
}
/**
* Called when a message is sent to plugin.
*
* @param id The message id
* @param data The message data
*/
public void onMessage(String id, Object data) {
// If phone message
if (id.equals("telephone")) {
// If phone ringing, then pause playing
if ("ringing".equals(data) || "offhook".equals(data)) {
// Get all audio players and pause them
for (AudioPlayer audio : this.players.values()) {
if (audio.getState() == AudioPlayer.MEDIA_RUNNING) {
this.pausedForPhone.add(audio);
audio.pausePlaying();
}
}
}
// If phone idle, then resume playing those players we paused
else if ("idle".equals(data)) {
for (AudioPlayer audio : this.pausedForPhone) {
audio.startPlaying(null);
}
this.pausedForPhone.clear();
}
}
}
//--------------------------------------------------------------------------
// LOCAL METHODS
//--------------------------------------------------------------------------
/**
* Release the audio player instance to save memory.
*
* @param id The id of the audio player
*/
private boolean release(String id) {
if (!this.players.containsKey(id)) {
return false;
}
AudioPlayer audio = this.players.get(id);
this.players.remove(id);
audio.destroy();
return true;
}
/**
* Start recording and save the specified file.
*
* @param id The id of the audio player
* @param file The name of the file
*/
public void startRecordingAudio(String id, String file) {
// If already recording, then just return;
if (this.players.containsKey(id)) {
return;
}
AudioPlayer audio = new AudioPlayer(this, id);
this.players.put(id, audio);
audio.startRecording(file);
}
/**
* Stop recording and save to the file specified when recording started.
*
* @param id The id of the audio player
*/
public void stopRecordingAudio(String id) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
audio.stopRecording();
this.players.remove(id);
}
}
/**
* Start or resume playing audio file.
*
* @param id The id of the audio player
* @param file The name of the audio file.
*/
public void startPlayingAudio(String id, String file) {
AudioPlayer audio = this.players.get(id);
if (audio == null) {
audio = new AudioPlayer(this, id);
this.players.put(id, audio);
}
audio.startPlaying(file);
}
/**
* Seek to a location.
*
*
* @param id The id of the audio player
* @param miliseconds int: number of milliseconds to skip 1000 = 1 second
*/
public void seekToAudio(String id, int milliseconds) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
audio.seekToPlaying(milliseconds);
}
}
/**
* Pause playing.
*
* @param id The id of the audio player
*/
public void pausePlayingAudio(String id) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
audio.pausePlaying();
}
}
/**
* Stop playing the audio file.
*
* @param id The id of the audio player
*/
public void stopPlayingAudio(String id) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
audio.stopPlaying();
//audio.destroy();
//this.players.remove(id);
}
}
/**
* Get current position of playback.
*
* @param id The id of the audio player
* @return position in msec
*/
public float getCurrentPositionAudio(String id) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
return(audio.getCurrentPosition()/1000.0f);
}
return -1;
}
/**
* Get the duration of the audio file.
*
* @param id The id of the audio player
* @param file The name of the audio file.
* @return The duration in msec.
*/
public float getDurationAudio(String id, String file) {
// Get audio file
AudioPlayer audio = this.players.get(id);
if (audio != null) {
return(audio.getDuration(file));
}
// If not already open, then open the file
else {
audio = new AudioPlayer(this, id);
this.players.put(id, audio);
return(audio.getDuration(file));
}
}
/**
* Set the audio device to be used for playback.
*
* @param output 1=earpiece, 2=speaker
*/
public void setAudioOutputDevice(int output) {
AudioManager audiMgr = (AudioManager) this.ctx.getSystemService(Context.AUDIO_SERVICE);
if (output == 2) {
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
}
else if (output == 1) {
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
}
else {
System.out.println("AudioHandler.setAudioOutputDevice() Error: Unknown output device.");
}
}
/**
* Get the audio device to be used for playback.
*
* @return 1=earpiece, 2=speaker
*/
public int getAudioOutputDevice() {
AudioManager audiMgr = (AudioManager) this.ctx.getSystemService(Context.AUDIO_SERVICE);
if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE) {
return 1;
}
else if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_SPEAKER) {
return 2;
}
else {
return -1;
}
}
/**
* Set the volume for an audio device
*
* @param id The id of the audio player
* @param volume Volume to adjust to 0.0f - 1.0f
*/
public void setVolume(String id, float volume) {
AudioPlayer audio = this.players.get(id);
if (audio != null) {
audio.setVolume(volume);
} else {
System.out.println("AudioHandler.setVolume() Error: Unknown Audio Player " + id);
}
}
}

View File

@@ -0,0 +1,458 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* This class implements the audio playback and recording capabilities used by Cordova.
* It is called by the AudioHandler Cordova class.
* Only one file can be played or recorded per class instance.
*
* Local audio files must reside in one of two places:
* android_asset: file name must start with /android_asset/sound.mp3
* sdcard: file name is just sound.mp3
*/
public class AudioPlayer implements OnCompletionListener, OnPreparedListener, OnErrorListener {
private static final String LOG_TAG = "AudioPlayer";
// AudioPlayer states
public static int MEDIA_NONE = 0;
public static int MEDIA_STARTING = 1;
public static int MEDIA_RUNNING = 2;
public static int MEDIA_PAUSED = 3;
public static int MEDIA_STOPPED = 4;
// AudioPlayer message ids
private static int MEDIA_STATE = 1;
private static int MEDIA_DURATION = 2;
private static int MEDIA_POSITION = 3;
private static int MEDIA_ERROR = 9;
// Media error codes
private static int MEDIA_ERR_NONE_ACTIVE = 0;
private static int MEDIA_ERR_ABORTED = 1;
private static int MEDIA_ERR_NETWORK = 2;
private static int MEDIA_ERR_DECODE = 3;
private static int MEDIA_ERR_NONE_SUPPORTED = 4;
private AudioHandler handler; // The AudioHandler object
private String id; // The id of this player (used to identify Media object in JavaScript)
private int state = MEDIA_NONE; // State of recording or playback
private String audioFile = null; // File name to play or record to
private float duration = -1; // Duration of audio
private MediaRecorder recorder = null; // Audio recording object
private String tempFile = null; // Temporary recording file name
private MediaPlayer mPlayer = null; // Audio player object
private boolean prepareOnly = false;
/**
* Constructor.
*
* @param handler The audio handler object
* @param id The id of this audio player
*/
public AudioPlayer(AudioHandler handler, String id) {
this.handler = handler;
this.id = id;
this.tempFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tmprecording.mp3";
}
/**
* Destroy player and stop audio playing or recording.
*/
public void destroy() {
// Stop any play or record
if (this.mPlayer != null) {
if ((this.state == MEDIA_RUNNING) || (this.state == MEDIA_PAUSED)) {
this.mPlayer.stop();
this.setState(MEDIA_STOPPED);
}
this.mPlayer.release();
this.mPlayer = null;
}
if (this.recorder != null) {
this.stopRecording();
this.recorder.release();
this.recorder = null;
}
}
/**
* Start recording the specified file.
*
* @param file The name of the file
*/
public void startRecording(String file) {
if (this.mPlayer != null) {
Log.d(LOG_TAG, "AudioPlayer Error: Can't record in play mode.");
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
// Make sure we're not already recording
else if (this.recorder == null) {
this.audioFile = file;
this.recorder = new MediaRecorder();
this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
this.recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // THREE_GPP);
this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //AMR_NB);
this.recorder.setOutputFile(this.tempFile);
try {
this.recorder.prepare();
this.recorder.start();
this.setState(MEDIA_RUNNING);
return;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
else {
Log.d(LOG_TAG, "AudioPlayer Error: Already recording.");
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
}
/**
* Save temporary recorded file to specified name
*
* @param file
*/
public void moveFile(String file) {
/* this is a hack to save the file as the specified name */
File f = new File(this.tempFile);
f.renameTo(new File("/sdcard/" + file));
}
/**
* Stop recording and save to the file specified when recording started.
*/
public void stopRecording() {
if (this.recorder != null) {
try{
if (this.state == MEDIA_RUNNING) {
this.recorder.stop();
this.setState(MEDIA_STOPPED);
}
this.moveFile(this.audioFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Start or resume playing audio file.
*
* @param file The name of the audio file.
*/
public void startPlaying(String file) {
if (this.recorder != null) {
Log.d(LOG_TAG, "AudioPlayer Error: Can't play in record mode.");
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
// If this is a new request to play audio, or stopped
else if ((this.mPlayer == null) || (this.state == MEDIA_STOPPED)) {
try {
// If stopped, then reset player
if (this.mPlayer != null) {
this.mPlayer.reset();
}
// Otherwise, create a new one
else {
this.mPlayer = new MediaPlayer();
}
this.audioFile = file;
// If streaming file
if (this.isStreaming(file)) {
this.mPlayer.setDataSource(file);
this.mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.setState(MEDIA_STARTING);
this.mPlayer.setOnPreparedListener(this);
this.mPlayer.prepareAsync();
}
// If local file
else {
if (file.startsWith("/android_asset/")) {
String f = file.substring(15);
android.content.res.AssetFileDescriptor fd = this.handler.ctx.getBaseContext().getAssets().openFd(f);
this.mPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
}
else {
File fp = new File(file);
if (fp.exists()) {
FileInputStream fileInputStream = new FileInputStream(file);
this.mPlayer.setDataSource(fileInputStream.getFD());
}
else {
this.mPlayer.setDataSource("/sdcard/" + file);
}
}
this.setState(MEDIA_STARTING);
this.mPlayer.setOnPreparedListener(this);
this.mPlayer.prepare();
// Get duration
this.duration = getDurationInSeconds();
}
}
catch (Exception e) {
e.printStackTrace();
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
}
// If we have already have created an audio player
else {
// If player has been paused, then resume playback
if ((this.state == MEDIA_PAUSED) || (this.state == MEDIA_STARTING)) {
this.mPlayer.start();
this.setState(MEDIA_RUNNING);
}
else {
Log.d(LOG_TAG, "AudioPlayer Error: startPlaying() called during invalid state: "+this.state);
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_ABORTED+"});");
}
}
}
/**
* Seek or jump to a new time in the track.
*/
public void seekToPlaying(int milliseconds) {
if (this.mPlayer != null) {
this.mPlayer.seekTo(milliseconds);
Log.d(LOG_TAG, "Send a onStatus update for the new seek");
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_POSITION+", "+milliseconds/1000.0f+");");
}
}
/**
* Pause playing.
*/
public void pausePlaying() {
// If playing, then pause
if (this.state == MEDIA_RUNNING) {
this.mPlayer.pause();
this.setState(MEDIA_PAUSED);
}
else {
Log.d(LOG_TAG, "AudioPlayer Error: pausePlaying() called during invalid state: "+this.state);
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_NONE_ACTIVE+"});");
}
}
/**
* Stop playing the audio file.
*/
public void stopPlaying() {
if ((this.state == MEDIA_RUNNING) || (this.state == MEDIA_PAUSED)) {
this.mPlayer.stop();
this.setState(MEDIA_STOPPED);
}
else {
Log.d(LOG_TAG, "AudioPlayer Error: stopPlaying() called during invalid state: "+this.state);
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_ERROR+", { \"code\":"+MEDIA_ERR_NONE_ACTIVE+"});");
}
}
/**
* Callback to be invoked when playback of a media source has completed.
*
* @param mPlayer The MediaPlayer that reached the end of the file
*/
public void onCompletion(MediaPlayer mPlayer) {
this.setState(MEDIA_STOPPED);
}
/**
* Get current position of playback.
*
* @return position in msec or -1 if not playing
*/
public long getCurrentPosition() {
if ((this.state == MEDIA_RUNNING) || (this.state == MEDIA_PAUSED)) {
int curPos = this.mPlayer.getCurrentPosition();
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_POSITION+", "+curPos/1000.0f+");");
return curPos;
}
else {
return -1;
}
}
/**
* Determine if playback file is streaming or local.
* It is streaming if file name starts with "http://"
*
* @param file The file name
* @return T=streaming, F=local
*/
public boolean isStreaming(String file) {
if (file.contains("http://") || file.contains("https://")) {
return true;
}
else {
return false;
}
}
/**
* Get the duration of the audio file.
*
* @param file The name of the audio file.
* @return The duration in msec.
* -1=can't be determined
* -2=not allowed
*/
public float getDuration(String file) {
// Can't get duration of recording
if (this.recorder != null) {
return(-2); // not allowed
}
// If audio file already loaded and started, then return duration
if (this.mPlayer != null) {
return this.duration;
}
// If no player yet, then create one
else {
this.prepareOnly = true;
this.startPlaying(file);
// This will only return value for local, since streaming
// file hasn't been read yet.
return this.duration;
}
}
/**
* Callback to be invoked when the media source is ready for playback.
*
* @param mPlayer The MediaPlayer that is ready for playback
*/
public void onPrepared(MediaPlayer mPlayer) {
// Listen for playback completion
this.mPlayer.setOnCompletionListener(this);
// If start playing after prepared
if (!this.prepareOnly) {
// Start playing
this.mPlayer.start();
// Set player init flag
this.setState(MEDIA_RUNNING);
}
// Save off duration
this.duration = getDurationInSeconds();
this.prepareOnly = false;
// Send status notification to JavaScript
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_DURATION+","+this.duration+");");
}
/**
* By default Android returns the length of audio in mills but we want seconds
*
* @return length of clip in seconds
*/
private float getDurationInSeconds() {
return (this.mPlayer.getDuration() / 1000.0f);
}
/**
* Callback to be invoked when there has been an error during an asynchronous operation
* (other errors will throw exceptions at method call time).
*
* @param mPlayer the MediaPlayer the error pertains to
* @param arg1 the type of error that has occurred: (MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_SERVER_DIED)
* @param arg2 an extra code, specific to the error.
*/
public boolean onError(MediaPlayer mPlayer, int arg1, int arg2) {
Log.d(LOG_TAG, "AudioPlayer.onError(" + arg1 + ", " + arg2+")");
// TODO: Not sure if this needs to be sent?
this.mPlayer.stop();
this.mPlayer.release();
// Send error notification to JavaScript
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', { \"code\":"+arg1+"});");
return false;
}
/**
* Set the state and send it to JavaScript.
*
* @param state
*/
private void setState(int state) {
if (this.state != state) {
this.handler.sendJavascript("cordova.require('cordova/plugin/Media').onStatus('" + this.id + "', "+MEDIA_STATE+", "+state+");");
}
this.state = state;
}
/**
* Get the audio state.
*
* @return int
*/
public int getState() {
return this.state;
}
/**
* Set the volume for audio player
*
* @param volume
*/
public void setVolume(float volume) {
this.mPlayer.setVolume(volume, volume);
}
}

View File

@@ -0,0 +1,69 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
/**
* The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource
*/
public class AuthenticationToken {
private String userName;
private String password;
/**
* Gets the user name.
*
* @return the user name
*/
public String getUserName() {
return userName;
}
/**
* Sets the user name.
*
* @param userName
* the new user name
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* Gets the password.
*
* @return the password
*/
public String getPassword() {
return password;
}
/**
* Sets the password.
*
* @param password
* the new password
*/
public void setPassword(String password) {
this.password = password;
}
}

View File

@@ -0,0 +1,156 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
public class BatteryListener extends Plugin {
private static final String LOG_TAG = "BatteryManager";
BroadcastReceiver receiver;
private String batteryCallbackId = null;
/**
* Constructor.
*/
public BatteryListener() {
this.receiver = null;
}
/**
* 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.INVALID_ACTION;
String result = "Unsupported Operation: " + action;
if (action.equals("start")) {
if (this.batteryCallbackId != null) {
return new PluginResult(PluginResult.Status.ERROR, "Battery listener already running.");
}
this.batteryCallbackId = callbackId;
// We need to listen to power events to update battery status
IntentFilter intentFilter = new IntentFilter() ;
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
if (this.receiver == null) {
this.receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateBatteryInfo(intent);
}
};
ctx.registerReceiver(this.receiver, intentFilter);
}
// Don't return any result now, since status results will be sent when events come in from broadcast receiver
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true);
return pluginResult;
}
else if (action.equals("stop")) {
removeBatteryListener();
this.sendUpdate(new JSONObject(), false); // release status callback in JS side
this.batteryCallbackId = null;
return new PluginResult(PluginResult.Status.OK);
}
return new PluginResult(status, result);
}
/**
* Stop battery receiver.
*/
public void onDestroy() {
removeBatteryListener();
}
/**
* Stop the battery receiver and set it to null.
*/
private void removeBatteryListener() {
if (this.receiver != null) {
try {
this.ctx.unregisterReceiver(this.receiver);
this.receiver = null;
} catch (Exception e) {
Log.e(LOG_TAG, "Error unregistering battery receiver: " + e.getMessage(), e);
}
}
}
/**
* Creates a JSONObject with the current battery information
*
* @param batteryIntent the current battery information
* @return a JSONObject containing the battery status information
*/
private JSONObject getBatteryInfo(Intent batteryIntent) {
JSONObject obj = new JSONObject();
try {
obj.put("level", batteryIntent.getIntExtra(android.os.BatteryManager.EXTRA_LEVEL, 0));
obj.put("isPlugged", batteryIntent.getIntExtra(android.os.BatteryManager.EXTRA_PLUGGED, -1) > 0 ? true : false);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
}
return obj;
}
/**
* Updates the JavaScript side whenever the battery changes
*
* @param batteryIntent the current battery information
* @return
*/
private void updateBatteryInfo(Intent batteryIntent) {
sendUpdate(this.getBatteryInfo(batteryIntent), true);
}
/**
* Create a new plugin result and send it back to JavaScript
*
* @param connection the network info to set as navigator.connection
*/
private void sendUpdate(JSONObject info, boolean keepCallback) {
if (this.batteryCallbackId != null) {
PluginResult result = new PluginResult(PluginResult.Status.OK, info);
result.setKeepCallback(keepCallback);
this.success(result, this.batteryCallbackId);
}
}
}

View File

@@ -0,0 +1,431 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLEncoder;
import java.util.LinkedList;
import android.util.Log;
/**
* This class provides a way for Java to run JavaScript in the web page that has loaded Cordova.
* The CallbackServer class implements an XHR server and a polling server with a list of JavaScript
* statements that are to be executed on the web page.
*
* The process flow for XHR is:
* 1. JavaScript makes an async XHR call.
* 2. The server holds the connection open until data is available.
* 3. The server writes the data to the client and closes the connection.
* 4. The server immediately starts listening for the next XHR call.
* 5. The client receives this XHR response, processes it.
* 6. The client sends a new async XHR request.
*
* The CallbackServer class requires the following permission in Android manifest file
* <uses-permission android:name="android.permission.INTERNET" />
*
* If the device has a proxy set, then XHR cannot be used, so polling must be used instead.
* This can be determined by the client by calling CallbackServer.usePolling().
*
* The process flow for polling is:
* 1. The client calls CallbackServer.getJavascript() to retrieve next statement.
* 2. If statement available, then client processes it.
* 3. The client repeats #1 in loop.
*/
public class CallbackServer implements Runnable {
private static final String LOG_TAG = "CallbackServer";
/**
* The list of JavaScript statements to be sent to JavaScript.
*/
private LinkedList<String> javascript;
/**
* The port to listen on.
*/
private int port;
/**
* The server thread.
*/
private Thread serverThread;
/**
* Indicates the server is running.
*/
private boolean active;
/**
* Indicates that the JavaScript statements list is empty
*/
private boolean empty;
/**
* Indicates that polling should be used instead of XHR.
*/
private boolean usePolling = true;
/**
* Security token to prevent other apps from accessing this callback server via XHR
*/
private String token;
/**
* Constructor.
*/
public CallbackServer() {
//System.out.println("CallbackServer()");
this.active = false;
this.empty = true;
this.port = 0;
this.javascript = new LinkedList<String>();
}
/**
* Init callback server and start XHR if running local app.
*
* If Cordova app is loaded from file://, then we can use XHR
* otherwise we have to use polling due to cross-domain security restrictions.
*
* @param url The URL of the Cordova app being loaded
*/
public void init(String url) {
//System.out.println("CallbackServer.start("+url+")");
this.active = false;
this.empty = true;
this.port = 0;
this.javascript = new LinkedList<String>();
// Determine if XHR or polling is to be used
if ((url != null) && !url.startsWith("file://")) {
this.usePolling = true;
this.stopServer();
}
else if (android.net.Proxy.getDefaultHost() != null) {
this.usePolling = true;
this.stopServer();
}
else {
this.usePolling = false;
this.startServer();
}
}
/**
* Re-init when loading a new HTML page into webview.
*
* @param url The URL of the Cordova app being loaded
*/
public void reinit(String url) {
this.stopServer();
this.init(url);
}
/**
* Return if polling is being used instead of XHR.
*
* @return
*/
public boolean usePolling() {
return this.usePolling;
}
/**
* Get the port that this server is running on.
*
* @return
*/
public int getPort() {
return this.port;
}
/**
* Get the security token that this server requires when calling getJavascript().
*
* @return
*/
public String getToken() {
return this.token;
}
/**
* Start the server on a new thread.
*/
public void startServer() {
//System.out.println("CallbackServer.startServer()");
this.active = false;
// Start server on new thread
this.serverThread = new Thread(this);
this.serverThread.start();
}
/**
* Restart the server on a new thread.
*/
public void restartServer() {
// Stop server
this.stopServer();
// Start server again
this.startServer();
}
/**
* Start running the server.
* This is called automatically when the server thread is started.
*/
public void run() {
// Start server
try {
this.active = true;
String request;
ServerSocket waitSocket = new ServerSocket(0);
this.port = waitSocket.getLocalPort();
//System.out.println("CallbackServer -- using port " +this.port);
this.token = java.util.UUID.randomUUID().toString();
//System.out.println("CallbackServer -- using token "+this.token);
while (this.active) {
//System.out.println("CallbackServer: Waiting for data on socket");
Socket connection = waitSocket.accept();
BufferedReader xhrReader = new BufferedReader(new InputStreamReader(connection.getInputStream()),40);
DataOutputStream output = new DataOutputStream(connection.getOutputStream());
request = xhrReader.readLine();
String response = "";
//System.out.println("CallbackServerRequest="+request);
if (this.active && (request != null)) {
if (request.contains("GET")) {
// Get requested file
String[] requestParts = request.split(" ");
// Must have security token
if ((requestParts.length == 3) && (requestParts[1].substring(1).equals(this.token))) {
//System.out.println("CallbackServer -- Processing GET request");
// Wait until there is some data to send, or send empty data every 10 sec
// to prevent XHR timeout on the client
synchronized (this) {
while (this.empty) {
try {
this.wait(10000); // prevent timeout from happening
//System.out.println("CallbackServer>>> break <<<");
break;
}
catch (Exception e) { }
}
}
// If server is still running
if (this.active) {
// If no data, then send 404 back to client before it times out
if (this.empty) {
//System.out.println("CallbackServer -- sending data 0");
response = "HTTP/1.1 404 NO DATA\r\n\r\n "; // need to send content otherwise some Android devices fail, so send space
}
else {
//System.out.println("CallbackServer -- sending item");
response = "HTTP/1.1 200 OK\r\n\r\n";
String js = this.getJavascript();
if (js != null) {
response += encode(js, "UTF-8");
}
}
}
else {
response = "HTTP/1.1 503 Service Unavailable\r\n\r\n ";
}
}
else {
response = "HTTP/1.1 403 Forbidden\r\n\r\n ";
}
}
else {
response = "HTTP/1.1 400 Bad Request\r\n\r\n ";
}
//System.out.println("CallbackServer: response="+response);
//System.out.println("CallbackServer: closing output");
output.writeBytes(response);
output.flush();
}
output.close();
xhrReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
this.active = false;
//System.out.println("CallbackServer.startServer() - EXIT");
}
/**
* Stop server.
* This stops the thread that the server is running on.
*/
public void stopServer() {
//System.out.println("CallbackServer.stopServer()");
if (this.active) {
this.active = false;
// Break out of server wait
synchronized (this) {
this.notify();
}
}
}
/**
* Destroy
*/
public void destroy() {
this.stopServer();
}
/**
* Get the number of JavaScript statements.
*
* @return int
*/
public int getSize() {
synchronized(this) {
int size = this.javascript.size();
return size;
}
}
/**
* Get the next JavaScript statement and remove from list.
*
* @return String
*/
public String getJavascript() {
synchronized(this) {
if (this.javascript.size() == 0) {
return null;
}
String statement = this.javascript.remove(0);
if (this.javascript.size() == 0) {
this.empty = true;
}
return statement;
}
}
/**
* Add a JavaScript statement to the list.
*
* @param statement
*/
public void sendJavascript(String statement) {
synchronized (this) {
this.javascript.add(statement);
this.empty = false;
this.notify();
}
}
/* The Following code has been modified from original implementation of URLEncoder */
/* start */
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
static final String digits = "0123456789ABCDEF";
/**
* This will encode the return value to JavaScript. We revert the encoding for
* common characters that don't require encoding to reduce the size of the string
* being passed to JavaScript.
*
* @param s to be encoded
* @param enc encoding type
* @return encoded string
*/
public static String encode(String s, String enc) throws UnsupportedEncodingException {
if (s == null || enc == null) {
throw new NullPointerException();
}
// check for UnsupportedEncodingException
"".getBytes(enc);
// Guess a bit bigger for encoded form
StringBuilder buf = new StringBuilder(s.length() + 16);
int start = -1;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
|| (ch >= '0' && ch <= '9')
|| " .-*_'(),<>=?@[]{}:~\"\\/;!".indexOf(ch) > -1) {
if (start >= 0) {
convert(s.substring(start, i), buf, enc);
start = -1;
}
if (ch != ' ') {
buf.append(ch);
} else {
buf.append(' ');
}
} else {
if (start < 0) {
start = i;
}
}
}
if (start >= 0) {
convert(s.substring(start, s.length()), buf, enc);
}
return buf.toString();
}
private static void convert(String s, StringBuilder buf, String enc) throws UnsupportedEncodingException {
byte[] bytes = s.getBytes(enc);
for (int j = 0; j < bytes.length; j++) {
buf.append('%');
buf.append(digits.charAt((bytes[j] & 0xf0) >> 4));
buf.append(digits.charAt(bytes[j] & 0xf));
}
}
/* end */
}

View File

@@ -0,0 +1,527 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.codec.binary.Base64;
import org.apache.cordova.api.LOG;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.provider.MediaStore;
/**
* This class launches the camera view, allows the user to take a picture, closes the camera view,
* and returns the captured image. When the camera view is closed, the screen displayed before
* the camera view was shown is redisplayed.
*/
public class CameraLauncher extends Plugin {
private static final int DATA_URL = 0; // Return base64 encoded string
private static final int FILE_URI = 1; // Return file uri (content://media/external/images/media/2 for Android)
private static final int PHOTOLIBRARY = 0; // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
private static final int CAMERA = 1; // Take picture from camera
private static final int SAVEDPHOTOALBUM = 2; // Choose image from picture library (same as PHOTOLIBRARY for Android)
private static final int PICTURE = 0; // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
private static final int VIDEO = 1; // allow selection of video only, ONLY RETURNS URL
private static final int ALLMEDIA = 2; // allow selection from all media types
private static final int JPEG = 0; // Take a picture of type JPEG
private static final int PNG = 1; // Take a picture of type PNG
private static final String GET_PICTURE = "Get Picture";
private static final String GET_VIDEO = "Get Video";
private static final String GET_All = "Get All";
private static final String LOG_TAG = "CameraLauncher";
private int mQuality; // Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
private int targetWidth; // desired width of the image
private int targetHeight; // desired height of the image
private Uri imageUri; // Uri of captured image
private int encodingType; // Type of encoding to use
private int mediaType; // What type of media to retrieve
public String callbackId;
private int numPics;
/**
* Constructor.
*/
public CameraLauncher() {
}
/**
* 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 = "";
this.callbackId = callbackId;
try {
if (action.equals("takePicture")) {
int srcType = CAMERA;
int destType = FILE_URI;
this.targetHeight = 0;
this.targetWidth = 0;
this.encodingType = JPEG;
this.mediaType = PICTURE;
this.mQuality = 80;
this.mQuality = args.getInt(0);
destType = args.getInt(1);
srcType = args.getInt(2);
this.targetWidth = args.getInt(3);
this.targetHeight = args.getInt(4);
this.encodingType = args.getInt(5);
this.mediaType = args.getInt(6);
if (srcType == CAMERA) {
this.takePicture(destType, encodingType);
}
else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) {
this.getImage(srcType, destType);
}
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
}
return new PluginResult(status, result);
} catch (JSONException e) {
e.printStackTrace();
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
//--------------------------------------------------------------------------
// LOCAL METHODS
//--------------------------------------------------------------------------
/**
* Take a picture with the camera.
* When an image is captured or the camera view is cancelled, the result is returned
* in CordovaActivity.onActivityResult, which forwards the result to this.onActivityResult.
*
* The image can either be returned as a base64 string or a URI that points to the file.
* To display base64 string in an img tag, set the source to:
* img.src="data:image/jpeg;base64,"+result;
* or to display URI in an img tag
* img.src=result;
*
* @param quality Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
* @param returnType Set the type of image to return.
*/
public void takePicture(int returnType, int encodingType) {
// Save the number of images currently on disk for later
this.numPics = queryImgDB().getCount();
// Display camera
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// Specify file so that large image is captured and returned
// TODO: What if there isn't any external storage?
File photo = createCaptureFile(encodingType);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
this.imageUri = Uri.fromFile(photo);
this.ctx.startActivityForResult((Plugin) this, intent, (CAMERA+1)*16 + returnType+1);
}
/**
* Create a file in the applications temporary directory based upon the supplied encoding.
*
* @param encodingType of the image to be taken
* @return a File object pointing to the temporary picture
*/
private File createCaptureFile(int encodingType) {
File photo = null;
if (encodingType == JPEG) {
photo = new File(DirectoryManager.getTempDirectoryPath(ctx.getContext()), "Pic.jpg");
} else if (encodingType == PNG) {
photo = new File(DirectoryManager.getTempDirectoryPath(ctx.getContext()), "Pic.png");
} else {
throw new IllegalArgumentException("Invalid Encoding Type: " + encodingType);
}
return photo;
}
/**
* Get image from photo library.
*
* @param quality Compression quality hint (0-100: 0=low quality & high compression, 100=compress of max quality)
* @param srcType The album to get image from.
* @param returnType Set the type of image to return.
*/
// TODO: Images selected from SDCARD don't display correctly, but from CAMERA ALBUM do!
public void getImage(int srcType, int returnType) {
Intent intent = new Intent();
String title = GET_PICTURE;
if (this.mediaType == PICTURE) {
intent.setType("image/*");
}
else if (this.mediaType == VIDEO) {
intent.setType("video/*");
title = GET_VIDEO;
}
else if (this.mediaType == ALLMEDIA) {
// I wanted to make the type 'image/*, video/*' but this does not work on all versions
// of android so I had to go with the wildcard search.
intent.setType("*/*");
title = GET_All;
}
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
this.ctx.startActivityForResult((Plugin) this, Intent.createChooser(intent,
new String(title)), (srcType+1)*16 + returnType + 1);
}
/**
* Scales the bitmap according to the requested size.
*
* @param bitmap The bitmap to scale.
* @return Bitmap A new Bitmap object of the same bitmap after scaling.
*/
public Bitmap scaleBitmap(Bitmap bitmap) {
int newWidth = this.targetWidth;
int newHeight = this.targetHeight;
int origWidth = bitmap.getWidth();
int origHeight = bitmap.getHeight();
// If no new width or height were specified return the original bitmap
if (newWidth <= 0 && newHeight <= 0) {
return bitmap;
}
// Only the width was specified
else if (newWidth > 0 && newHeight <= 0) {
newHeight = (newWidth * origHeight) / origWidth;
}
// only the height was specified
else if (newWidth <= 0 && newHeight > 0) {
newWidth = (newHeight * origWidth) / origHeight;
}
// If the user specified both a positive width and height
// (potentially different aspect ratio) then the width or height is
// scaled so that the image fits while maintaining aspect ratio.
// Alternatively, the specified width and height could have been
// kept and Bitmap.SCALE_TO_FIT specified when scaling, but this
// would result in whitespace in the new image.
else {
double newRatio = newWidth / (double)newHeight;
double origRatio = origWidth / (double)origHeight;
if (origRatio > newRatio) {
newHeight = (newWidth * origHeight) / origWidth;
} else if (origRatio < newRatio) {
newWidth = (newHeight * origWidth) / origHeight;
}
}
Bitmap retval = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
bitmap.recycle();
return retval;
}
/**
* Called when the camera view exits.
*
* @param requestCode The request code originally supplied to startActivityForResult(),
* allowing you to identify who this result came from.
* @param resultCode The integer result code returned by the child activity through its setResult().
* @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
*/
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
// Get src and dest types from request code
int srcType = (requestCode/16) - 1;
int destType = (requestCode % 16) - 1;
int rotate = 0;
// Create an ExifHelper to save the exif data that is lost during compression
ExifHelper exif = new ExifHelper();
try {
if (this.encodingType == JPEG) {
exif.createInFile(DirectoryManager.getTempDirectoryPath(ctx.getContext()) + "/Pic.jpg");
exif.readExifData();
}
} catch (IOException e) {
e.printStackTrace();
}
// If CAMERA
if (srcType == CAMERA) {
// If image available
if (resultCode == Activity.RESULT_OK) {
try {
// Read in bitmap of captured image
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getContentResolver(), imageUri);
} catch (FileNotFoundException e) {
Uri uri = intent.getData();
android.content.ContentResolver resolver = this.ctx.getContentResolver();
bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
}
bitmap = scaleBitmap(bitmap);
// If sending base64 image back
if (destType == DATA_URL) {
this.processPicture(bitmap);
checkForDuplicateImage(DATA_URL);
}
// If sending filename back
else if (destType == FILE_URI){
// Create entry in media store for image
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
ContentValues values = new ContentValues();
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = null;
try {
uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException e) {
LOG.d(LOG_TAG, "Can't write to external media storage.");
try {
uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException ex) {
LOG.d(LOG_TAG, "Can't write to internal media storage.");
this.failPicture("Error capturing image - no media storage found.");
return;
}
}
// Add compressed version of captured image to returned media store Uri
OutputStream os = this.ctx.getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
os.close();
// Restore exif data to file
if (this.encodingType == JPEG) {
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
}
// Send Uri back to JavaScript for viewing image
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
}
bitmap.recycle();
bitmap = null;
System.gc();
checkForDuplicateImage(FILE_URI);
} catch (IOException e) {
e.printStackTrace();
this.failPicture("Error capturing image.");
}
}
// If cancelled
else if (resultCode == Activity.RESULT_CANCELED) {
this.failPicture("Camera cancelled.");
}
// If something else
else {
this.failPicture("Did not complete!");
}
}
// If retrieving photo from library
else if ((srcType == PHOTOLIBRARY) || (srcType == SAVEDPHOTOALBUM)) {
if (resultCode == Activity.RESULT_OK) {
Uri uri = intent.getData();
android.content.ContentResolver resolver = this.ctx.getContentResolver();
// If you ask for video or all media type you will automatically get back a file URI
// and there will be no attempt to resize any returned data
if (this.mediaType != PICTURE) {
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
}
else {
// If sending base64 image back
if (destType == DATA_URL) {
try {
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
String[] cols = { MediaStore.Images.Media.ORIENTATION };
Cursor cursor = this.ctx.getContentResolver().query(intent.getData(),
cols,
null, null, null);
if (cursor != null) {
cursor.moveToPosition(0);
rotate = cursor.getInt(0);
cursor.close();
}
if (rotate != 0) {
Matrix matrix = new Matrix();
matrix.setRotate(rotate);
bitmap = bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
bitmap = scaleBitmap(bitmap);
this.processPicture(bitmap);
bitmap.recycle();
bitmap = null;
System.gc();
} catch (FileNotFoundException e) {
e.printStackTrace();
this.failPicture("Error retrieving image.");
}
}
// If sending filename back
else if (destType == FILE_URI) {
// Do we need to scale the returned file
if (this.targetHeight > 0 && this.targetWidth > 0) {
try {
Bitmap bitmap = android.graphics.BitmapFactory.decodeStream(resolver.openInputStream(uri));
bitmap = scaleBitmap(bitmap);
String fileName = DirectoryManager.getTempDirectoryPath(ctx.getContext()) + "/resize.jpg";
OutputStream os = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
os.close();
// Restore exif data to file
if (this.encodingType == JPEG) {
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
}
bitmap.recycle();
bitmap = null;
// The resized image is cached by the app in order to get around this and not have to delete you
// application cache I'm adding the current system time to the end of the file url.
this.success(new PluginResult(PluginResult.Status.OK, ("file://" + fileName + "?" + System.currentTimeMillis())), this.callbackId);
System.gc();
} catch (Exception e) {
e.printStackTrace();
this.failPicture("Error retrieving image.");
}
}
else {
this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
}
}
}
}
else if (resultCode == Activity.RESULT_CANCELED) {
this.failPicture("Selection cancelled.");
}
else {
this.failPicture("Selection did not complete!");
}
}
}
/**
* Creates a cursor that can be used to determine how many images we have.
*
* @return a cursor
*/
private Cursor queryImgDB() {
return this.ctx.getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
null,
null,
null);
}
/**
* Used to find out if we are in a situation where the Camera Intent adds to images
* to the content store. If we are using a FILE_URI and the number of images in the DB
* increases by 2 we have a duplicate, when using a DATA_URL the number is 1.
*
* @param type FILE_URI or DATA_URL
*/
private void checkForDuplicateImage(int type) {
int diff = 1;
Cursor cursor = queryImgDB();
int currentNumOfImages = cursor.getCount();
if (type == FILE_URI) {
diff = 2;
}
// delete the duplicate file if the difference is 2 for file URI or 1 for Data URL
if ((currentNumOfImages - numPics) == diff) {
cursor.moveToLast();
int id = Integer.valueOf(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID))) - 1;
Uri uri = Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + id);
this.ctx.getContentResolver().delete(uri, null, null);
}
}
/**
* Compress bitmap using jpeg, convert to Base64 encoded string, and return to JavaScript.
*
* @param bitmap
*/
public void processPicture(Bitmap bitmap) {
ByteArrayOutputStream jpeg_data = new ByteArrayOutputStream();
try {
if (bitmap.compress(CompressFormat.JPEG, mQuality, jpeg_data)) {
byte[] code = jpeg_data.toByteArray();
byte[] output = Base64.encodeBase64(code);
String js_out = new String(output);
this.success(new PluginResult(PluginResult.Status.OK, js_out), this.callbackId);
js_out = null;
output = null;
code = null;
}
}
catch(Exception e) {
this.failPicture("Error compressing image.");
}
jpeg_data = null;
}
/**
* Send error message to JavaScript.
*
* @param err
*/
public void failPicture(String err) {
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
}
}

View File

@@ -0,0 +1,400 @@
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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 org.apache.cordova;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.cordova.api.LOG;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.util.Log;
public class Capture extends Plugin {
private static final String VIDEO_3GPP = "video/3gpp";
private static final String VIDEO_MP4 = "video/mp4";
private static final String AUDIO_3GPP = "audio/3gpp";
private static final String IMAGE_JPEG = "image/jpeg";
private static final int CAPTURE_AUDIO = 0; // Constant for capture audio
private static final int CAPTURE_IMAGE = 1; // Constant for capture image
private static final int CAPTURE_VIDEO = 2; // Constant for capture video
private static final String LOG_TAG = "Capture";
private static final int CAPTURE_INTERNAL_ERR = 0;
private static final int CAPTURE_APPLICATION_BUSY = 1;
private static final int CAPTURE_INVALID_ARGUMENT = 2;
private static final int CAPTURE_NO_MEDIA_FILES = 3;
private static final int CAPTURE_NOT_SUPPORTED = 20;
private String callbackId; // The ID of the callback to be invoked with our result
private long limit; // the number of pics/vids/clips to take
private double duration; // optional duration parameter for video recording
private JSONArray results; // The array of results to be returned to the user
private Uri imageUri; // Uri of captured image
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
this.callbackId = callbackId;
this.limit = 1;
this.duration = 0.0f;
this.results = new JSONArray();
JSONObject options = args.optJSONObject(0);
if (options != null) {
limit = options.optLong("limit", 1);
duration = options.optDouble("duration", 0.0f);
}
if (action.equals("getFormatData")) {
try {
JSONObject obj = getFormatData(args.getString(0), args.getString(1));
return new PluginResult(PluginResult.Status.OK, obj);
} catch (JSONException e) {
return new PluginResult(PluginResult.Status.ERROR);
}
}
else if (action.equals("captureAudio")) {
this.captureAudio();
}
else if (action.equals("captureImage")) {
this.captureImage();
}
else if (action.equals("captureVideo")) {
this.captureVideo(duration);
}
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;
}
/**
* Provides the media data file data depending on it's mime type
*
* @param filePath path to the file
* @param mimeType of the file
* @return a MediaFileData object
*/
private JSONObject getFormatData(String filePath, String mimeType) {
JSONObject obj = new JSONObject();
try {
// setup defaults
obj.put("height", 0);
obj.put("width", 0);
obj.put("bitrate", 0);
obj.put("duration", 0);
obj.put("codecs", "");
// If the mimeType isn't set the rest will fail
// so let's see if we can determine it.
if (mimeType == null || mimeType.equals("")) {
mimeType = FileUtils.getMimeType(filePath);
}
Log.d(LOG_TAG, "Mime type = " + mimeType);
if (mimeType.equals(IMAGE_JPEG) || filePath.endsWith(".jpg")) {
obj = getImageData(filePath, obj);
}
else if (mimeType.endsWith(AUDIO_3GPP)) {
obj = getAudioVideoData(filePath, obj, false);
}
else if (mimeType.equals(VIDEO_3GPP) || mimeType.equals(VIDEO_MP4)) {
obj = getAudioVideoData(filePath, obj, true);
}
}
catch (JSONException e) {
Log.d(LOG_TAG, "Error: setting media file data object");
}
return obj;
}
/**
* Get the Image specific attributes
*
* @param filePath path to the file
* @param obj represents the Media File Data
* @return a JSONObject that represents the Media File Data
* @throws JSONException
*/
private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
obj.put("height", bitmap.getHeight());
obj.put("width", bitmap.getWidth());
return obj;
}
/**
* Get the Image specific attributes
*
* @param filePath path to the file
* @param obj represents the Media File Data
* @param video if true get video attributes as well
* @return a JSONObject that represents the Media File Data
* @throws JSONException
*/
private JSONObject getAudioVideoData(String filePath, JSONObject obj, boolean video) throws JSONException {
MediaPlayer player = new MediaPlayer();
try {
player.setDataSource(filePath);
player.prepare();
obj.put("duration", player.getDuration()/1000);
if (video) {
obj.put("height", player.getVideoHeight());
obj.put("width", player.getVideoWidth());
}
}
catch (IOException e) {
Log.d(LOG_TAG, "Error: loading video file");
}
return obj;
}
/**
* Sets up an intent to capture audio. Result handled by onActivityResult()
*/
private void captureAudio() {
Intent intent = new Intent(android.provider.MediaStore.Audio.Media.RECORD_SOUND_ACTION);
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_AUDIO);
}
/**
* Sets up an intent to capture images. Result handled by onActivityResult()
*/
private void captureImage() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// Specify file so that large image is captured and returned
File photo = new File(DirectoryManager.getTempDirectoryPath(ctx.getContext()), "Capture.jpg");
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
this.imageUri = Uri.fromFile(photo);
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_IMAGE);
}
/**
* Sets up an intent to capture video. Result handled by onActivityResult()
*/
private void captureVideo(double duration) {
Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
// Introduced in API 8
//intent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT, duration);
this.ctx.startActivityForResult((Plugin) this, intent, CAPTURE_VIDEO);
}
/**
* Called when the video view exits.
*
* @param requestCode The request code originally supplied to startActivityForResult(),
* allowing you to identify who this result came from.
* @param resultCode The integer result code returned by the child activity through its setResult().
* @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
* @throws JSONException
*/
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
// Result received okay
if (resultCode == Activity.RESULT_OK) {
// An audio clip was requested
if (requestCode == CAPTURE_AUDIO) {
// Get the uri of the audio clip
Uri data = intent.getData();
// create a file object from the uri
results.put(createMediaFile(data));
if (results.length() >= limit) {
// Send Uri back to JavaScript for listening to audio
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
} else {
// still need to capture more audio clips
captureAudio();
}
} else if (requestCode == CAPTURE_IMAGE) {
// For some reason if I try to do:
// Uri data = intent.getData();
// It crashes in the emulator and on my phone with a null pointer exception
// To work around it I had to grab the code from CameraLauncher.java
try {
// Create an ExifHelper to save the exif data that is lost during compression
ExifHelper exif = new ExifHelper();
exif.createInFile(DirectoryManager.getTempDirectoryPath(ctx.getContext()) + "/Capture.jpg");
exif.readExifData();
// Read in bitmap of captured image
Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(this.ctx.getContentResolver(), imageUri);
// Create entry in media store for image
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
ContentValues values = new ContentValues();
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, IMAGE_JPEG);
Uri uri = null;
try {
uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException e) {
LOG.d(LOG_TAG, "Can't write to external media storage.");
try {
uri = this.ctx.getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException ex) {
LOG.d(LOG_TAG, "Can't write to internal media storage.");
this.fail(createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image - no media storage found."));
return;
}
}
// Add compressed version of captured image to returned media store Uri
OutputStream os = this.ctx.getContentResolver().openOutputStream(uri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.close();
bitmap.recycle();
bitmap = null;
System.gc();
// Restore exif data to file
exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.ctx));
exif.writeExifData();
// Add image to results
results.put(createMediaFile(uri));
if (results.length() >= limit) {
// Send Uri back to JavaScript for viewing image
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
} else {
// still need to capture more images
captureImage();
}
} catch (IOException e) {
e.printStackTrace();
this.fail(createErrorObject(CAPTURE_INTERNAL_ERR, "Error capturing image."));
}
} else if (requestCode == CAPTURE_VIDEO) {
// Get the uri of the video clip
Uri data = intent.getData();
// create a file object from the uri
results.put(createMediaFile(data));
if (results.length() >= limit) {
// Send Uri back to JavaScript for viewing video
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
} else {
// still need to capture more video clips
captureVideo(duration);
}
}
}
// If canceled
else if (resultCode == Activity.RESULT_CANCELED) {
// If we have partial results send them back to the user
if (results.length() > 0) {
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
}
// user canceled the action
else {
this.fail(createErrorObject(CAPTURE_NO_MEDIA_FILES, "Canceled."));
}
}
// If something else
else {
// If we have partial results send them back to the user
if (results.length() > 0) {
this.success(new PluginResult(PluginResult.Status.OK, results), this.callbackId);
}
// something bad happened
else {
this.fail(createErrorObject(CAPTURE_NO_MEDIA_FILES, "Did not complete!"));
}
}
}
/**
* Creates a JSONObject that represents a File from the Uri
*
* @param data the Uri of the audio/image/video
* @return a JSONObject that represents a File
* @throws IOException
*/
private JSONObject createMediaFile(Uri data){
File fp = new File(FileUtils.getRealPathFromURI(data, this.ctx));
JSONObject obj = new JSONObject();
try {
// File properties
obj.put("name", fp.getName());
obj.put("fullPath", fp.getAbsolutePath());
// Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
// are reported as video/3gpp. I'm doing this hacky check of the URI to see if it
// is stored in the audio or video content store.
if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
if (data.toString().contains("/audio/")) {
obj.put("type", AUDIO_3GPP);
} else {
obj.put("type", VIDEO_3GPP);
}
} else {
obj.put("type", FileUtils.getMimeType(fp.getAbsolutePath()));
}
obj.put("lastModifiedDate", fp.lastModified());
obj.put("size", fp.length());
} catch (JSONException e) {
// this will never happen
e.printStackTrace();
}
return obj;
}
private JSONObject createErrorObject(int code, String message) {
JSONObject obj = new JSONObject();
try {
obj.put("code", code);
obj.put("message", message);
} catch (JSONException e) {
// This will never happen
}
return obj;
}
/**
* Send error message to JavaScript.
*
* @param err
*/
public void fail(JSONObject err) {
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
}
}

Some files were not shown because too many files have changed in this diff Show More