@moxtradeveloper/cordova-plugin-moxo
Version:
Plugin for adding Moxtra services to Cordova/PhoneGap Apps.
235 lines (197 loc) • 8.03 kB
JavaScript
var fs = require("fs");
var path = require("path");
function writeFile(file, contents) {
fs.writeFileSync(file, contents);
}
function readFile(file) {
return fs.readFileSync(file, "utf-8");
}
function fileExists(file) {
return fs.existsSync(file);
}
function getCordovaMainActivity() {
return path.join("platforms", "android", "CordovaLib", "src", "org", "apache", "cordova", "CordovaActivity.java");
}
function getCordovaBuildGradle() {
return path.join("platforms", "android", "CordovaLib", "build.gradle");
}
function getCordovaAndroidManifest() {
return path.join("platforms", "android", "app", "src", "main", "AndroidManifest.xml");
}
function getGradlePrepertiesFile() {
return path.join("platforms", "android", "gradle.properties");
}
function changeExtendActivity(activity) {
var match = activity.match(/^(\s*)import android\.app\.Activity;/m);
var addImport = "import android.support.v4.app.FragmentActivity;";
var changeActivity = "extends FragmentActivity";
if (match) {
modifiedLine = match[0] + '\n' + addImport;
activity = activity.replace(/^(\s*)import android\.app\.Activity;/m, modifiedLine);
}
match = activity.match(/extends Activity/m);
if (match) {
activity = activity.replace(/extends Activity/m, changeActivity);
}
return activity;
}
function addDependency(gradle) {
var match = gradle.match(/\bdependencies\s*\{[^\{\}]+\}(?![^\{]+\})/gm);
if (match) {
var second = match[0];
second = second.replace(/\bdependencies\s*\{/m, "dependencies {\n implementation \"com.android.support:support-fragment:28.0.0\" \/\/Added by Moxtra");
gradle = gradle.replace(match, second);
} else {
gradle = gradle + "\n\n" + "dependencies {\n implementation \"com.android.support:support-fragment:28.0.0\" \/\/Added by Moxtra\n }\n";
}
return gradle;
}
function contentMatch(content, regex) {
var match = content.match(regex);
if (match) {
return true;
}
return false;
}
function replaceContent(originContent, replaceContent, regex) {
return originContent.replace(regex, replaceContent);
}
function processManifest(isInstall) {
/*
var filePath = getCordovaAndroidManifest();
var content = readFile(filePath);
var manifestContent = content.match(/^(\s*)<manifest(\n|.)*?>/gm);
var appContent = content.match(/^(\s*)<application(\n|.)*?>/gm);
var activityContent = content.match(/^(\s*)<activity(\n|.)*?>/gm);
var found = false;
if (manifestContent) {
found = contentMatch(manifestContent[0], /xmlns:tools=\"http:\/\/schemas\.android\.com\/tools\"/g);
if (isInstall && !found) {
//Add xmlns:tools
var replaced = replaceContent(manifestContent[0], " xmlns:tools=\"http:\/\/schemas\.android\.com\/tools\">", />/g);
content = replaceContent(content, replaced, manifestContent[0]);
} else if (!isInstall && found) {
//Remove xmlns:tools
var replaced = replaceContent(manifestContent[0], "", /(\s*)xmlns:tools=\"http:\/\/schemas\.android\.com\/tools\"\n?/g);
content = replaceContent(content, replaced, manifestContent[0]);
}
}
if (appContent) {
found = contentMatch(appContent[0], /tools:replace=\"android:appComponentFactory\"/g);
var appComponentFactory = appContent[0];
if (isInstall && !found) {
//Add tools:replace
appComponentFactory = replaceContent(appContent[0], " tools:replace=\"android:appComponentFactory\">", />/g);
content = replaceContent(content, appComponentFactory, appContent[0]);
} else if (!isInstall && found) {
//Remove tools:replace
appComponentFactory = replaceContent(appContent[0], "", /(\s*)tools:replace=\"android:appComponentFactory\"\n?/g);
content = replaceContent(content, appComponentFactory, appContent[0]);
}
found = contentMatch(appComponentFactory, /android:appComponentFactory=\"moxtra\"/g);
if (isInstall && !found) {
//Add android:appComponentFactory
var appComponentFactoryValue = replaceContent(appComponentFactory, " android:appComponentFactory=\"moxtra\">", />/g);
content = replaceContent(content, appComponentFactoryValue, appComponentFactory);
} else if (!isInstall && found) {
//Remove android:appComponentFactory
var appComponentFactoryValue = replaceContent(appComponentFactory, "", /(\s*)android:appComponentFactory=\"moxtra\"\n?/g);
content = replaceContent(content, appComponentFactoryValue, appComponentFactory);
}
} else {
console.log("appContent[0] null");
}
if (activityContent) {
found = false;
for (var i = 0; i < activityContent.length; i++) {
if (contentMatch(activityContent[i], /android:name=\"MainActivity\"/g)) {
found = contentMatch(activityContent[i], /android:theme=\"@style\/Theme\.AppCompat\.NoActionBar\"/g);
if (isInstall && !found) {
//Add AppCompat theme
var replacedValue = replaceContent(activityContent[i], "android:theme=\"@style\/Theme\.AppCompat\.NoActionBar\"", /android:theme=\".*?\"/g);
content = replaceContent(content, replacedValue, activityContent[i]);
} else if (!isInstall && found) {
//Remove AppCompat theme
var replacedValue = replaceContent(activityContent[i], "android:theme=\"@android:style\/Theme\.DeviceDefault\.NoActionBar\"", /android:theme=\".*?"\n?/g);
content = replaceContent(content, replacedValue, activityContent[i]);
}
break;
} else {
console.log("no MainActivity found!");
}
}
} else {
console.log("activityContent[0] null");
}
writeFile(filePath, content);
*/
}
module.exports = {
modifyCordovaActivity: function() {
var filePath = getCordovaMainActivity();
if (!fileExists(filePath)) {
return;
}
var mainActivity = readFile(filePath);
mainActivity = changeExtendActivity(mainActivity);
writeFile(filePath, mainActivity);
},
restoreCordovaActivity: function() {
var filePath = getCordovaMainActivity();
if (!fileExists(filePath)) {
return;
}
var extendsActivity = "extends Activity";
var mainActivity = readFile(filePath);
mainActivity = mainActivity.replace(/\nimport(.*?)FragmentActivity;/m, '');
mainActivity = mainActivity.replace(/extends FragmentActivity/m, extendsActivity);
writeFile(filePath, mainActivity);
},
modifyCordovaBuildGradle: function() {
var filePath = getCordovaBuildGradle();
if (!fileExists(filePath)) {
return;
}
var gradlefile = readFile(filePath);
gradlefile = addDependency(gradlefile);
writeFile(filePath, gradlefile);
},
restoreCordovaBuildGradle: function() {
var filePath = getCordovaBuildGradle();
if (!fileExists(filePath)) {
return;
}
var gradlefile = readFile(filePath);
// remove any lines we added
gradlefile = gradlefile.replace(/(?:^|\r?\n)(.*)Added by Moxtra*?(?=$|\r?\n)/g, '');
writeFile(filePath, gradlefile);
},
modifyCordovaAndroidManifest: function() {
var filePath = getCordovaAndroidManifest();
if (!fileExists(filePath)) {
return;
}
processManifest(true);
},
restoreCordovaAndroidManifest: function() {
var filePath = getCordovaAndroidManifest();
if (!fileExists(filePath)) {
return;
}
processManifest(false);
},
check_before_compile: function() {
var mainActivityPath = getCordovaMainActivity();
var gradleProperties = getGradlePrepertiesFile();
if (!fileExists(mainActivityPath) || !fileExists(gradleProperties)) {
return;
}
var gradlePropertiesContent = readFile(gradleProperties);
var mainActivityContent = readFile(mainActivityPath);
if (contentMatch(gradlePropertiesContent, /android\.useAndroidX=true/gm)) {
//Modify Main Activity import
mainActivityContent = mainActivityContent.replace("android.support.v4.app.FragmentActivity", "androidx.fragment.app.FragmentActivity");
writeFile(mainActivityPath, mainActivityContent);
}
}
};