Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
de-push-proxy-plugin / hooks / updateAndroidManifest.js
Size: Mime:
'use strict';
module.exports = function(context) {

  //we need to change
  //<service android:exported="false" android:name="com.adobe.phonegap.push.GCMIntentService">
  //to
  //<service android:exported="false" android:name="com.com.vipera.pushproxy.DEGCMIntentService">

  var cordovaProjectPath =  context.opts.projectRoot;
  var pluginId = context.opts.plugin.id;
  var et = context.requireCordovaModule('elementtree');
  const fs = require('fs');
  const path = require('path');
  const xml2js = context.requireCordovaModule('vipera-de-cli').xml2js;
  const _ = context.requireCordovaModule('vipera-de-cli').lodash;


  var installedPlatforms = context.opts.platforms;
  for (var i=0;i<installedPlatforms.length;i++){
    if (installedPlatforms[i]==='android'){
      prepareManifest(context);
    }
  }

  function prepareManifest(context){
    console.log("Android platform installed...modifying AndroidManifest.xml...");
    console.log("Updating Android Manifest...");
    
    var manifestPath = getManifestPath(cordovaProjectPath);
    console.log("manifestPath="+manifestPath);

    if (fs.existsSync(manifestPath)){
      var manifestContents = fs.readFileSync(manifestPath, 'utf8');

      var fromStr = getServiceManifestString(cordovaProjectPath);
      var toStr = '<service android:exported="false" android:name="com.vipera.pushproxy.DEGCMIntentService">';
      var manifestContents = manifestContents.replace(fromStr, toStr);
      fs.writeFileSync(manifestPath, manifestContents);

      var parser = new xml2js.Parser();
      parser.parseString(manifestContents, function (err, result){
        if(err){
          console.log(err);
          return;
        }
        result.manifest = cleanIntentServiceFromManifest(result.manifest);
        var builder = new xml2js.Builder();
        var newXml = builder.buildObject(result);
        fs.writeFileSync(manifestPath, newXml);
      });

      console.log("Manifest update complete.");
    } else {
      console.log("Manifest not found.");
    }
  }

  function cleanIntentServiceFromManifest(manifest){
    var services = manifest.application[0].service;
    console.log("Founds before: " + services);
    var foundCount = 0;
    var foundIdx = new Array();
    services = _.uniqBy(services, function(service){
      return service['$']['android:name'];
    });
    manifest.application[0].service = services;
    return manifest;
  }

  function parseElementtreeSync (filename) {
      var contents = fs.readFileSync(filename, 'utf-8');
      if(contents) {
          //Windows is the BOM. Skip the Byte Order Mark.
          contents = contents.substring(contents.indexOf('<'));
      }
      return new et.ElementTree(et.XML(contents));
  }
  
  function getManifestPath(projectRoot) {
  	var jsonFile = loadPackageJSON(projectRoot);
  	if(jsonFile.dependencies){
  		var androidVersionStr=jsonFile.dependencies["cordova-android"] || '';
      	if(androidVersionStr){
        	var version = androidVersionStr.replace(/^[^0-9]+/, '');
        	let versionParts = version.split("\.");
        	if(versionParts && versionParts[0]) {
        		console.log("Detected Cordova version: " + versionParts[0]);
        		if(parseInt(versionParts[0]) >= 7) {
        			return path.join(projectRoot, "platforms", "android", "app", "src", "main", "AndroidManifest.xml");
        		}
        	} else {
        		console.log("Cannot retrieve Cordova version");
        	}
      	}
  	}
  	return path.join(projectRoot, "platforms", "android", "AndroidManifest.xml");
  }
  
  function getServiceManifestString(projectRoot) {
  	var jsonFile = loadPackageJSON(projectRoot);
  	if(jsonFile.dependencies){
  		var phonegapVersion=jsonFile.dependencies["phonegap-plugin-push"] || '';
      	if(phonegapVersion){
        	var version = phonegapVersion.replace(/^[^0-9]+/, '');
        	let versionParts = version.split("\.");
        	if(versionParts && versionParts[0]) {
        		console.log("Detected Phonegap version: " + versionParts[0]);
        		if(parseInt(versionParts[0]) >= 2) {
        			return '<service android:name="com.adobe.phonegap.push.FCMService">';
        		}
        	} else {
        		console.log("Cannot retrieve Phonegap version");
        	}
      	}
  	}
  	return '<service android:exported="false" android:name="com.adobe.phonegap.push.GCMIntentService">';
  }
  
  function loadPackageJSON(projectRoot){
    return JSON.parse(fs.readFileSync(path.resolve(projectRoot,"package.json")));
  }

}