diff options
Diffstat (limited to 'StoneIsland/platforms/android/cordova/lib/run.js')
| -rwxr-xr-x | StoneIsland/platforms/android/cordova/lib/run.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/StoneIsland/platforms/android/cordova/lib/run.js b/StoneIsland/platforms/android/cordova/lib/run.js new file mode 100755 index 00000000..7f15448c --- /dev/null +++ b/StoneIsland/platforms/android/cordova/lib/run.js @@ -0,0 +1,160 @@ +#!/usr/bin/env node + +/* + 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. +*/ + +/* jshint loopfunc:true */ + +var path = require('path'), + build = require('./build'), + emulator = require('./emulator'), + device = require('./device'), + shell = require('shelljs'), + Q = require('q'); + +/* + * Runs the application on a device if available. + * If no device is found, it will use a started emulator. + * If no started emulators are found it will attempt to start an avd. + * If no avds are found it will error out. + * Returns a promise. + */ + module.exports.run = function(args) { + var buildFlags = []; + var install_target; + var list = false; + + for (var i=2; i<args.length; i++) { + if (build.isBuildFlag(args[i])) { + buildFlags.push(args[i]); + } else if (args[i] == '--device') { + install_target = '--device'; + } else if (args[i] == '--emulator') { + install_target = '--emulator'; + } else if (/^--target=/.exec(args[i])) { + install_target = args[i].substring(9, args[i].length); + } else if (args[i] == '--list') { + list = true; + } else { + console.warn('Option \'' + args[i] + '\' not recognized (ignoring).'); + } + } + + if (list) { + var output = ''; + var temp = ''; + if (!install_target) { + output += 'Available Android Devices:\n'; + temp = shell.exec(path.join(__dirname, 'list-devices'), {silent:true}).output; + temp = temp.replace(/^(?=[^\s])/gm, '\t'); + output += temp; + output += 'Available Android Virtual Devices:\n'; + temp = shell.exec(path.join(__dirname, 'list-emulator-images'), {silent:true}).output; + temp = temp.replace(/^(?=[^\s])/gm, '\t'); + output += temp; + } else if (install_target == '--emulator') { + output += 'Available Android Virtual Devices:\n'; + temp = shell.exec(path.join(__dirname, 'list-emulator-images'), {silent:true}).output; + temp = temp.replace(/^(?=[^\s])/gm, '\t'); + output += temp; + } else if (install_target == '--device') { + output += 'Available Android Devices:\n'; + temp = shell.exec(path.join(__dirname, 'list-devices'), {silent:true}).output; + temp = temp.replace(/^(?=[^\s])/gm, '\t'); + output += temp; + } + console.log(output); + return; + } + + return Q() + .then(function() { + if (!install_target) { + // no target given, deploy to device if available, otherwise use the emulator. + return device.list() + .then(function(device_list) { + if (device_list.length > 0) { + console.log('WARNING : No target specified, deploying to device \'' + device_list[0] + '\'.'); + install_target = device_list[0]; + } else { + console.log('WARNING : No target specified, deploying to emulator'); + install_target = '--emulator'; + } + }); + } + }).then(function() { + if (install_target == '--device') { + return device.resolveTarget(null); + } else if (install_target == '--emulator') { + // Give preference to any already started emulators. Else, start one. + return emulator.list_started() + .then(function(started) { + return started && started.length > 0 ? started[0] : emulator.start(); + }).then(function(emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + // They specified a specific device/emulator ID. + return device.list() + .then(function(devices) { + if (devices.indexOf(install_target) > -1) { + return device.resolveTarget(install_target); + } + return emulator.list_started() + .then(function(started_emulators) { + if (started_emulators.indexOf(install_target) > -1) { + return emulator.resolveTarget(install_target); + } + return emulator.list_images() + .then(function(avds) { + // if target emulator isn't started, then start it. + for (var avd in avds) { + if (avds[avd].name == install_target) { + return emulator.start(install_target) + .then(function(emulatorId) { + return emulator.resolveTarget(emulatorId); + }); + } + } + return Q.reject('Target \'' + install_target + '\' not found, unable to run project'); + }); + }); + }); + }).then(function(resolvedTarget) { + return build.run(buildFlags, resolvedTarget).then(function(buildResults) { + if (resolvedTarget.isEmulator) { + return emulator.install(resolvedTarget, buildResults); + } + return device.install(resolvedTarget, buildResults); + }); + }); +}; + +module.exports.help = function(args) { + console.log('Usage: ' + path.relative(process.cwd(), args[1]) + ' [options]'); + console.log('Build options :'); + console.log(' --debug : Builds project in debug mode'); + console.log(' --release : Builds project in release mode'); + console.log(' --nobuild : Runs the currently built project without recompiling'); + console.log('Deploy options :'); + console.log(' --device : Will deploy the built project to a device'); + console.log(' --emulator : Will deploy the built project to an emulator if one exists'); + console.log(' --target=<target_id> : Installs to the target with the specified id.'); + process.exit(0); +}; |
