This is an automated email from the ASF dual-hosted git repository.

erisu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-android.git


The following commit(s) were added to refs/heads/master by this push:
     new c56cd4d  refactor: use es6 class (#911)
c56cd4d is described below

commit c56cd4d5a8fdf2fc80ee8a9f1c960f21fca87a9a
Author: Sukant Pal <[email protected]>
AuthorDate: Sat Feb 1 03:34:51 2020 -0500

    refactor: use es6 class (#911)
    
    Refactored to Classes:
    * Api
    * AndroidManifest
    * AndroidProject
---
 bin/templates/cordova/Api.js                 | 591 ++++++++++++++-------------
 bin/templates/cordova/lib/AndroidManifest.js | 188 ++++-----
 bin/templates/cordova/lib/AndroidProject.js  | 256 ++++++------
 3 files changed, 520 insertions(+), 515 deletions(-)

diff --git a/bin/templates/cordova/Api.js b/bin/templates/cordova/Api.js
index 83f7827..e6402fe 100644
--- a/bin/templates/cordova/Api.js
+++ b/bin/templates/cordova/Api.js
@@ -51,317 +51,320 @@ function setupEvents (externalEventEmitter) {
  * The PlatformApi instance also should define the following field:
  *
  * * platform: String that defines a platform name.
+ * @class Api
  */
-function Api (platform, platformRootDir, events) {
-    this.platform = PLATFORM;
-    this.root = path.resolve(__dirname, '..');
-
-    setupEvents(events);
-
-    const appMain = path.join(this.root, 'app', 'src', 'main');
-    const appRes = path.join(appMain, 'res');
-
-    this.locations = {
-        root: this.root,
-        www: path.join(appMain, 'assets', 'www'),
-        res: appRes,
-        platformWww: path.join(this.root, 'platform_www'),
-        configXml: path.join(appRes, 'xml', 'config.xml'),
-        defaultConfigXml: path.join(this.root, 'cordova', 'defaults.xml'),
-        strings: path.join(appRes, 'values', 'strings.xml'),
-        manifest: path.join(appMain, 'AndroidManifest.xml'),
-        build: path.join(this.root, 'build'),
-        javaSrc: path.join(appMain, 'java')
-    };
-}
-
-/**
- * Installs platform to specified directory and creates a platform project.
- *
- * @param  {String}  destination Destination directory, where insatll platform 
to
- * @param  {ConfigParser}  [config] ConfgiParser instance, used to retrieve
- *   project creation options, such as package id and project name.
- * @param  {Object}  [options]  An options object. The most common options are:
- * @param  {String}  [options.customTemplate]  A path to custom template, that
- *   should override the default one from platform.
- * @param  {Boolean}  [options.link]  Flag that indicates that platform's
- *   sources will be linked to installed platform instead of copying.
- * @param {EventEmitter} [events] An EventEmitter instance that will be used 
for
- *   logging purposes. If no EventEmitter provided, all events will be logged 
to
- *   console
- *
- * @return {Promise<PlatformApi>} Promise either fulfilled with PlatformApi
- *   instance or rejected with CordovaError.
- */
-Api.createPlatform = function (destination, config, options, events) {
-    events = setupEvents(events);
-    var result;
-    try {
-        result = require('../../lib/create').create(destination, config, 
options, events).then(function (destination) {
-            return new Api(PLATFORM, destination, events);
-        });
-    } catch (e) {
-        events.emit('error', 'createPlatform is not callable from the android 
project API.');
-        throw (e);
+class Api {
+    constructor (platform, platformRootDir, events) {
+        this.platform = PLATFORM;
+        this.root = path.resolve(__dirname, '..');
+
+        setupEvents(events);
+
+        const appMain = path.join(this.root, 'app', 'src', 'main');
+        const appRes = path.join(appMain, 'res');
+
+        this.locations = {
+            root: this.root,
+            www: path.join(appMain, 'assets', 'www'),
+            res: appRes,
+            platformWww: path.join(this.root, 'platform_www'),
+            configXml: path.join(appRes, 'xml', 'config.xml'),
+            defaultConfigXml: path.join(this.root, 'cordova', 'defaults.xml'),
+            strings: path.join(appRes, 'values', 'strings.xml'),
+            manifest: path.join(appMain, 'AndroidManifest.xml'),
+            build: path.join(this.root, 'build'),
+            javaSrc: path.join(appMain, 'java')
+        };
     }
-    return result;
-};
 
-/**
- * Updates already installed platform.
- *
- * @param  {String}  destination Destination directory, where platform 
installed
- * @param  {Object}  [options]  An options object. The most common options are:
- * @param  {String}  [options.customTemplate]  A path to custom template, that
- *   should override the default one from platform.
- * @param  {Boolean}  [options.link]  Flag that indicates that platform's
- *   sources will be linked to installed platform instead of copying.
- * @param {EventEmitter} [events] An EventEmitter instance that will be used 
for
- *   logging purposes. If no EventEmitter provided, all events will be logged 
to
- *   console
- *
- * @return {Promise<PlatformApi>} Promise either fulfilled with PlatformApi
- *   instance or rejected with CordovaError.
- */
-Api.updatePlatform = function (destination, options, events) {
-    events = setupEvents(events);
-    var result;
-    try {
-        result = require('../../lib/create').update(destination, options, 
events).then(function (destination) {
-            return new Api(PLATFORM, destination, events);
-        });
-    } catch (e) {
-        events.emit('error', 'updatePlatform is not callable from the android 
project API, you will need to do this manually.');
-        throw (e);
+    /**
+     * Gets a CordovaPlatform object, that represents the platform structure.
+     *
+     * @return  {CordovaPlatform}  A structure that contains the description of
+     *   platform's file structure and other properties of platform.
+     */
+    getPlatformInfo () {
+        var result = {};
+        result.locations = this.locations;
+        result.root = this.root;
+        result.name = this.platform;
+        result.version = require('./version');
+        result.projectConfig = this._config;
+
+        return result;
     }
-    return result;
-};
-
-/**
- * Gets a CordovaPlatform object, that represents the platform structure.
- *
- * @return  {CordovaPlatform}  A structure that contains the description of
- *   platform's file structure and other properties of platform.
- */
-Api.prototype.getPlatformInfo = function () {
-    var result = {};
-    result.locations = this.locations;
-    result.root = this.root;
-    result.name = this.platform;
-    result.version = require('./version');
-    result.projectConfig = this._config;
-
-    return result;
-};
 
-/**
- * Updates installed platform with provided www assets and new app
- *   configuration. This method is required for CLI workflow and will be called
- *   each time before build, so the changes, made to app configuration and www
- *   code, will be applied to platform.
- *
- * @param {CordovaProject} cordovaProject A CordovaProject instance, that 
defines a
- *   project structure and configuration, that should be applied to platform
- *   (contains project's www location and ConfigParser instance for project's
- *   config).
- *
- * @return  {Promise}  Return a promise either fulfilled, or rejected with
- *   CordovaError instance.
- */
-Api.prototype.prepare = function (cordovaProject, prepareOptions) {
-    cordovaProject.projectConfig = new 
ConfigParser(cordovaProject.locations.rootConfigXml || 
cordovaProject.projectConfig.path);
-
-    return require('./lib/prepare').prepare.call(this, cordovaProject, 
prepareOptions);
-};
-
-/**
- * Installs a new plugin into platform. This method only copies non-www files
- *   (sources, libs, etc.) to platform. It also doesn't resolves the
- *   dependencies of plugin. Both of handling of www files, such as assets and
- *   js-files and resolving dependencies are the responsibility of caller.
- *
- * @param  {PluginInfo}  plugin  A PluginInfo instance that represents plugin
- *   that will be installed.
- * @param  {Object}  installOptions  An options object. Possible options below:
- * @param  {Boolean}  installOptions.link: Flag that specifies that plugin
- *   sources will be symlinked to app's directory instead of copying (if
- *   possible).
- * @param  {Object}  installOptions.variables  An object that represents
- *   variables that will be used to install plugin. See more details on plugin
- *   variables in documentation:
- *   https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html
- *
- * @return  {Promise}  Return a promise either fulfilled, or rejected with
- *   CordovaError instance.
- */
-Api.prototype.addPlugin = function (plugin, installOptions) {
-    var project = AndroidProject.getProjectFile(this.root);
-    var self = this;
-
-    installOptions = installOptions || {};
-    installOptions.variables = installOptions.variables || {};
-    // Add PACKAGE_NAME variable into vars
-    if (!installOptions.variables.PACKAGE_NAME) {
-        installOptions.variables.PACKAGE_NAME = project.getPackageName();
+    /**
+     * Updates installed platform with provided www assets and new app
+     *   configuration. This method is required for CLI workflow and will be 
called
+     *   each time before build, so the changes, made to app configuration and 
www
+     *   code, will be applied to platform.
+     *
+     * @param {CordovaProject} cordovaProject A CordovaProject instance, that 
defines a
+     *   project structure and configuration, that should be applied to 
platform
+     *   (contains project's www location and ConfigParser instance for 
project's
+     *   config).
+     *
+     * @return  {Promise}  Return a promise either fulfilled, or rejected with
+     *   CordovaError instance.
+     */
+    prepare (cordovaProject, prepareOptions) {
+        cordovaProject.projectConfig = new 
ConfigParser(cordovaProject.locations.rootConfigXml || 
cordovaProject.projectConfig.path);
+
+        return require('./lib/prepare').prepare.call(this, cordovaProject, 
prepareOptions);
     }
 
-    return Promise.resolve().then(function () {
-        return PluginManager.get(self.platform, self.locations, 
project).addPlugin(plugin, installOptions);
-    }).then(function () {
-        if (plugin.getFrameworks(this.platform).length === 0) return;
-        selfEvents.emit('verbose', 'Updating build files since android plugin 
contained <framework>');
-        // This should pick the correct builder, not just get gradle
-        require('./lib/builders/builders').getBuilder().prepBuildFiles();
-    }.bind(this))
-        // CB-11022 Return truthy value to prevent running prepare after
-        .then(() => true);
-};
-
-/**
- * Removes an installed plugin from platform.
- *
- * Since method accepts PluginInfo instance as input parameter instead of 
plugin
- *   id, caller shoud take care of managing/storing PluginInfo instances for
- *   future uninstalls.
- *
- * @param  {PluginInfo}  plugin  A PluginInfo instance that represents plugin
- *   that will be installed.
- *
- * @return  {Promise}  Return a promise either fulfilled, or rejected with
- *   CordovaError instance.
- */
-Api.prototype.removePlugin = function (plugin, uninstallOptions) {
-    var project = AndroidProject.getProjectFile(this.root);
-
-    if (uninstallOptions && uninstallOptions.usePlatformWww === true) {
-        uninstallOptions.usePlatformWww = false;
-    }
-
-    return PluginManager.get(this.platform, this.locations, project)
-        .removePlugin(plugin, uninstallOptions)
-        .then(function () {
+    /**
+     * Installs a new plugin into platform. This method only copies non-www 
files
+     *   (sources, libs, etc.) to platform. It also doesn't resolves the
+     *   dependencies of plugin. Both of handling of www files, such as assets 
and
+     *   js-files and resolving dependencies are the responsibility of caller.
+     *
+     * @param  {PluginInfo}  plugin  A PluginInfo instance that represents 
plugin
+     *   that will be installed.
+     * @param  {Object}  installOptions  An options object. Possible options 
below:
+     * @param  {Boolean}  installOptions.link: Flag that specifies that plugin
+     *   sources will be symlinked to app's directory instead of copying (if
+     *   possible).
+     * @param  {Object}  installOptions.variables  An object that represents
+     *   variables that will be used to install plugin. See more details on 
plugin
+     *   variables in documentation:
+     *   https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html
+     *
+     * @return  {Promise}  Return a promise either fulfilled, or rejected with
+     *   CordovaError instance.
+     */
+    addPlugin (plugin, installOptions) {
+        var project = AndroidProject.getProjectFile(this.root);
+        var self = this;
+
+        installOptions = installOptions || {};
+        installOptions.variables = installOptions.variables || {};
+        // Add PACKAGE_NAME variable into vars
+        if (!installOptions.variables.PACKAGE_NAME) {
+            installOptions.variables.PACKAGE_NAME = project.getPackageName();
+        }
+
+        return Promise.resolve().then(function () {
+            return PluginManager.get(self.platform, self.locations, 
project).addPlugin(plugin, installOptions);
+        }).then(function () {
             if (plugin.getFrameworks(this.platform).length === 0) return;
-
             selfEvents.emit('verbose', 'Updating build files since android 
plugin contained <framework>');
+            // This should pick the correct builder, not just get gradle
             require('./lib/builders/builders').getBuilder().prepBuildFiles();
         }.bind(this))
-        // CB-11022 Return truthy value to prevent running prepare after
-        .then(() => true);
-};
+            // CB-11022 Return truthy value to prevent running prepare after
+            .then(() => true);
+    }
 
-/**
- * Builds an application package for current platform.
- *
- * @param  {Object}  buildOptions  A build options. This object's structure is
- *   highly depends on platform's specific. The most common options are:
- * @param  {Boolean}  buildOptions.debug  Indicates that packages should be
- *   built with debug configuration. This is set to true by default unless the
- *   'release' option is not specified.
- * @param  {Boolean}  buildOptions.release  Indicates that packages should be
- *   built with release configuration. If not set to true, debug configuration
- *   will be used.
- * @param   {Boolean}  buildOptions.device  Specifies that built app is 
intended
- *   to run on device
- * @param   {Boolean}  buildOptions.emulator: Specifies that built app is
- *   intended to run on emulator
- * @param   {String}  buildOptions.target  Specifies the device id that will be
- *   used to run built application.
- * @param   {Boolean}  buildOptions.nobuild  Indicates that this should be a
- *   dry-run call, so no build artifacts will be produced.
- * @param   {String[]}  buildOptions.archs  Specifies chip architectures which
- *   app packages should be built for. List of valid architectures is depends 
on
- *   platform.
- * @param   {String}  buildOptions.buildConfig  The path to build configuration
- *   file. The format of this file is depends on platform.
- * @param   {String[]} buildOptions.argv Raw array of command-line arguments,
- *   passed to `build` command. The purpose of this property is to pass a
- *   platform-specific arguments, and eventually let platform define own
- *   arguments processing logic.
- *
- * @return {Promise<Object[]>} A promise either fulfilled with an array of 
build
- *   artifacts (application packages) if package was built successfully,
- *   or rejected with CordovaError. The resultant build artifact objects is not
- *   strictly typed and may conatin arbitrary set of fields as in sample below.
- *
- *     {
- *         architecture: 'x86',
- *         buildType: 'debug',
- *         path: '/path/to/build',
- *         type: 'app'
- *     }
- *
- * The return value in most cases will contain only one item but in some cases
- *   there could be multiple items in output array, e.g. when multiple
- *   arhcitectures is specified.
- */
-Api.prototype.build = function (buildOptions) {
-    var self = this;
-
-    return require('./lib/check_reqs').run().then(function () {
-        return require('./lib/build').run.call(self, buildOptions);
-    }).then(function (buildResults) {
-        // Cast build result to array of build artifacts
-        return buildResults.paths.map(function (apkPath) {
-            return {
-                buildType: buildResults.buildType,
-                buildMethod: buildResults.buildMethod,
-                path: apkPath,
-                type: path.extname(apkPath).replace(/\./g, '')
-            };
+    /**
+     * Removes an installed plugin from platform.
+     *
+     * Since method accepts PluginInfo instance as input parameter instead of 
plugin
+     *   id, caller shoud take care of managing/storing PluginInfo instances 
for
+     *   future uninstalls.
+     *
+     * @param  {PluginInfo}  plugin  A PluginInfo instance that represents 
plugin
+     *   that will be installed.
+     *
+     * @return  {Promise}  Return a promise either fulfilled, or rejected with
+     *   CordovaError instance.
+     */
+    removePlugin (plugin, uninstallOptions) {
+        var project = AndroidProject.getProjectFile(this.root);
+
+        if (uninstallOptions && uninstallOptions.usePlatformWww === true) {
+            uninstallOptions.usePlatformWww = false;
+        }
+
+        return PluginManager.get(this.platform, this.locations, project)
+            .removePlugin(plugin, uninstallOptions)
+            .then(function () {
+                if (plugin.getFrameworks(this.platform).length === 0) return;
+
+                selfEvents.emit('verbose', 'Updating build files since android 
plugin contained <framework>');
+                
require('./lib/builders/builders').getBuilder().prepBuildFiles();
+            }.bind(this))
+            // CB-11022 Return truthy value to prevent running prepare after
+            .then(() => true);
+    }
+
+    /**
+     * Builds an application package for current platform.
+     *
+     * @param  {Object}  buildOptions  A build options. This object's 
structure is
+     *   highly depends on platform's specific. The most common options are:
+     * @param  {Boolean}  buildOptions.debug  Indicates that packages should be
+     *   built with debug configuration. This is set to true by default unless 
the
+     *   'release' option is not specified.
+     * @param  {Boolean}  buildOptions.release  Indicates that packages should 
be
+     *   built with release configuration. If not set to true, debug 
configuration
+     *   will be used.
+     * @param   {Boolean}  buildOptions.device  Specifies that built app is 
intended
+     *   to run on device
+     * @param   {Boolean}  buildOptions.emulator: Specifies that built app is
+     *   intended to run on emulator
+     * @param   {String}  buildOptions.target  Specifies the device id that 
will be
+     *   used to run built application.
+     * @param   {Boolean}  buildOptions.nobuild  Indicates that this should be 
a
+     *   dry-run call, so no build artifacts will be produced.
+     * @param   {String[]}  buildOptions.archs  Specifies chip architectures 
which
+     *   app packages should be built for. List of valid architectures is 
depends on
+     *   platform.
+     * @param   {String}  buildOptions.buildConfig  The path to build 
configuration
+     *   file. The format of this file is depends on platform.
+     * @param   {String[]} buildOptions.argv Raw array of command-line 
arguments,
+     *   passed to `build` command. The purpose of this property is to pass a
+     *   platform-specific arguments, and eventually let platform define own
+     *   arguments processing logic.
+     *
+     * @return {Promise<Object[]>} A promise either fulfilled with an array of 
build
+     *   artifacts (application packages) if package was built successfully,
+     *   or rejected with CordovaError. The resultant build artifact objects 
is not
+     *   strictly typed and may conatin arbitrary set of fields as in sample 
below.
+     *
+     *     {
+     *         architecture: 'x86',
+     *         buildType: 'debug',
+     *         path: '/path/to/build',
+     *         type: 'app'
+     *     }
+     *
+     * The return value in most cases will contain only one item but in some 
cases
+     *   there could be multiple items in output array, e.g. when multiple
+     *   arhcitectures is specified.
+     */
+    build (buildOptions) {
+        var self = this;
+
+        return require('./lib/check_reqs').run().then(function () {
+            return require('./lib/build').run.call(self, buildOptions);
+        }).then(function (buildResults) {
+            // Cast build result to array of build artifacts
+            return buildResults.paths.map(function (apkPath) {
+                return {
+                    buildType: buildResults.buildType,
+                    buildMethod: buildResults.buildMethod,
+                    path: apkPath,
+                    type: path.extname(apkPath).replace(/\./g, '')
+                };
+            });
         });
-    });
-};
+    }
 
-/**
- * Builds an application package for current platform and runs it on
- *   specified/default device. If no 'device'/'emulator'/'target' options are
- *   specified, then tries to run app on default device if connected, otherwise
- *   runs the app on emulator.
- *
- * @param   {Object}  runOptions  An options object. The structure is the same
- *   as for build options.
- *
- * @return {Promise} A promise either fulfilled if package was built and ran
- *   successfully, or rejected with CordovaError.
- */
-Api.prototype.run = function (runOptions) {
-    var self = this;
-    return require('./lib/check_reqs').run().then(function () {
-        return require('./lib/run').run.call(self, runOptions);
-    });
-};
+    /**
+     * Builds an application package for current platform and runs it on
+     *   specified/default device. If no 'device'/'emulator'/'target' options 
are
+     *   specified, then tries to run app on default device if connected, 
otherwise
+     *   runs the app on emulator.
+     *
+     * @param   {Object}  runOptions  An options object. The structure is the 
same
+     *   as for build options.
+     *
+     * @return {Promise} A promise either fulfilled if package was built and 
ran
+     *   successfully, or rejected with CordovaError.
+     */
+    run (runOptions) {
+        var self = this;
+        return require('./lib/check_reqs').run().then(function () {
+            return require('./lib/run').run.call(self, runOptions);
+        });
+    }
 
-/**
- * Cleans out the build artifacts from platform's directory, and also
- * cleans out the platform www directory if called without options specified.
- *
- * @return  {Promise}  Return a promise either fulfilled, or rejected with
- *   CordovaError.
- */
-Api.prototype.clean = function (cleanOptions) {
-    var self = this;
-    // This will lint, checking for null won't
-    if (typeof cleanOptions === 'undefined') {
-        cleanOptions = {};
+    /**
+     * Cleans out the build artifacts from platform's directory, and also
+     * cleans out the platform www directory if called without options 
specified.
+     *
+     * @return  {Promise}  Return a promise either fulfilled, or rejected with
+     *   CordovaError.
+     */
+    clean (cleanOptions) {
+        var self = this;
+        // This will lint, checking for null won't
+        if (typeof cleanOptions === 'undefined') {
+            cleanOptions = {};
+        }
+
+        return require('./lib/check_reqs').run().then(function () {
+            return require('./lib/build').runClean.call(self, cleanOptions);
+        }).then(function () {
+            return require('./lib/prepare').clean.call(self, cleanOptions);
+        });
     }
 
-    return require('./lib/check_reqs').run().then(function () {
-        return require('./lib/build').runClean.call(self, cleanOptions);
-    }).then(function () {
-        return require('./lib/prepare').clean.call(self, cleanOptions);
-    });
-};
+    /**
+     * Performs a requirements check for current platform. Each platform 
defines its
+     *   own set of requirements, which should be resolved before platform can 
be
+     *   built successfully.
+     *
+     * @return  {Promise<Requirement[]>}  Promise, resolved with set of 
Requirement
+     *   objects for current platform.
+     */
+    requirements () {
+        return require('./lib/check_reqs').check_all();
+    }
 
-/**
- * Performs a requirements check for current platform. Each platform defines 
its
- *   own set of requirements, which should be resolved before platform can be
- *   built successfully.
- *
- * @return  {Promise<Requirement[]>}  Promise, resolved with set of Requirement
- *   objects for current platform.
- */
-Api.prototype.requirements = function () {
-    return require('./lib/check_reqs').check_all();
-};
+    /**
+     * Installs platform to specified directory and creates a platform project.
+     *
+     * @param  {String}  destination Destination directory, where insatll 
platform to
+     * @param  {ConfigParser}  [config] ConfgiParser instance, used to retrieve
+     *   project creation options, such as package id and project name.
+     * @param  {Object}  [options]  An options object. The most common options 
are:
+     * @param  {String}  [options.customTemplate]  A path to custom template, 
that
+     *   should override the default one from platform.
+     * @param  {Boolean}  [options.link]  Flag that indicates that platform's
+     *   sources will be linked to installed platform instead of copying.
+     * @param {EventEmitter} [events] An EventEmitter instance that will be 
used for
+     *   logging purposes. If no EventEmitter provided, all events will be 
logged to
+     *   console
+     *
+     * @return {Promise<PlatformApi>} Promise either fulfilled with PlatformApi
+     *   instance or rejected with CordovaError.
+     */
+    static createPlatform (destination, config, options, events) {
+        events = setupEvents(events);
+        var result;
+        try {
+            result = require('../../lib/create').create(destination, config, 
options, events).then(function (destination) {
+                return new Api(PLATFORM, destination, events);
+            });
+        } catch (e) {
+            events.emit('error', 'createPlatform is not callable from the 
android project API.');
+            throw (e);
+        }
+        return result;
+    }
+
+    /**
+     * Updates already installed platform.
+     *
+     * @param  {String}  destination Destination directory, where platform 
installed
+     * @param  {Object}  [options]  An options object. The most common options 
are:
+     * @param  {String}  [options.customTemplate]  A path to custom template, 
that
+     *   should override the default one from platform.
+     * @param  {Boolean}  [options.link]  Flag that indicates that platform's
+     *   sources will be linked to installed platform instead of copying.
+     * @param {EventEmitter} [events] An EventEmitter instance that will be 
used for
+     *   logging purposes. If no EventEmitter provided, all events will be 
logged to
+     *   console
+     *
+     * @return {Promise<PlatformApi>} Promise either fulfilled with PlatformApi
+     *   instance or rejected with CordovaError.
+     */
+    static updatePlatform (destination, options, events) {
+        events = setupEvents(events);
+        var result;
+        try {
+            result = require('../../lib/create').update(destination, options, 
events).then(function (destination) {
+                return new Api(PLATFORM, destination, events);
+            });
+        } catch (e) {
+            events.emit('error', 'updatePlatform is not callable from the 
android project API, you will need to do this manually.');
+            throw (e);
+        }
+        return result;
+    }
+}
 
 module.exports = Api;
diff --git a/bin/templates/cordova/lib/AndroidManifest.js 
b/bin/templates/cordova/lib/AndroidManifest.js
index a4489f1..5d71ed1 100644
--- a/bin/templates/cordova/lib/AndroidManifest.js
+++ b/bin/templates/cordova/lib/AndroidManifest.js
@@ -23,104 +23,106 @@ var xml = require('cordova-common').xmlHelpers;
 var DEFAULT_ORIENTATION = 'default';
 
 /** Wraps an AndroidManifest file */
-function AndroidManifest (path) {
-    this.path = path;
-    this.doc = xml.parseElementtreeSync(path);
-    if (this.doc.getroot().tag !== 'manifest') {
-        throw new Error('AndroidManifest at ' + path + ' has incorrect root 
node name (expected "manifest")');
+class AndroidManifest {
+    constructor (path) {
+        this.path = path;
+        this.doc = xml.parseElementtreeSync(path);
+        if (this.doc.getroot().tag !== 'manifest') {
+            throw new Error('AndroidManifest at ' + path + ' has incorrect 
root node name (expected "manifest")');
+        }
     }
-}
 
-AndroidManifest.prototype.getVersionName = function () {
-    return this.doc.getroot().attrib['android:versionName'];
-};
-
-AndroidManifest.prototype.setVersionName = function (versionName) {
-    this.doc.getroot().attrib['android:versionName'] = versionName;
-    return this;
-};
-
-AndroidManifest.prototype.getVersionCode = function () {
-    return this.doc.getroot().attrib['android:versionCode'];
-};
-
-AndroidManifest.prototype.setVersionCode = function (versionCode) {
-    this.doc.getroot().attrib['android:versionCode'] = versionCode;
-    return this;
-};
-
-AndroidManifest.prototype.getPackageId = function () {
-    return this.doc.getroot().attrib['package'];
-};
-
-AndroidManifest.prototype.setPackageId = function (pkgId) {
-    this.doc.getroot().attrib['package'] = pkgId;
-    return this;
-};
-
-AndroidManifest.prototype.getActivity = function () {
-    var activity = this.doc.getroot().find('./application/activity');
-    return {
-        getName: function () {
-            return activity.attrib['android:name'];
-        },
-        setName: function (name) {
-            if (!name) {
-                delete activity.attrib['android:name'];
-            } else {
-                activity.attrib['android:name'] = name;
-            }
-            return this;
-        },
-        getOrientation: function () {
-            return activity.attrib['android:screenOrientation'];
-        },
-        setOrientation: function (orientation) {
-            if (!orientation || orientation.toLowerCase() === 
DEFAULT_ORIENTATION) {
-                delete activity.attrib['android:screenOrientation'];
-            } else {
-                activity.attrib['android:screenOrientation'] = orientation;
-            }
-            return this;
-        },
-        getLaunchMode: function () {
-            return activity.attrib['android:launchMode'];
-        },
-        setLaunchMode: function (launchMode) {
-            if (!launchMode) {
-                delete activity.attrib['android:launchMode'];
-            } else {
-                activity.attrib['android:launchMode'] = launchMode;
+    getVersionName () {
+        return this.doc.getroot().attrib['android:versionName'];
+    }
+
+    setVersionName (versionName) {
+        this.doc.getroot().attrib['android:versionName'] = versionName;
+        return this;
+    }
+
+    getVersionCode () {
+        return this.doc.getroot().attrib['android:versionCode'];
+    }
+
+    setVersionCode (versionCode) {
+        this.doc.getroot().attrib['android:versionCode'] = versionCode;
+        return this;
+    }
+
+    getPackageId () {
+        return this.doc.getroot().attrib['package'];
+    }
+
+    setPackageId (pkgId) {
+        this.doc.getroot().attrib['package'] = pkgId;
+        return this;
+    }
+
+    getActivity () {
+        var activity = this.doc.getroot().find('./application/activity');
+        return {
+            getName: function () {
+                return activity.attrib['android:name'];
+            },
+            setName: function (name) {
+                if (!name) {
+                    delete activity.attrib['android:name'];
+                } else {
+                    activity.attrib['android:name'] = name;
+                }
+                return this;
+            },
+            getOrientation: function () {
+                return activity.attrib['android:screenOrientation'];
+            },
+            setOrientation: function (orientation) {
+                if (!orientation || orientation.toLowerCase() === 
DEFAULT_ORIENTATION) {
+                    delete activity.attrib['android:screenOrientation'];
+                } else {
+                    activity.attrib['android:screenOrientation'] = orientation;
+                }
+                return this;
+            },
+            getLaunchMode: function () {
+                return activity.attrib['android:launchMode'];
+            },
+            setLaunchMode: function (launchMode) {
+                if (!launchMode) {
+                    delete activity.attrib['android:launchMode'];
+                } else {
+                    activity.attrib['android:launchMode'] = launchMode;
+                }
+                return this;
             }
-            return this;
+        };
+    }
+
+    getDebuggable () {
+        return 
this.doc.getroot().find('./application').attrib['android:debuggable'] === 
'true';
+    }
+
+    setDebuggable (value) {
+        var application = this.doc.getroot().find('./application');
+        if (value) {
+            application.attrib['android:debuggable'] = 'true';
+        } else {
+            // The default value is "false", so we can remove attribute at all.
+            delete application.attrib['android:debuggable'];
         }
-    };
-};
-
-AndroidManifest.prototype.getDebuggable = function () {
-    return 
this.doc.getroot().find('./application').attrib['android:debuggable'] === 
'true';
-};
-
-AndroidManifest.prototype.setDebuggable = function (value) {
-    var application = this.doc.getroot().find('./application');
-    if (value) {
-        application.attrib['android:debuggable'] = 'true';
-    } else {
-        // The default value is "false", so we can remove attribute at all.
-        delete application.attrib['android:debuggable'];
+        return this;
     }
-    return this;
-};
 
-/**
- * Writes manifest to disk syncronously. If filename is specified, then 
manifest
- *   will be written to that file
- *
- * @param   {String}  [destPath]  File to write manifest to. If omitted,
- *   manifest will be written to file it has been read from.
- */
-AndroidManifest.prototype.write = function (destPath) {
-    fs.writeFileSync(destPath || this.path, this.doc.write({ indent: 4 }), 
'utf-8');
-};
+    /**
+     * Writes manifest to disk syncronously. If filename is specified, then 
manifest
+     *   will be written to that file
+     *
+     * @param   {String}  [destPath]  File to write manifest to. If omitted,
+     *   manifest will be written to file it has been read from.
+     */
+    write (destPath) {
+        fs.writeFileSync(destPath || this.path, this.doc.write({ indent: 4 }), 
'utf-8');
+    }
+}
 
 module.exports = AndroidManifest;
diff --git a/bin/templates/cordova/lib/AndroidProject.js 
b/bin/templates/cordova/lib/AndroidProject.js
index 3c2586a..5d1c3c3 100644
--- a/bin/templates/cordova/lib/AndroidProject.js
+++ b/bin/templates/cordova/lib/AndroidProject.js
@@ -55,148 +55,148 @@ function getRelativeLibraryPath (parentDir, subDir) {
     return (path.sep === '\\') ? libraryPath.replace(/\\/g, '/') : libraryPath;
 }
 
-function AndroidProject (projectDir) {
-    this._propertiesEditors = {};
-    this._subProjectDirs = {};
-    this._dirty = false;
-    this.projectDir = projectDir;
-    this.platformWww = path.join(this.projectDir, 'platform_www');
-    this.www = path.join(this.projectDir, 'app/src/main/assets/www');
-}
-
-AndroidProject.getProjectFile = function (projectDir) {
-    if (!projectFileCache[projectDir]) {
-        projectFileCache[projectDir] = new AndroidProject(projectDir);
+class AndroidProject {
+    constructor (projectDir) {
+        this._propertiesEditors = {};
+        this._subProjectDirs = {};
+        this._dirty = false;
+        this.projectDir = projectDir;
+        this.platformWww = path.join(this.projectDir, 'platform_www');
+        this.www = path.join(this.projectDir, 'app/src/main/assets/www');
     }
 
-    return projectFileCache[projectDir];
-};
+    /**
+     * Reads the package name out of the Android Manifest file
+     *
+     * @param   {String}  projectDir  The absolute path to the directory 
containing the project
+     * @return  {String}              The name of the package
+     */
+    getPackageName () {
+        var manifestPath = path.join(this.projectDir, 
'app/src/main/AndroidManifest.xml');
+        return new AndroidManifest(manifestPath).getPackageId();
+    }
 
-AndroidProject.purgeCache = function (projectDir) {
-    if (projectDir) {
-        delete projectFileCache[projectDir];
-    } else {
-        projectFileCache = {};
+    getCustomSubprojectRelativeDir (plugin_id, src) {
+        // All custom subprojects are prefixed with the last portion of the 
package id.
+        // This is to avoid collisions when opening multiple projects in 
Eclipse that have subprojects with the same name.
+        var packageName = this.getPackageName();
+        var lastDotIndex = packageName.lastIndexOf('.');
+        var prefix = packageName.substring(lastDotIndex + 1);
+        var subRelativeDir = path.join(plugin_id, prefix + '-' + 
path.basename(src));
+        return subRelativeDir;
     }
-};
 
-/**
- * Reads the package name out of the Android Manifest file
- *
- * @param   {String}  projectDir  The absolute path to the directory 
containing the project
- *
- * @return  {String}              The name of the package
- */
-AndroidProject.prototype.getPackageName = function () {
-    var manifestPath = path.join(this.projectDir, 
'app/src/main/AndroidManifest.xml');
-    return new AndroidManifest(manifestPath).getPackageId();
-};
-
-AndroidProject.prototype.getCustomSubprojectRelativeDir = function (plugin_id, 
src) {
-    // All custom subprojects are prefixed with the last portion of the 
package id.
-    // This is to avoid collisions when opening multiple projects in Eclipse 
that have subprojects with the same name.
-    var packageName = this.getPackageName();
-    var lastDotIndex = packageName.lastIndexOf('.');
-    var prefix = packageName.substring(lastDotIndex + 1);
-    var subRelativeDir = path.join(plugin_id, prefix + '-' + 
path.basename(src));
-    return subRelativeDir;
-};
-
-AndroidProject.prototype.addSubProject = function (parentDir, subDir) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var subProjectFile = path.resolve(subDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    // TODO: Setting the target needs to happen only for pre-3.7.0 projects
-    if (fs.existsSync(subProjectFile)) {
-        var subProperties = this._getPropertiesFile(subProjectFile);
-        subProperties.set('target', parentProperties.get('target'));
-        subProperties.dirty = true;
-        this._subProjectDirs[subDir] = true;
-    }
-    addToPropertyList(parentProperties, 'android.library.reference', 
getRelativeLibraryPath(parentDir, subDir));
-
-    this._dirty = true;
-};
-
-AndroidProject.prototype.removeSubProject = function (parentDir, subDir) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    removeFromPropertyList(parentProperties, 'android.library.reference', 
getRelativeLibraryPath(parentDir, subDir));
-    delete this._subProjectDirs[subDir];
-    this._dirty = true;
-};
-
-AndroidProject.prototype.addGradleReference = function (parentDir, subDir) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    addToPropertyList(parentProperties, 'cordova.gradle.include', 
getRelativeLibraryPath(parentDir, subDir));
-    this._dirty = true;
-};
-
-AndroidProject.prototype.removeGradleReference = function (parentDir, subDir) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    removeFromPropertyList(parentProperties, 'cordova.gradle.include', 
getRelativeLibraryPath(parentDir, subDir));
-    this._dirty = true;
-};
-
-AndroidProject.prototype.addSystemLibrary = function (parentDir, value) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    addToPropertyList(parentProperties, 'cordova.system.library', value);
-    this._dirty = true;
-};
-
-AndroidProject.prototype.removeSystemLibrary = function (parentDir, value) {
-    var parentProjectFile = path.resolve(parentDir, 'project.properties');
-    var parentProperties = this._getPropertiesFile(parentProjectFile);
-    removeFromPropertyList(parentProperties, 'cordova.system.library', value);
-    this._dirty = true;
-};
-
-AndroidProject.prototype.write = function () {
-    if (!this._dirty) {
-        return;
-    }
-    this._dirty = false;
-
-    for (var filename in this._propertiesEditors) {
-        var editor = this._propertiesEditors[filename];
-        if (editor.dirty) {
-            fs.writeFileSync(filename, editor.toString());
-            editor.dirty = false;
+    addSubProject (parentDir, subDir) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var subProjectFile = path.resolve(subDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        // TODO: Setting the target needs to happen only for pre-3.7.0 projects
+        if (fs.existsSync(subProjectFile)) {
+            var subProperties = this._getPropertiesFile(subProjectFile);
+            subProperties.set('target', parentProperties.get('target'));
+            subProperties.dirty = true;
+            this._subProjectDirs[subDir] = true;
         }
+        addToPropertyList(parentProperties, 'android.library.reference', 
getRelativeLibraryPath(parentDir, subDir));
+
+        this._dirty = true;
     }
-};
 
-AndroidProject.prototype._getPropertiesFile = function (filename) {
-    if (!this._propertiesEditors[filename]) {
-        if (fs.existsSync(filename)) {
-            this._propertiesEditors[filename] = 
properties_parser.createEditor(filename);
-        } else {
-            this._propertiesEditors[filename] = 
properties_parser.createEditor();
+    removeSubProject (parentDir, subDir) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        removeFromPropertyList(parentProperties, 'android.library.reference', 
getRelativeLibraryPath(parentDir, subDir));
+        delete this._subProjectDirs[subDir];
+        this._dirty = true;
+    }
+
+    addGradleReference (parentDir, subDir) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        addToPropertyList(parentProperties, 'cordova.gradle.include', 
getRelativeLibraryPath(parentDir, subDir));
+        this._dirty = true;
+    }
+
+    removeGradleReference (parentDir, subDir) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        removeFromPropertyList(parentProperties, 'cordova.gradle.include', 
getRelativeLibraryPath(parentDir, subDir));
+        this._dirty = true;
+    }
+
+    addSystemLibrary (parentDir, value) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        addToPropertyList(parentProperties, 'cordova.system.library', value);
+        this._dirty = true;
+    }
+
+    removeSystemLibrary (parentDir, value) {
+        var parentProjectFile = path.resolve(parentDir, 'project.properties');
+        var parentProperties = this._getPropertiesFile(parentProjectFile);
+        removeFromPropertyList(parentProperties, 'cordova.system.library', 
value);
+        this._dirty = true;
+    }
+
+    write () {
+        if (!this._dirty) {
+            return;
+        }
+        this._dirty = false;
+
+        for (var filename in this._propertiesEditors) {
+            var editor = this._propertiesEditors[filename];
+            if (editor.dirty) {
+                fs.writeFileSync(filename, editor.toString());
+                editor.dirty = false;
+            }
         }
     }
 
-    return this._propertiesEditors[filename];
-};
+    getInstaller (type) {
+        return pluginHandlers.getInstaller(type);
+    }
 
-AndroidProject.prototype.getInstaller = function (type) {
-    return pluginHandlers.getInstaller(type);
-};
+    getUninstaller (type) {
+        return pluginHandlers.getUninstaller(type);
+    }
 
-AndroidProject.prototype.getUninstaller = function (type) {
-    return pluginHandlers.getUninstaller(type);
-};
+    /*
+     * This checks if an Android project is clean or has old build artifacts
+     */
+    isClean () {
+        var build_path = path.join(this.projectDir, 'build');
+        // If the build directory doesn't exist, it's clean
+        return !(fs.existsSync(build_path));
+    }
 
-/*
- * This checks if an Android project is clean or has old build artifacts
- */
+    _getPropertiesFile (filename) {
+        if (!this._propertiesEditors[filename]) {
+            if (fs.existsSync(filename)) {
+                this._propertiesEditors[filename] = 
properties_parser.createEditor(filename);
+            } else {
+                this._propertiesEditors[filename] = 
properties_parser.createEditor();
+            }
+        }
+
+        return this._propertiesEditors[filename];
+    }
 
-AndroidProject.prototype.isClean = function () {
-    var build_path = path.join(this.projectDir, 'build');
-    // If the build directory doesn't exist, it's clean
-    return !(fs.existsSync(build_path));
-};
+    static getProjectFile (projectDir) {
+        if (!projectFileCache[projectDir]) {
+            projectFileCache[projectDir] = new AndroidProject(projectDir);
+        }
+
+        return projectFileCache[projectDir];
+    }
+
+    static purgeCache (projectDir) {
+        if (projectDir) {
+            delete projectFileCache[projectDir];
+        } else {
+            projectFileCache = {};
+        }
+    }
+}
 
 module.exports = AndroidProject;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to