diff --git a/bin/create.js b/bin/create.js index 9f704430..35d4fd79 100644 --- a/bin/create.js +++ b/bin/create.js @@ -33,6 +33,10 @@ function read(filename) { f.Close(); return s; } +function setTarget() { + var targets = shell.Exec('android.bat list targets').StdOut.ReadAll().match(/id:\s\d+/g); + return targets[targets.length - 1].replace(/id: /, ""); // TODO: give users the option to set their target +} function write(filename, contents) { var fso=WScript.CreateObject("Scripting.FileSystemObject"); var f=fso.OpenTextFile(filename, 2, true); @@ -42,12 +46,11 @@ function write(filename, contents) { function replaceInFile(filename, regexp, replacement) { write(filename, read(filename).replace(regexp, replacement)); } -function exec(s, output) { - var o=shell.Exec(s); - while (o.Status == 0) { - WScript.Sleep(100); +function exec(command) { + var oShell=shell.Exec(command); + while (oShell.Status == 0) { + WScript.sleep(100); } - //WScript.Echo("Command exited with code " + o.Status); } function cleanup() { @@ -125,9 +128,8 @@ if(fso.FolderExists(PROJECT_PATH)) { 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 TARGET=setTarget(); var VERSION=read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,''); - // create the project exec('android.bat create project --target '+TARGET+' --path '+PROJECT_PATH+' --package '+PACKAGE+' --activity '+ACTIVITY); @@ -140,18 +142,32 @@ downloadCommonsCodec(); exec('ant.bat -f '+ ROOT +'\\framework\\build.xml jar'); // copy in the project template -exec('cmd /c xcopy '+ ROOT + '\\bin\\templates\\project\\* '+PROJECT_PATH+' /S /Y'); +exec('%comspec% /c xcopy '+ ROOT + '\\bin\\templates\\project\\res '+PROJECT_PATH+'\\res\\ /E /Y'); +exec('%comspec% /c xcopy '+ ROOT + '\\bin\\templates\\project\\assets '+PROJECT_PATH+'\\assets\\ /E /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\project\\AndroidManifest.xml ' + PROJECT_PATH + '\\AndroidManifest.xml /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\project\\Activity.java '+ ACTIVITY_PATH +' /Y'); // copy in cordova.js -exec('cmd /c copy '+ROOT+'\\framework\\assets\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y'); +exec('%comspec% /c copy '+ROOT+'\\framework\\assets\\www\\cordova-'+VERSION+'.js '+PROJECT_PATH+'\\assets\\www\\cordova-'+VERSION+'.js /Y'); // copy in cordova.jar -exec('cmd /c copy '+ROOT+'\\framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar /Y'); +exec('%comspec% /c copy '+ROOT+'\\framework\\cordova-'+VERSION+'.jar '+PROJECT_PATH+'\\libs\\cordova-'+VERSION+'.jar /Y'); // copy in xml fso.CreateFolder(PROJECT_PATH + '\\res\\xml'); -exec('cmd /c copy '+ROOT+'\\framework\\res\\xml\\cordova.xml ' + PROJECT_PATH + '\\res\\xml\\cordova.xml /Y'); -exec('cmd /c copy '+ROOT+'\\framework\\res\\xml\\plugins.xml ' + PROJECT_PATH + '\\res\\xml\\plugins.xml /Y'); +exec('%comspec% /c copy '+ROOT+'\\framework\\res\\xml\\cordova.xml ' + PROJECT_PATH + '\\res\\xml\\cordova.xml /Y'); +exec('%comspec% /c copy '+ROOT+'\\framework\\res\\xml\\plugins.xml ' + PROJECT_PATH + '\\res\\xml\\plugins.xml /Y'); + +// copy cordova scripts +fso.CreateFolder(PROJECT_PATH + '\\cordova'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\appinfo.jar ' + PROJECT_PATH + '\\cordova\\appinfo.jar /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\cordova.js ' + PROJECT_PATH + '\\cordova\\cordova.js /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\cordova.bat ' + PROJECT_PATH + '\\cordova\\cordova.bat /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\clean.bat ' + PROJECT_PATH + '\\cordova\\clean.bat /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\debug.bat ' + PROJECT_PATH + '\\cordova\\debug.bat /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\log.bat ' + PROJECT_PATH + '\\cordova\\log.bat /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\emulate.bat ' + PROJECT_PATH + '\\cordova\\emulate.bat /Y'); +exec('%comspec% /c copy '+ROOT+'\\bin\\templates\\cordova\\BOOM.bat ' + PROJECT_PATH + '\\cordova\\BOOM.bat /Y'); // interpolate the activity name and package replaceInFile(ACTIVITY_PATH, /__ACTIVITY__/, ACTIVITY); diff --git a/bin/templates/cordova/ApplicationInfo/ApplicationInfo.class b/bin/templates/cordova/ApplicationInfo/ApplicationInfo.class index 6b854f7d..5ad90f5c 100644 Binary files a/bin/templates/cordova/ApplicationInfo/ApplicationInfo.class and b/bin/templates/cordova/ApplicationInfo/ApplicationInfo.class differ diff --git a/bin/templates/cordova/ApplicationInfo/ApplicationInfo.java b/bin/templates/cordova/ApplicationInfo/ApplicationInfo.java index 9a663217..21a0787e 100644 --- a/bin/templates/cordova/ApplicationInfo/ApplicationInfo.java +++ b/bin/templates/cordova/ApplicationInfo/ApplicationInfo.java @@ -21,7 +21,7 @@ public class ApplicationInfo { // getting activity name String activity = ((Element)dom.getElementsByTagName("activity").item(0)).getAttribute("android:name"); - System.out.println(String.format("%s/%s.%s", pakkage, pakkage, activity)); + System.out.println(String.format("%s/.%s", pakkage, activity.replace(".", ""))); } catch(ParserConfigurationException pce) { pce.printStackTrace(); } catch(SAXException se) { diff --git a/bin/templates/cordova/ApplicationInfo/manifest.txt b/bin/templates/cordova/ApplicationInfo/manifest.txt deleted file mode 100644 index 7d77999c..00000000 --- a/bin/templates/cordova/ApplicationInfo/manifest.txt +++ /dev/null @@ -1 +0,0 @@ -Main-Class: ApplicationInfo diff --git a/bin/templates/cordova/BOOM.bat b/bin/templates/cordova/BOOM.bat new file mode 100644 index 00000000..87b10426 --- /dev/null +++ b/bin/templates/cordova/BOOM.bat @@ -0,0 +1 @@ +%~dp0\cordova.bat BOOM diff --git a/bin/templates/cordova/appinfo.jar b/bin/templates/cordova/appinfo.jar index 4116f48c..37e00dfc 100644 Binary files a/bin/templates/cordova/appinfo.jar and b/bin/templates/cordova/appinfo.jar differ diff --git a/bin/templates/cordova/clean.bat b/bin/templates/cordova/clean.bat new file mode 100644 index 00000000..8194b33a --- /dev/null +++ b/bin/templates/cordova/clean.bat @@ -0,0 +1 @@ +%~dp0\cordova.bat clean diff --git a/bin/templates/cordova/cordova.bat b/bin/templates/cordova/cordova.bat new file mode 100644 index 00000000..61641316 --- /dev/null +++ b/bin/templates/cordova/cordova.bat @@ -0,0 +1,15 @@ +@ECHO OFF +IF NOT DEFINED JAVA_HOME GOTO MISSING +FOR %%X in (java.exe ant.bat android.bat) do ( + SET FOUND=%%~$PATH:X + IF NOT DEFINED FOUND GOTO MISSING +) +cscript %~dp0\cordova.js %* +GOTO END +:MISSING +ECHO Missing one of the following: +ECHO JDK: http://java.oracle.com +ECHO Android SDK: http://developer.android.com +ECHO Apache ant: http://ant.apache.org +EXIT /B 1 +:END diff --git a/bin/templates/cordova/cordova.js b/bin/templates/cordova/cordova.js new file mode 100644 index 00000000..6353b55d --- /dev/null +++ b/bin/templates/cordova/cordova.js @@ -0,0 +1,108 @@ +var ROOT = WScript.ScriptFullName.split('\\cordova\\cordova.js').join(''), + shell=WScript.CreateObject("WScript.Shell"); + +function exec(command) { + var oExec=shell.Exec(command); + var output = new String(); + while(oExec.Status == 0) { + if(!oExec.StdOut.AtEndOfStream) { + var line = oExec.StdOut.ReadLine(); + // XXX: Change to verbose mode + //WScript.StdOut.WriteLine(line); + output += line; + } + WScript.sleep(100); + } + + return output; +} + +function emulator_running() { + var local_devices = shell.Exec("%comspec% /c adb devices").StdOut.ReadAll(); + if(local_devices.match(/emulator/)) { + return true; + } + return false; +} +function emulate() { + // don't run emulator if a device is plugged in or if emulator is already running + if(emulator_running()) { + WScript.Echo("Device or Emulator already running!"); + return; + } + var oExec = shell.Exec("%comspec% /c android.bat list avd"); + var avd_list = []; + var avd_id = -10; + while(!oExec.StdOut.AtEndOfStream) { + var output = oExec.StdOut.ReadLine(); + if(output.match(/Name: (.)*/)) { + avd_list.push(output.replace(/ *Name:\s/, "")); + } + } + // user has no AVDs + if(avd_list.length == 0) { + WScript.Echo("You don't have any Android Virtual Devices. Please create at least one AVD."); + WScript.Echo("android"); + WScript.Quit(1); + } + // user has only one AVD so we launch that one + if(avd_list.length == 1) { + + shell.Run("emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\cache -avd "+avd_list[0]); + } + + // user has more than one avd so we ask them to choose + if(avd_list.length > 1) { + while(!avd_list[avd_id]) { + WScript.Echo("Choose from one of the following Android Virtual Devices [0 to "+(avd_list.length - 1)+"]:") + for(i = 0, j = avd_list.length ; i < j ; i++) { + WScript.Echo((i)+") "+avd_list[i]); + } + WScript.StdOut.Write("> "); + avd_id = new Number(WScript.StdIn.ReadLine()); + } + + shell.Run("emulator -cpu-delay 0 -no-boot-anim -cache %Temp%\\cache -avd "+avd_list[avd_id], 0, false); + } +} + +function clean() { + exec("%comspec% /c ant.bat clean -f "+ROOT+"\\build.xml 2>&1"); +} + +function debug() { + exec("%comspec% /c ant.bat debug -f "+ROOT+"\\build.xml 2>&1"); +} + +function debug_install() { + exec("%comspec% /c ant.bat debug install -f "+ROOT+"\\build.xml 2>&1"); +} + +function log() { + WScript.Echo(exec("%comspec% /c adb.bat logcat")); +} + +function launch() { + var launch_str=exec("%comspec% /c java -jar "+ROOT+"\\cordova\\appinfo.jar "+ROOT+"\\AndroidManifest.xml"); + //WScript.Echo(launch_str); + exec("%comspec% /c adb shell am start -n "+launch_str+" 2>&1"); +} + +function BOOM() { + clean(); + if(emulator_running()) { + debug_install(); + launch(); + } else { + debug(); + WScript.Echo("##################################################################"); + WScript.Echo("# Plug in your device or launch an emulator with cordova/emulate #"); + WScript.Echo("##################################################################"); + } +} +var args = WScript.Arguments; +if(args.count() != 1) { + WScript.StdErr.Write("An error has occured!\n"); + WScript.Quit(1); +} +eval(args(0)+"()"); diff --git a/bin/templates/cordova/debug.bat b/bin/templates/cordova/debug.bat new file mode 100644 index 00000000..ff5edc2c --- /dev/null +++ b/bin/templates/cordova/debug.bat @@ -0,0 +1 @@ +%~dp0\cordova.bat debug diff --git a/bin/templates/cordova/emulate.bat b/bin/templates/cordova/emulate.bat new file mode 100644 index 00000000..87ef969f --- /dev/null +++ b/bin/templates/cordova/emulate.bat @@ -0,0 +1 @@ +%~dp0\cordova.bat emulate diff --git a/bin/templates/cordova/log.bat b/bin/templates/cordova/log.bat new file mode 100644 index 00000000..e69de29b diff --git a/bin/tests/test_create_win.js b/bin/tests/test_create_win.js index 76dd6aab..e8202dec 100644 --- a/bin/tests/test_create_win.js +++ b/bin/tests/test_create_win.js @@ -91,8 +91,43 @@ create_project.on('exit', function(code) { assert(exists, 'cordova.js did not get added'); }); - // check that project compiles && creates a cordovaExample-debug.apk - // XXX: !@##!@# WINDOWS + // make sure cordova master script was added + path.exists(util.format('%s/cordova/cordova.bat', project_path), function(exists) { + assert(exists, 'cordova script did not get added'); + }); + + // make sure debug script was added + path.exists(util.format('%s/cordova/debug.bat', project_path), function(exists) { + assert(exists, 'debug script did not get added'); + }); + + // make sure BOOM script was added + path.exists(util.format('%s/cordova/BOOM.bat', project_path), function(exists) { + assert(exists, 'BOOM script did not get added'); + }); + + // make sure log script was added + path.exists(util.format('%s/cordova/log.bat', project_path), function(exists) { + assert(exists, 'log script did not get added'); + }); + + // make sure clean script was added + path.exists(util.format('%s/cordova/clean.bat', project_path), function(exists) { + assert(exists, 'clean script did not get added'); + }); + + // make sure emulate script was added + path.exists(util.format('%s/cordova/emulate.bat', project_path), function(exists) { + assert(exists, 'emulate script did not get added'); + }); + + // make sure appinfo.jar script was added + path.exists(util.format('%s/cordova/appinfo.jar', project_path), function(exists) { + assert(exists, 'appinfo.jar script did not get added'); + }); + + // check that project compiles && creates a cordovaExample-debug.apk + // XXX: !@##!@# WINDOWS exec('ant debug -f ' + project_path + "\\build.xml", function(error, stdout, stderr) { assert(error == null, "Cordova Android Project does not compile"); path.exists(util.format('%s/bin/%s-debug.apk', project_path, project_name), diff --git a/framework/src/org/apache/cordova/App.java b/framework/src/org/apache/cordova/App.java index a9faebb5..14816240 100755 --- a/framework/src/org/apache/cordova/App.java +++ b/framework/src/org/apache/cordova/App.java @@ -73,10 +73,6 @@ public class App extends Plugin { 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(); } @@ -202,6 +198,7 @@ public class App extends Plugin { LOG.i("DroidGap", "WARNING: Volume Button Default Behaviour will be overridden. The volume event will be fired!"); webView.bindButton(button, override); } + /** * Return whether the Android back button is overridden by the user. * diff --git a/framework/src/org/apache/cordova/DroidGap.java b/framework/src/org/apache/cordova/DroidGap.java index 8b26f375..723be5c0 100755 --- a/framework/src/org/apache/cordova/DroidGap.java +++ b/framework/src/org/apache/cordova/DroidGap.java @@ -138,7 +138,6 @@ public class DroidGap extends Activity implements CordovaInterface { protected CordovaWebViewClient webViewClient; protected LinearLayout root; - public boolean bound = false; protected boolean cancelLoadUrl = false; protected ProgressDialog spinnerDialog = null; @@ -181,10 +180,6 @@ public class DroidGap extends Activity implements CordovaInterface { // when another application (activity) is started. protected boolean keepRunning = true; - private boolean volumeupBound; - - private boolean volumedownBound; - /** * Sets the authentication token. * @@ -948,24 +943,6 @@ public class DroidGap extends Activity implements CordovaInterface { return this.getContext(); } - /** - * Override the backbutton. - * - * @param override - */ - public void bindBackButton(boolean override) { - this.bound = override; - } - - /** - * Determine of backbutton is overridden. - * - * @return - */ - public boolean isBackButtonBound() { - return this.bound; - } - /** * Load the specified URL in the Cordova webview or a new browser instance. * @@ -982,16 +959,6 @@ public class DroidGap extends Activity implements CordovaInterface { } } - public void bindButton(String button, boolean override) { - // TODO Auto-generated method stub - if (button.compareTo("volumeup")==0) { - this.volumeupBound = override; - } - else if (button.compareTo("volumedown")==0) { - this.volumedownBound = override; - } - } - protected Dialog splashDialog; /**