From b2f49b15ba26cf59069491bd89fef90c43272cc3 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Thu, 10 May 2012 12:25:47 -0700 Subject: [PATCH 01/17] Don't commit Eclipse preferences --- framework/.settings/org.eclipse.jdt.core.prefs | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 framework/.settings/org.eclipse.jdt.core.prefs diff --git a/framework/.settings/org.eclipse.jdt.core.prefs b/framework/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f77b31c2..00000000 --- a/framework/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.source=1.5 From 08a32272d37174b15d9e53cb2c2ca1ff2bfdc5d0 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Thu, 10 May 2012 16:40:41 -0700 Subject: [PATCH 02/17] [CB-683] Pause and resume events should route through fireDocumentEvent so we get the event object passed into the handler --- framework/src/org/apache/cordova/DroidGap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/org/apache/cordova/DroidGap.java b/framework/src/org/apache/cordova/DroidGap.java index 107eb52a..5e2586d0 100755 --- a/framework/src/org/apache/cordova/DroidGap.java +++ b/framework/src/org/apache/cordova/DroidGap.java @@ -813,7 +813,7 @@ public class DroidGap extends Activity implements CordovaInterface { } // Send pause event to JavaScript - this.appView.loadUrl("javascript:try{cordova.require('cordova/channel').onPause.fire();}catch(e){console.log('exception firing pause event from native');};"); + this.appView.loadUrl("javascript:try{cordova.fireDocumentEvent('pause');}catch(e){console.log('exception firing pause event from native');};"); // Forward to plugins if (this.pluginManager != null) { @@ -858,7 +858,7 @@ public class DroidGap extends Activity implements CordovaInterface { } // Send resume event to JavaScript - this.appView.loadUrl("javascript:try{cordova.require('cordova/channel').onResume.fire();}catch(e){console.log('exception firing resume event from native');};"); + this.appView.loadUrl("javascript:try{cordova.fireDocumentEvent('resume');}catch(e){console.log('exception firing resume event from native');};"); // Forward to plugins if (this.pluginManager != null) { From 6a628f7f2d886f8e1bc146c2beab21d02096e068 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Thu, 10 May 2012 16:43:08 -0700 Subject: [PATCH 03/17] [CB-683] updating JS for fix for 683 --- framework/assets/js/cordova.android.js | 55 +++++++++++++++----------- framework/project.properties | 2 +- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/framework/assets/js/cordova.android.js b/framework/assets/js/cordova.android.js index 402de0c0..7bb06c2f 100644 --- a/framework/assets/js/cordova.android.js +++ b/framework/assets/js/cordova.android.js @@ -1,6 +1,6 @@ -// commit a5f0a62f9a9dc5fd7af95ec3d09b6b17c0b89b44 +// commit facaa38a0bd924aa15c14c372537c00382f1e593 -// File generated at :: Mon May 07 2012 16:20:11 GMT-0700 (PDT) +// File generated at :: Thu May 10 2012 16:39:13 GMT-0700 (PDT) /* Licensed to the Apache Software Foundation (ASF) under one @@ -98,17 +98,7 @@ var documentEventHandlers = {}, document.addEventListener = function(evt, handler, capture) { var e = evt.toLowerCase(); - if (e == 'deviceready') { - channel.onDeviceReady.subscribeOnce(handler); - } else if (e == 'resume') { - channel.onResume.subscribe(handler); - // if subscribing listener after event has already fired, invoke the handler - if (channel.onResume.fired && typeof handler == 'function') { - handler(); - } - } else if (e == 'pause') { - channel.onPause.subscribe(handler); - } else if (typeof documentEventHandlers[e] != 'undefined') { + if (typeof documentEventHandlers[e] != 'undefined') { documentEventHandlers[e].subscribe(handler); } else { m_document_addEventListener.call(document, evt, handler, capture); @@ -126,13 +116,8 @@ window.addEventListener = function(evt, handler, capture) { document.removeEventListener = function(evt, handler, capture) { var e = evt.toLowerCase(); - // Check for pause/resume events first. - if (e == 'resume') { - channel.onResume.unsubscribe(handler); - } else if (e == 'pause') { - channel.onPause.unsubscribe(handler); // If unsubcribing from an event that is handled by a plugin - } else if (typeof documentEventHandlers[e] != "undefined") { + if (typeof documentEventHandlers[e] != "undefined") { documentEventHandlers[e].unsubscribe(handler); } else { m_document_removeEventListener.call(document, evt, handler, capture); @@ -318,6 +303,11 @@ var cordova = { } }; +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready'); + // Adds deprecation warnings to functions of an object (but only logs a message once) function deprecateFunctions(obj, objLabel) { var newObj = {}; @@ -645,10 +635,13 @@ Channel.prototype.unsubscribe = function(g) { if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; } if (typeof g == 'function') { g = g.observer_guid; } - this.handlers[g] = null; - delete this.handlers[g]; - this.numHandlers--; - if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this); + var handler = this.handlers[g]; + if (handler) { + this.handlers[g] = null; + delete this.handlers[g]; + this.numHandlers--; + if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this); + } }; /** @@ -1145,6 +1138,7 @@ module.exports = { } } }; + }); // file: lib/common/plugin/Acceleration.js @@ -1986,6 +1980,21 @@ Entry.prototype.getMetadata = function(successCallback, errorCallback) { exec(success, fail, "File", "getMetadata", [this.fullPath]); }; +/** + * Set the metadata of the entry. + * + * @param successCallback + * {Function} is called with a Metadata object + * @param errorCallback + * {Function} is called with a FileError + * @param metadataObject + * {Object} keys and values to set + */ +Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { + + exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]); +}; + /** * Move a file or directory to a new location. * diff --git a/framework/project.properties b/framework/project.properties index 247ca66e..276f1305 100644 --- a/framework/project.properties +++ b/framework/project.properties @@ -10,5 +10,5 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-14 +target=Google Inc.:Google APIs:15 apk-configurations= From eb66eb02cb9b06a2bbc17269a8d98d9ac641a2d2 Mon Sep 17 00:00:00 2001 From: macdonst Date: Fri, 11 May 2012 16:43:00 -0400 Subject: [PATCH 04/17] Switch to using stripFileProtocol in FileUtils.notifyDelete --- framework/src/org/apache/cordova/FileUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java index c8a45cb4..c7d02804 100755 --- a/framework/src/org/apache/cordova/FileUtils.java +++ b/framework/src/org/apache/cordova/FileUtils.java @@ -220,7 +220,7 @@ public class FileUtils extends Plugin { * @param filePath the path to check */ private void notifyDelete(String filePath) { - String newFilePath = filePath.substring(7); + String newFilePath = stripFileProtocol(filePath); int result = this.ctx.getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + " = ?", new String[] {newFilePath}); From c6349668dd24d53bf893425543b5c4bdc0ebda84 Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Fri, 11 May 2012 16:07:43 -0700 Subject: [PATCH 05/17] Tweaked create so it fetches the commons-codec using curl --- bin/create | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/create b/bin/create index 84122a54..e7670441 100755 --- a/bin/create +++ b/bin/create @@ -38,6 +38,11 @@ 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 ../ From 7eb3e5d13955725f44f72cb816c2fc2b2f376e18 Mon Sep 17 00:00:00 2001 From: filmaj Date: Wed, 16 May 2012 19:38:11 -0700 Subject: [PATCH 06/17] [CB-659] create script should work on android --- bin/create.bat | 2 +- bin/create.js | 61 ++++++++++++++------ bin/templates/project/cordova/create.bat | 2 + bin/templates/project/cordova/create.js | 70 +++++++++++++++++++++++ bin/templates/project/cordova/debug.bat | 0 bin/templates/project/cordova/emulate.bat | 0 bin/templates/project/cordova/log.bat | 0 7 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 bin/templates/project/cordova/create.bat create mode 100644 bin/templates/project/cordova/create.js create mode 100644 bin/templates/project/cordova/debug.bat create mode 100644 bin/templates/project/cordova/emulate.bat create mode 100644 bin/templates/project/cordova/log.bat diff --git a/bin/create.bat b/bin/create.bat index b9c9392b..7182d21e 100644 --- a/bin/create.bat +++ b/bin/create.bat @@ -1 +1 @@ -cscript create.js \ No newline at end of file +cscript bin\create.js %* \ No newline at end of file diff --git a/bin/create.js b/bin/create.js index 24e70325..96e61eca 100644 --- a/bin/create.js +++ b/bin/create.js @@ -25,8 +25,9 @@ */ function read(filename) { + WScript.Echo('Reading in ' + filename); var fso=WScript.CreateObject("Scripting.FileSystemObject"); - var f=fso.OpenTextFile(filename, 1, true); + var f=fso.OpenTextFile(filename, 1); var s=f.ReadAll(); f.Close(); return s; @@ -40,8 +41,24 @@ function write(filename, contents) { function replaceInFile(filename, regexp, replacement) { write(filename, read(filename).replace(regexp, replacement)); } -function exec(s) { +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", @@ -61,6 +78,14 @@ 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); + // clobber any existing example /* @@ -84,24 +109,26 @@ 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\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y'); +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+'\\libs\\cordova-'+VERSION+'.jar /Y'); +exec('cmd /c copy framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\.cordova\\android\\cordova-'+VERSION+'.jar /Y'); -// copy in default activity -exec('cmd /c copy bin\\templates\\Activity.java '+ACTIVITY_PATH+' /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'); -// interpolate the activity name and package -replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY); -replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE); +// 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); -replaceInFile(MANIFEST_PATH, /__ACTIVITY__/, ACTIVITY); -replaceInFile(MANIFEST_PATH, /__PACKAGE__/, PACKAGE); - -/* -# leave the id for launching -touch $PROJECT_PATH/package-activity -echo $PACKAGE/$PACKAGE.$ACTIVITY > $PROJECT_PATH/package-activity -*/ +// run project-specific create process +fork('cscript.exe ' + PROJECT_PATH + '\\cordova\\create.js'); \ No newline at end of file diff --git a/bin/templates/project/cordova/create.bat b/bin/templates/project/cordova/create.bat new file mode 100644 index 00000000..cfde65a5 --- /dev/null +++ b/bin/templates/project/cordova/create.bat @@ -0,0 +1,2 @@ +echo "BALLS" +cscript cordova\create.js \ No newline at end of file diff --git a/bin/templates/project/cordova/create.js b/bin/templates/project/cordova/create.js new file mode 100644 index 00000000..b87f0a10 --- /dev/null +++ b/bin/templates/project/cordova/create.js @@ -0,0 +1,70 @@ +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) { + 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)); +} + +// 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('DONE!'); \ No newline at end of file diff --git a/bin/templates/project/cordova/debug.bat b/bin/templates/project/cordova/debug.bat new file mode 100644 index 00000000..e69de29b diff --git a/bin/templates/project/cordova/emulate.bat b/bin/templates/project/cordova/emulate.bat new file mode 100644 index 00000000..e69de29b diff --git a/bin/templates/project/cordova/log.bat b/bin/templates/project/cordova/log.bat new file mode 100644 index 00000000..e69de29b From 1f45503e2f313e9d13aefc73660c225c0edde3ff Mon Sep 17 00:00:00 2001 From: filmaj Date: Thu, 17 May 2012 10:59:38 -0700 Subject: [PATCH 07/17] [CB-659] create script for android on windows now works fully. also pulls down commons-codec jar appropriately --- bin/create.js | 44 +++++++++++++++++++++++-- bin/templates/project/cordova/create.js | 5 ++- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/bin/create.js b/bin/create.js index 96e61eca..a15db7a2 100644 --- a/bin/create.js +++ b/bin/create.js @@ -64,6 +64,9 @@ function fork(s) { 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'); @@ -86,7 +89,7 @@ WScript.Echo("Activity path: " + ACTIVITY_PATH); WScript.Echo("Manifest path: " + MANIFEST_PATH); WScript.Echo("Cordova version: " + VERSION); -// clobber any existing example +// TODO: clobber any existing example /* if [ $# -eq 0 ] @@ -101,13 +104,50 @@ exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --p // 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'); +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'); diff --git a/bin/templates/project/cordova/create.js b/bin/templates/project/cordova/create.js index b87f0a10..2bf56031 100644 --- a/bin/templates/project/cordova/create.js +++ b/bin/templates/project/cordova/create.js @@ -9,7 +9,6 @@ function exec(s, output) { WScript.Echo("Command exited with code " + o.Status); } function read(filename) { - WScript.Echo('Reading in ' + filename); var fso=WScript.CreateObject("Scripting.FileSystemObject"); var f=fso.OpenTextFile(filename, 1); var s=f.ReadAll(); @@ -44,7 +43,7 @@ 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'); +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'); @@ -67,4 +66,4 @@ replaceInFile(ACTIVITY_PATH, /__ID__/, PACKAGE); replaceInFile(MANIFEST_PATH, /__ACTIVITY__/, ACTIVITY); replaceInFile(MANIFEST_PATH, /__PACKAGE__/, PACKAGE); -WScript.Echo('DONE!'); \ No newline at end of file +WScript.Echo('Create completed successfully.'); \ No newline at end of file From 0850229c9ff9e81021141ae8edcd0ccd655ffe74 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Thu, 17 May 2012 11:14:23 -0700 Subject: [PATCH 08/17] [CB-804] ADded proper cordova icon sizes for the create script --- .../project/res/drawable-hdpi/icon.png | Bin 0 -> 6080 bytes .../project/res/drawable-ldpi/icon.png | Bin 0 -> 3096 bytes .../project/res/drawable-mdpi/icon.png | Bin 0 -> 4090 bytes .../project/res/drawable-xhdpi/icon.png | Bin 0 -> 7685 bytes .../templates/project/res/drawable/icon.png | Bin 5800 -> 7685 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/templates/project/cordova/templates/project/res/drawable-hdpi/icon.png create mode 100644 bin/templates/project/cordova/templates/project/res/drawable-ldpi/icon.png create mode 100644 bin/templates/project/cordova/templates/project/res/drawable-mdpi/icon.png create mode 100644 bin/templates/project/cordova/templates/project/res/drawable-xhdpi/icon.png mode change 100755 => 100644 bin/templates/project/cordova/templates/project/res/drawable/icon.png diff --git a/bin/templates/project/cordova/templates/project/res/drawable-hdpi/icon.png b/bin/templates/project/cordova/templates/project/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d27634485b3a20d8a0188107e84812f4f71084b GIT binary patch literal 6080 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 literal 0 HcmV?d00001 diff --git a/bin/templates/project/cordova/templates/project/res/drawable-ldpi/icon.png b/bin/templates/project/cordova/templates/project/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5032a4f2e0b734d4bdece13564c4b55de963a6 GIT binary patch literal 3096 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 literal 0 HcmV?d00001 diff --git a/bin/templates/project/cordova/templates/project/res/drawable-mdpi/icon.png b/bin/templates/project/cordova/templates/project/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e79c6062c1dcd9e98f092dbd7e51b5b76dd897d2 GIT binary patch literal 4090 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 literal 0 HcmV?d00001 diff --git a/bin/templates/project/cordova/templates/project/res/drawable-xhdpi/icon.png b/bin/templates/project/cordova/templates/project/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/bin/templates/project/cordova/templates/project/res/drawable/icon.png b/bin/templates/project/cordova/templates/project/res/drawable/icon.png old mode 100755 new mode 100644 index 697df7f37de3bc418dcee9409240eab4891e496d..ec7ffbfbdafc58df28e6e89041ee21acd0f6177e GIT binary patch literal 7685 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 literal 5800 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 Date: Mon, 14 May 2012 13:00:11 -0700 Subject: [PATCH 09/17] [CB-463] rewrite of accel plugin --- .../src/org/apache/cordova/AccelListener.java | 396 +++++++++--------- 1 file changed, 205 insertions(+), 191 deletions(-) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index f751e4e2..40ddec49 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -18,7 +18,11 @@ */ 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; @@ -32,6 +36,8 @@ 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; /** @@ -40,20 +46,20 @@ import android.content.Context; */ public class AccelListener extends Plugin implements SensorEventListener { - public static int STOPPED = 0; - public static int STARTING = 1; + public static int STOPPED = 0; + public static int STARTING = 1; public static int RUNNING = 2; public static int ERROR_FAILED_TO_START = 3; - public float TIMEOUT = 30000; // Timeout in msec to shut off listener - - float x,y,z; // most recent acceleration values - long timestamp; // time of most recent value - int status; // status of listener - long lastAccessTime; // time the value was last retrieved + private float x,y,z; // most recent acceleration values + private long timestamp; // time of most recent value + private int status; // status of listener - private SensorManager sensorManager;// Sensor manager - Sensor mSensor; // Acceleration sensor returned by sensor manager + private SensorManager sensorManager; // Sensor manager + private Sensor mSensor; // Acceleration sensor returned by sensor manager + + private HashMap watches = new HashMap(); + private List callbacks = new ArrayList(); /** * Create an accelerometer listener. @@ -66,169 +72,149 @@ public class AccelListener extends Plugin implements SensorEventListener { 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); + /** + * 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.OK; - String result = ""; - - try { - if (action.equals("getStatus")) { - int i = this.getStatus(); - return new PluginResult(status, i); - } - else if (action.equals("start")) { - int i = this.start(); - return new PluginResult(status, i); - } - else if (action.equals("stop")) { - this.stop(); - return new PluginResult(status, 0); - } - else if (action.equals("getAcceleration")) { - // If not running, then this is an async call, so don't worry about waiting - if (this.status != AccelListener.RUNNING) { - int r = this.start(); - if (r == AccelListener.ERROR_FAILED_TO_START) { - return new PluginResult(PluginResult.Status.IO_EXCEPTION, AccelListener.ERROR_FAILED_TO_START); - } - // 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) { - return new PluginResult(PluginResult.Status.IO_EXCEPTION, AccelListener.ERROR_FAILED_TO_START); - } - } - this.lastAccessTime = System.currentTimeMillis(); - JSONObject r = new JSONObject(); - r.put("x", this.x); - r.put("y", this.y); - r.put("z", this.z); - // TODO: Should timestamp be sent? - r.put("timestamp", this.timestamp); - return new PluginResult(status, r); - } - else if (action.equals("setTimeout")) { - try { - float timeout = Float.parseFloat(args.getString(0)); - this.setTimeout(timeout); - return new PluginResult(status, 0); - } catch (NumberFormatException e) { - status = PluginResult.Status.INVALID_ACTION; - e.printStackTrace(); - } catch (JSONException e) { - status = PluginResult.Status.JSON_EXCEPTION; - e.printStackTrace(); - } - } - else if (action.equals("getTimeout")) { - float f = this.getTimeout(); - return new PluginResult(status, f); - } else { - // Unsupported action - return new PluginResult(PluginResult.Status.INVALID_ACTION); - } - return new PluginResult(status, result); - } catch (JSONException e) { - return new PluginResult(PluginResult.Status.JSON_EXCEPTION); - } - } + /** + * 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); + try { + if (action.equals("getAcceleration")) { + 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.callbacks.add(callbackId); + this.start(); + } else { + return new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); + } + } + else if (action.equals("addWatch")) { + String watchId = args.getString(0); + this.watches.put(watchId, callbackId); + if (this.status != AccelListener.RUNNING) { + this.start(); + } + } + else if (action.equals("clearWatch")) { + String watchId = args.getString(0); + if (this.watches.containsKey(watchId)) { + this.watches.remove(watchId); + if (this.size() == 0) { + this.stop(); + } + } + return new PluginResult(PluginResult.Status.OK); + } else { + // Unsupported action + return new PluginResult(PluginResult.Status.INVALID_ACTION); + } + } catch (JSONException e) { + return new PluginResult(PluginResult.Status.JSON_EXCEPTION); + } + return result; + } - /** - * 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("getStatus")) { - return true; - } - else if (action.equals("getAcceleration")) { - // Can only return value if RUNNING - if (this.status == AccelListener.RUNNING) { - return true; - } - } - else if (action.equals("getTimeout")) { - return true; - } - return false; - } + /** + * 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("getAcceleration") && this.status == AccelListener.RUNNING) { + return true; + } else if (action.equals("addWatch") && this.status == AccelListener.RUNNING) { + return true; + } else if (action.equals("clearWatch")) { + return true; + } + return false; + } /** * Called by AccelBroker when listener is to be shut down. * Stop listener. */ public void onDestroy() { - this.stop(); + this.stop(); } //-------------------------------------------------------------------------- // LOCAL METHODS //-------------------------------------------------------------------------- + private int size() { + return this.watches.size() + this.callbacks.size(); + } /** * Start listening for acceleration sensor. * * @return status of listener */ - public int start() { + 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 list = this.sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); - // If already starting or running, then just return - if ((this.status == AccelListener.RUNNING) || (this.status == AccelListener.STARTING)) { - return this.status; - } - - // Get accelerometer from sensor manager - List 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_FASTEST); - this.setStatus(AccelListener.STARTING); - this.lastAccessTime = System.currentTimeMillis(); - } - - // If error, then set status to error - else { - this.setStatus(AccelListener.ERROR_FAILED_TO_START); - } - - return this.status; + // 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_FASTEST); + 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. */ - public void stop() { + private void stop() { if (this.status != AccelListener.STOPPED) { - this.sensorManager.unregisterListener(this); + this.sensorManager.unregisterListener(this); } this.setStatus(AccelListener.STOPPED); } @@ -248,64 +234,92 @@ public class AccelListener extends Plugin implements SensorEventListener { * @param SensorEvent event */ public void onSensorChanged(SensorEvent event) { - - // Only look at accelerometer events + // 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; + return; } + this.setStatus(AccelListener.RUNNING); + // 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.z = event.values[2]; - this.setStatus(AccelListener.RUNNING); - - // If values haven't been read for TIMEOUT time, then turn off accelerometer sensor to save power - if ((this.timestamp - this.lastAccessTime) > this.TIMEOUT) { - this.stop(); - } + this.win(); + + if (this.size() == 0) { + this.stop(); + } } - /** - * Get status of accelerometer sensor. - * - * @return status - */ - public int getStatus() { - return this.status; - } - - /** - * Set the timeout to turn off accelerometer sensor if getX() hasn't been called. - * - * @param timeout Timeout in msec. - */ - public void setTimeout(float timeout) { - this.TIMEOUT = timeout; - } - - /** - * Get the timeout to turn off accelerometer sensor if getX() hasn't been called. - * - * @return timeout in msec - */ - public float getTimeout() { - return this.TIMEOUT; - } - - /** - * Set the status and send it to JavaScript. - * @param status - */ - private void setStatus(int status) { - this.status = status; - } + 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) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + PluginResult err = new PluginResult(PluginResult.Status.ERROR, errorObj); + + for (String callbackId: this.callbacks) + { + this.error(err, callbackId); + } + this.callbacks.clear(); + + err.setKeepCallback(true); + + Iterator it = this.watches.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry)it.next(); + this.error(err, (String)pairs.getValue()); + } + } -} + private void win() { + // Success return object + PluginResult result = new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); + + for (String callbackId: this.callbacks) + { + this.success(result, callbackId); + } + this.callbacks.clear(); + + result.setKeepCallback(true); + + Iterator it = this.watches.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry)it.next(); + this.success(result, (String)pairs.getValue()); + } + } + + 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) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return r; + } +} \ No newline at end of file From 24adc6d00cea0c603077bb3919a678071a0d32c6 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Mon, 14 May 2012 13:04:07 -0700 Subject: [PATCH 10/17] [CB-463] added the JS updates for accel refactor --- framework/assets/js/cordova.android.js | 87 +++++++++++++------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/framework/assets/js/cordova.android.js b/framework/assets/js/cordova.android.js index 7bb06c2f..957be777 100644 --- a/framework/assets/js/cordova.android.js +++ b/framework/assets/js/cordova.android.js @@ -1,6 +1,6 @@ -// commit facaa38a0bd924aa15c14c372537c00382f1e593 +// commit 7b6ae77e5030060e8e99fe0b79ddcf9d698bf375 -// File generated at :: Thu May 10 2012 16:39:13 GMT-0700 (PDT) +// File generated at :: Mon May 14 2012 13:03:22 GMT-0700 (PDT) /* Licensed to the Apache Software Foundation (ASF) under one @@ -1144,13 +1144,14 @@ module.exports = { // file: lib/common/plugin/Acceleration.js define("cordova/plugin/Acceleration", function(require, exports, module) { var Acceleration = function(x, y, z, timestamp) { - this.x = x; - this.y = y; - this.z = z; - this.timestamp = timestamp || (new Date()).getTime(); + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); }; module.exports = Acceleration; + }); // file: lib/common/plugin/Camera.js @@ -3369,11 +3370,16 @@ define("cordova/plugin/accelerometer", function(require, exports, module) { * @constructor */ var utils = require("cordova/utils"), - exec = require("cordova/exec"); + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); -// Local singleton variables. + +// Keeps reference to watchAcceleration calls. var timers = {}; +// Last returned acceleration object from native +var accel = null; + var accelerometer = { /** * Asynchronously aquires the current acceleration. @@ -3383,21 +3389,18 @@ var accelerometer = { * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) */ getCurrentAcceleration: function(successCallback, errorCallback, options) { - // successCallback required if (typeof successCallback !== "function") { - console.log("Accelerometer Error: successCallback is not a function"); - return; + throw "getCurrentAcceleration must be called with at least a success callback function as first parameter."; } - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Accelerometer Error: errorCallback is not a function"); - return; - } + var win = function(a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + successCallback(accel); + }; // Get acceleration - exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); + exec(win, errorCallback, "Accelerometer", "getAcceleration", []); }, /** @@ -3409,36 +3412,34 @@ var accelerometer = { * @return String The watch id that must be passed to #clearWatch to stop watching. */ watchAcceleration: function(successCallback, errorCallback, options) { - // Default interval (10 sec) - var frequency = (options !== undefined && options.frequency !== undefined)? options.frequency : 10000; + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; // successCallback required if (typeof successCallback !== "function") { - console.log("Accelerometer Error: successCallback is not a function"); - return; + throw "watchAcceleration must be called with at least a success callback function as first parameter."; } - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Accelerometer Error: errorCallback is not a function"); - return; - } - - // Make sure accelerometer timeout > frequency + 10 sec - exec( - function(timeout) { - if (timeout < (frequency + 10000)) { - exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); - } - }, - function(e) { }, "Accelerometer", "getTimeout", []); - - // Start watch timer + // Keep reference to watch id, and report accel readings as often as defined in frequency var id = utils.createUUID(); timers[id] = window.setInterval(function() { - exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); - }, (frequency ? frequency : 1)); + if (accel) { + successCallback(accel); + } + }, frequency); + + // Success callback from native just updates the accel object. + var win = function(a) { + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + }; + + // Fail callback clears the watch and sends an error back. + var fail = function(err) { + accelerometer.clearWatch(id); + errorCallback(err); + }; + + exec(win, fail, "Accelerometer", "addWatch", [id, frequency]); return id; }, @@ -3449,16 +3450,17 @@ var accelerometer = { * @param {String} id The id of the watch returned from #watchAcceleration. */ clearWatch: function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id] !== undefined) { + if (id && timers[id]) { window.clearInterval(timers[id]); delete timers[id]; + exec(null, null, "Accelerometer", "clearWatch", [id]); } } }; module.exports = accelerometer; + }); // file: lib/android/plugin/android/app.js @@ -5172,7 +5174,7 @@ window.cordova = require('cordova'); // Fire onDeviceReady event once all constructors have run and // cordova info has been received from native side. channel.join(function() { - channel.onDeviceReady.fire(); + require('cordova').fireDocumentEvent('deviceready'); }, channel.deviceReadyChannelsArray); }, [ channel.onDOMContentLoaded, channel.onNativeReady ]); @@ -5191,4 +5193,5 @@ window.cordova = require('cordova'); }(window)); + })(); \ No newline at end of file From cb98bbce1f9a99fa5e8af44886979f8614cb390f Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Mon, 14 May 2012 15:21:41 -0700 Subject: [PATCH 11/17] [CB-463] added accuracy checking to native accel implementation, this way getCurrentAcceleration returns fairly accurate results --- .../src/org/apache/cordova/AccelListener.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index 40ddec49..7596045c 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -54,6 +54,7 @@ public class AccelListener extends Plugin implements SensorEventListener { 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 @@ -184,7 +185,7 @@ public class AccelListener extends Plugin implements SensorEventListener { // 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_FASTEST); + this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_UI); this.setStatus(AccelListener.STARTING); } else { this.setStatus(AccelListener.ERROR_FAILED_TO_START); @@ -217,6 +218,7 @@ public class AccelListener extends Plugin implements SensorEventListener { this.sensorManager.unregisterListener(this); } this.setStatus(AccelListener.STOPPED); + this.accuracy = SensorManager.SENSOR_STATUS_UNRELIABLE; } /** @@ -226,6 +228,17 @@ public class AccelListener extends Plugin implements SensorEventListener { * @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; + } + Log.d("ACCEL", "accuracy is now " + accuracy); + this.accuracy = accuracy; } /** @@ -246,16 +259,19 @@ public class AccelListener extends Plugin implements SensorEventListener { this.setStatus(AccelListener.RUNNING); - // 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]; + if (this.accuracy >= SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM) { - this.win(); - - if (this.size() == 0) { - this.stop(); + // 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(); + + if (this.size() == 0) { + this.stop(); + } } } From df89d33fab102caed576ac01bf20c9b96ee30580 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Mon, 14 May 2012 16:04:36 -0700 Subject: [PATCH 12/17] removed a trailing log --- framework/src/org/apache/cordova/AccelListener.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index 7596045c..bc8bf170 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -237,7 +237,6 @@ public class AccelListener extends Plugin implements SensorEventListener { if (this.status == AccelListener.STOPPED) { return; } - Log.d("ACCEL", "accuracy is now " + accuracy); this.accuracy = accuracy; } @@ -338,4 +337,4 @@ public class AccelListener extends Plugin implements SensorEventListener { } return r; } -} \ No newline at end of file +} From 531efe1e30f86d33a6a4980b03c68835f803c400 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Mon, 14 May 2012 15:21:41 -0700 Subject: [PATCH 13/17] [CB-463] added accuracy checking to native accel implementation, this way getCurrentAcceleration returns fairly accurate results --- framework/src/org/apache/cordova/AccelListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index bc8bf170..6ccbecac 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -237,6 +237,7 @@ public class AccelListener extends Plugin implements SensorEventListener { if (this.status == AccelListener.STOPPED) { return; } + Log.d("ACCEL", "accuracy is now " + accuracy); this.accuracy = accuracy; } From 15ddef26f4e2966f951106d0c8881f1693f2ad5e Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Mon, 14 May 2012 16:04:36 -0700 Subject: [PATCH 14/17] removed a trailing log --- framework/src/org/apache/cordova/AccelListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index 6ccbecac..bc8bf170 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -237,7 +237,6 @@ public class AccelListener extends Plugin implements SensorEventListener { if (this.status == AccelListener.STOPPED) { return; } - Log.d("ACCEL", "accuracy is now " + accuracy); this.accuracy = accuracy; } From 2d5dcf24da18c210e08ccfcd473e1881a60bc429 Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Fri, 18 May 2012 13:50:45 -0700 Subject: [PATCH 15/17] [CB-463] updated js and rewrote accel plugin again to support the start/stop approach. optimized. single callback used for message passing --- framework/assets/js/cordova.android.js | 103 ++++++++--- .../src/org/apache/cordova/AccelListener.java | 167 ++++++------------ 2 files changed, 131 insertions(+), 139 deletions(-) diff --git a/framework/assets/js/cordova.android.js b/framework/assets/js/cordova.android.js index 957be777..cdf619df 100644 --- a/framework/assets/js/cordova.android.js +++ b/framework/assets/js/cordova.android.js @@ -1,6 +1,6 @@ -// commit 7b6ae77e5030060e8e99fe0b79ddcf9d698bf375 +// commit 4a4ba9985c920850fe3f229abc60de984e196ab5 -// File generated at :: Mon May 14 2012 13:03:22 GMT-0700 (PDT) +// File generated at :: Fri May 18 2012 13:43:11 GMT-0700 (PDT) /* Licensed to the Apache Software Foundation (ASF) under one @@ -3373,13 +3373,57 @@ var utils = require("cordova/utils"), exec = require("cordova/exec"), Acceleration = require('cordova/plugin/Acceleration'); +// Is the accel sensor running? +var running = false; // Keeps reference to watchAcceleration calls. var timers = {}; +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + // Last returned acceleration object from native var accel = null; +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + var accelerometer = { /** * Asynchronously aquires the current acceleration. @@ -3394,13 +3438,22 @@ var accelerometer = { throw "getCurrentAcceleration must be called with at least a success callback function as first parameter."; } + var p; var win = function(a) { - accel = new Acceleration(a.x, a.y, a.z, a.timestamp); - successCallback(accel); + successCallback(a); + removeListeners(p); + }; + var fail = function(e) { + errorCallback(e); + removeListeners(p); }; - // Get acceleration - exec(win, errorCallback, "Accelerometer", "getAcceleration", []); + p = createCallbackPair(win, fail); + listeners.push(p); + + if (!running) { + start(); + } }, /** @@ -3422,24 +3475,28 @@ var accelerometer = { // Keep reference to watch id, and report accel readings as often as defined in frequency var id = utils.createUUID(); - timers[id] = window.setInterval(function() { - if (accel) { - successCallback(accel); - } - }, frequency); - // Success callback from native just updates the accel object. - var win = function(a) { - accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + var p = createCallbackPair(function(){}, function(e) { + errorCallback(e); + removeListeners(p); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); + } + }, frequency), + listeners:p }; - // Fail callback clears the watch and sends an error back. - var fail = function(err) { - accelerometer.clearWatch(id); - errorCallback(err); - }; - - exec(win, fail, "Accelerometer", "addWatch", [id, frequency]); + if (running) { + // If we're already running then immediately invoke the success callback + successCallback(accel); + } else { + start(); + } return id; }, @@ -3452,9 +3509,9 @@ var accelerometer = { clearWatch: function(id) { // Stop javascript timer & remove from timer list if (id && timers[id]) { - window.clearInterval(timers[id]); + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); delete timers[id]; - exec(null, null, "Accelerometer", "clearWatch", [id]); } } }; diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index bc8bf170..551e8bcb 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -58,9 +58,8 @@ public class AccelListener extends Plugin implements SensorEventListener { private SensorManager sensorManager; // Sensor manager private Sensor mSensor; // Acceleration sensor returned by sensor manager - - private HashMap watches = new HashMap(); - private List callbacks = new ArrayList(); + + private String callbackId; // Keeps track of the single "start" callback ID passed in from JS /** * Create an accelerometer listener. @@ -93,62 +92,28 @@ public class AccelListener extends Plugin implements SensorEventListener { * @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); - try { - if (action.equals("getAcceleration")) { - 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.callbacks.add(callbackId); - this.start(); - } else { - return new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); - } - } - else if (action.equals("addWatch")) { - String watchId = args.getString(0); - this.watches.put(watchId, callbackId); - if (this.status != AccelListener.RUNNING) { - this.start(); - } - } - else if (action.equals("clearWatch")) { - String watchId = args.getString(0); - if (this.watches.containsKey(watchId)) { - this.watches.remove(watchId); - if (this.size() == 0) { - this.stop(); - } - } - return new PluginResult(PluginResult.Status.OK); - } else { - // Unsupported action - return new PluginResult(PluginResult.Status.INVALID_ACTION); - } - } catch (JSONException e) { - return new PluginResult(PluginResult.Status.JSON_EXCEPTION); - } - return result; - } + PluginResult.Status status = PluginResult.Status.NO_RESULT; + String message = ""; + PluginResult result = new PluginResult(status, message); + result.setKeepCallback(true); - /** - * 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("getAcceleration") && this.status == AccelListener.RUNNING) { - return true; - } else if (action.equals("addWatch") && this.status == AccelListener.RUNNING) { - return true; - } else if (action.equals("clearWatch")) { - return 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(); + } } - return false; + else if (action.equals("stop")) { + if (this.status == AccelListener.RUNNING) { + this.stop(); + } + } else { + // Unsupported action + return new PluginResult(PluginResult.Status.INVALID_ACTION); + } + return result; } /** @@ -162,10 +127,7 @@ public class AccelListener extends Plugin implements SensorEventListener { //-------------------------------------------------------------------------- // LOCAL METHODS //-------------------------------------------------------------------------- - - private int size() { - return this.watches.size() + this.callbacks.size(); - } + // /** * Start listening for acceleration sensor. * @@ -267,74 +229,47 @@ public class AccelListener extends Plugin implements SensorEventListener { this.z = event.values[2]; this.win(); - - if (this.size() == 0) { - this.stop(); - } } } + // 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) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - PluginResult err = new PluginResult(PluginResult.Status.ERROR, errorObj); - - for (String callbackId: this.callbacks) - { - this.error(err, callbackId); + // Error object + JSONObject errorObj = new JSONObject(); + try { + errorObj.put("code", code); + errorObj.put("message", message); + } catch (JSONException e) { + e.printStackTrace(); } - this.callbacks.clear(); - + PluginResult err = new PluginResult(PluginResult.Status.ERROR, errorObj); err.setKeepCallback(true); - - Iterator it = this.watches.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pairs = (Map.Entry)it.next(); - this.error(err, (String)pairs.getValue()); - } + + this.error(err, this.callbackId); } private void win() { - // Success return object - PluginResult result = new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); - - for (String callbackId: this.callbacks) - { - this.success(result, callbackId); - } - this.callbacks.clear(); - + // Success return object + PluginResult result = new PluginResult(PluginResult.Status.OK, this.getAccelerationJSON()); result.setKeepCallback(true); - - Iterator it = this.watches.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pairs = (Map.Entry)it.next(); - this.success(result, (String)pairs.getValue()); - } + + this.success(result, this.callbackId); } - private void setStatus(int status) { + 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) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return r; - } + 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; + } } From 6b24f2d547695db060a860abe0cd1780abdbef5b Mon Sep 17 00:00:00 2001 From: Fil Maj Date: Fri, 18 May 2012 15:23:57 -0700 Subject: [PATCH 16/17] Small spacing fixes --- .../src/org/apache/cordova/AccelListener.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/framework/src/org/apache/cordova/AccelListener.java b/framework/src/org/apache/cordova/AccelListener.java index 551e8bcb..9e19d753 100755 --- a/framework/src/org/apache/cordova/AccelListener.java +++ b/framework/src/org/apache/cordova/AccelListener.java @@ -136,7 +136,7 @@ public class AccelListener extends Plugin implements SensorEventListener { private int start() { // If already starting or running, then just return if ((this.status == AccelListener.RUNNING) || (this.status == AccelListener.STARTING)) { - return this.status; + return this.status; } this.setStatus(AccelListener.STARTING); @@ -146,28 +146,28 @@ public class AccelListener extends Plugin implements SensorEventListener { // 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); + 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; + 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(); - } + 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."); + this.setStatus(AccelListener.ERROR_FAILED_TO_START); + this.fail(AccelListener.ERROR_FAILED_TO_START, "Accelerometer could not be started."); } return this.status; } @@ -222,13 +222,13 @@ public class AccelListener extends Plugin implements SensorEventListener { 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]; + // 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(); + this.win(); } } From fae0c3dcfd5a73e5a4cbd47f218e52e03ad73eed Mon Sep 17 00:00:00 2001 From: macdonst Date: Tue, 22 May 2012 14:48:02 -0400 Subject: [PATCH 17/17] Fix problem in Android template example getPicture --- .../project/cordova/templates/project/assets/www/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/templates/project/cordova/templates/project/assets/www/main.js b/bin/templates/project/cordova/templates/project/assets/www/main.js index 739a02e3..3a8b04a1 100644 --- a/bin/templates/project/cordova/templates/project/assets/www/main.js +++ b/bin/templates/project/cordova/templates/project/assets/www/main.js @@ -88,7 +88,7 @@ function dump_pic(data) { viewport.style.position = "absolute"; viewport.style.top = "10px"; viewport.style.left = "10px"; - document.getElementById("test_img").src = "data:image/jpeg;base64," + data; + document.getElementById("test_img").src = data; } function fail(msg) {