From cb61f47080068eea6c432165c7ac44cae080e583 Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Thu, 4 Sep 2014 11:12:18 +0400 Subject: [PATCH 1/2] Adds support for --projectname option to create command --- cordova-lib/src/configparser/ConfigParser.js | 7 +++++++ cordova-lib/src/cordova/create.js | 6 +++++- cordova-lib/src/cordova/platform.js | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/cordova-lib/src/configparser/ConfigParser.js b/cordova-lib/src/configparser/ConfigParser.js index da6376ec0..e043d5d31 100644 --- a/cordova-lib/src/configparser/ConfigParser.js +++ b/cordova-lib/src/configparser/ConfigParser.js @@ -95,6 +95,13 @@ ConfigParser.prototype = { var el = findOrCreate(this.doc, 'name'); el.text = name; }, + projectname: function() { + return getNodeTextSafe(this.doc.find('projectname')); + }, + setProjectName: function(projectname) { + var el = findOrCreate(this.doc, 'projectname'); + el.text = projectname; + }, description: function() { return this.doc.find('description').text.trim(); }, diff --git a/cordova-lib/src/cordova/create.js b/cordova-lib/src/cordova/create.js index c8cb6946c..88b1fece4 100644 --- a/cordova-lib/src/cordova/create.js +++ b/cordova-lib/src/cordova/create.js @@ -33,6 +33,7 @@ var path = require('path'), cordova_util = require('./util'); var DEFAULT_NAME = 'HelloCordova', + DEFAULT_PROJECT_NAME = DEFAULT_NAME, DEFAULT_ID = 'io.cordova.hellocordova'; /** @@ -58,6 +59,7 @@ function create(dir, id, name, cfg) { cfg = cfg || {}; id = id || cfg.id || DEFAULT_ID; name = name || cfg.name || DEFAULT_NAME; + var projectname = cfg.projectname || DEFAULT_PROJECT_NAME; // Make absolute. dir = path.resolve(dir); @@ -232,10 +234,12 @@ function create(dir, id, name, cfg) { if (!fs.existsSync(configPath)) { var template_config_xml = path.join(__dirname, '..', '..', 'templates', 'config.xml'); shell.cp(template_config_xml, configPath); - // Write out id and name to config.xml + // Write out id, name and projectname to config.xml var conf = new ConfigParser(configPath); conf.setPackageName(id); conf.setName(name); + // Note that this will be written only if custom config.xml is not provided as a part of custom www folder + conf.setProjectName(projectname); conf.write(); } }); diff --git a/cordova-lib/src/cordova/platform.js b/cordova-lib/src/cordova/platform.js index c206f3764..9c4713d4c 100644 --- a/cordova-lib/src/cordova/platform.js +++ b/cordova-lib/src/cordova/platform.js @@ -438,6 +438,12 @@ function call_into_create(target, projectRoot, cfg, libDir, template_dir, opts) if (template_dir) { args.push(template_dir); } + var projectName = cfg.projectName(); + // Additional check for android is necessary because this feature may cause create script failure + // on other platforms due to some of them doesn't support arbitrary arguments + if (projectName && target == 'android') { + args.push('--projectname="' + projectName + '"'); + } return superspawn.spawn(bin, args, opts || { stdio: 'inherit' }) .then(function() { From d912dc61a3c5c9e058e668c1d39e73e075abee3b Mon Sep 17 00:00:00 2001 From: Vladimir Kotikov Date: Thu, 4 Sep 2014 13:49:56 +0400 Subject: [PATCH 2/2] Adds support for projectname element to android platform --- cordova-lib/src/configparser/ConfigParser.js | 2 +- cordova-lib/src/cordova/create.js | 9 +++---- .../src/cordova/metadata/android_parser.js | 26 ++++++++++++++++++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/cordova-lib/src/configparser/ConfigParser.js b/cordova-lib/src/configparser/ConfigParser.js index e043d5d31..8505d81bc 100644 --- a/cordova-lib/src/configparser/ConfigParser.js +++ b/cordova-lib/src/configparser/ConfigParser.js @@ -95,7 +95,7 @@ ConfigParser.prototype = { var el = findOrCreate(this.doc, 'name'); el.text = name; }, - projectname: function() { + projectName: function() { return getNodeTextSafe(this.doc.find('projectname')); }, setProjectName: function(projectname) { diff --git a/cordova-lib/src/cordova/create.js b/cordova-lib/src/cordova/create.js index 88b1fece4..76303a576 100644 --- a/cordova-lib/src/cordova/create.js +++ b/cordova-lib/src/cordova/create.js @@ -33,7 +33,6 @@ var path = require('path'), cordova_util = require('./util'); var DEFAULT_NAME = 'HelloCordova', - DEFAULT_PROJECT_NAME = DEFAULT_NAME, DEFAULT_ID = 'io.cordova.hellocordova'; /** @@ -45,7 +44,7 @@ var DEFAULT_NAME = 'HelloCordova', **/ // Returns a promise. module.exports = create; -function create(dir, id, name, cfg) { +function create(dir, id, name, cfg, projectname) { if (!dir ) { return Q.reject(new CordovaError( 'At least the dir must be provided to create new project. See `'+cordova_util.binname+' help`.' @@ -59,7 +58,6 @@ function create(dir, id, name, cfg) { cfg = cfg || {}; id = id || cfg.id || DEFAULT_ID; name = name || cfg.name || DEFAULT_NAME; - var projectname = cfg.projectname || DEFAULT_PROJECT_NAME; // Make absolute. dir = path.resolve(dir); @@ -238,8 +236,9 @@ function create(dir, id, name, cfg) { var conf = new ConfigParser(configPath); conf.setPackageName(id); conf.setName(name); - // Note that this will be written only if custom config.xml is not provided as a part of custom www folder - conf.setProjectName(projectname); + if (projectname) { + conf.setProjectName(projectname); + } conf.write(); } }); diff --git a/cordova-lib/src/cordova/metadata/android_parser.js b/cordova-lib/src/cordova/metadata/android_parser.js index 9f338ddfe..91bb6f2ef 100644 --- a/cordova-lib/src/cordova/metadata/android_parser.js +++ b/cordova-lib/src/cordova/metadata/android_parser.js @@ -225,6 +225,16 @@ module.exports.prototype = { this.handleIcons(config); var manifest = xml.parseElementtreeSync(this.manifest); + + // Update main class name + var projectname = config.projectName(); + // Note that if element is removed after at least one successful build + // this will be skipped, and main class/activity name remains unchanged + if (projectname) { + manifest.getroot().find('./application/activity').attrib['android:name'] = projectname; + events.emit('verbose', 'Wrote out Android main activity name to "' + projectname + '"'); + } + // Update the version by changing the AndroidManifest android:versionName var version = config.version(); var versionCode = config.android_versionCode() || default_versionCode(version); @@ -290,14 +300,28 @@ module.exports.prototype = { } var orig_java_class = java_files[0]; + // Handle option in config.xml + // Note that if element is removed after at least one successful build + // this will be skipped, and main class/activity name remains unchanged + var new_java_class = config.projectName() ? config.projectName() + '.java' : orig_java_class; var pkgDir = path.join(this.path, 'src', path.join.apply(null, pkg.split('.'))); shell.mkdir('-p', pkgDir); var orig_javs = path.join(orig_pkgDir, orig_java_class); - var new_javs = path.join(pkgDir, orig_java_class); + var new_javs = path.join(pkgDir, new_java_class); var javs_contents = fs.readFileSync(orig_javs, 'utf-8'); javs_contents = javs_contents.replace(/package [\w\.]*;/, 'package ' + pkg + ';'); + // if is specified, we also need to replace main class name with projectname value + // Note that if element is removed after at least one successful build + // this will be skipped, and main class/activity name remains unchanged + if (config.projectName()) { + javs_contents = javs_contents.replace(/class\s+(.*?)\s+extends CordovaActivity/, 'class ' + config.projectName() + ' extends CordovaActivity'); + } events.emit('verbose', 'Wrote out Android package name to "' + pkg + '"'); fs.writeFileSync(new_javs, javs_contents, 'utf-8'); + // Remove old java class file + if (orig_javs != new_javs) { + shell.rm('-f', orig_javs); + } }, // Returns the platform-specific www directory.