diff --git a/hooks/after_plugin_install/npminstall.js b/hooks/after_plugin_install/npminstall.js new file mode 100644 index 0000000..0b2a72b --- /dev/null +++ b/hooks/after_plugin_install/npminstall.js @@ -0,0 +1,4 @@ +#!/usr/bin/env node + +var exec = require('child_process').exec; +exec("npm install xml2js@0.4.x"); \ No newline at end of file diff --git a/hooks/before_build/generateActivity.js b/hooks/before_build/generateActivity.js new file mode 100644 index 0000000..50e553a --- /dev/null +++ b/hooks/before_build/generateActivity.js @@ -0,0 +1,181 @@ +#!/usr/bin/env node + +// Define required. +var fs = require("fs"); +var xml2js = require('xml2js'); +var parseString = xml2js.parseString; +var builder = new xml2js.Builder(); + +// Define differents paths. +var pathConfigXml = "config.xml"; +var pathAndroidCordova = "platforms/android/"; +var pathResAndroidCordova = "platforms/android/res/"; +var pathAndroidPlugin = __dirname+"/../../src/android/"; +var pathResPlugin = __dirname+"/../../res/"; + +/** + * Generate a path based on a package name. + * + * @param {string} packageName Package name, eg: com.example. + * + * @return {string} Return path generate. + */ +var generatePathFrompackageName = function(packageName) { + return packageName.split(".").join("/"); +} + +/** + * Create different java classes. + * + * @param {string} packageName Package name of the current application. + */ +var createClasses = function(packageName) { + var pathCameraView = pathAndroidPlugin+"customCamera/src/org/geneanet/customcamera/CameraView.java"; + var pathCameraLauncher = pathAndroidPlugin+"CameraLauncher.java"; + + if (fs.existsSync(pathCameraView) && fs.existsSync(pathCameraLauncher)) { + // Rewrite package of CameraView class. + var contentCameraView = fs.readFileSync(pathCameraView, {encoding: "utf8"}); + contentCameraView = contentCameraView.replace(/^package\s[^;]*/,"package "+packageName); + fs.writeFileSync(pathAndroidCordova+"src/"+generatePathFrompackageName(packageName)+"/CameraView.java", contentCameraView); + + // Rewrite import of CameraLauncher class. + var contentCameraLauncher = fs.readFileSync(pathCameraLauncher, {encoding: "utf8"}); + contentCameraLauncher = contentCameraLauncher.replace("XXX_NAME_CURRENT_PACKAGE_XXX", packageName); + fs.writeFileSync( + pathAndroidCordova+"src/"+generatePathFrompackageName(contentCameraLauncher.match(/package\s([^;]*)/)[1])+"/CameraLauncher.java", + contentCameraLauncher + ); + } else { + console.error("File CameraView.java or/and CameraLauncher.java not found."); + process.exit(1); + } +} + +/** + * Update AndroidManifest.xml of the current application. + * + * @param {string} packageName Package name of the current application. + */ +var updateAndroidManifest = function(packageName) { + var pathAndroidManifestCordova = pathAndroidCordova+"AndroidManifest.xml"; + if (fs.existsSync(pathAndroidManifestCordova)) { + // get content AndroidManifest. + var contentAndroidManifest = fs.readFileSync(pathAndroidManifestCordova, {encoding: "utf8"}); + parseString(contentAndroidManifest, function (err, result) { + contentAndroidManifest = result; + }); + + // add activity if needed. + var needAddActivity = true; + var currentActivities = contentAndroidManifest["manifest"]["application"][0]["activity"]; + for (var i = currentActivities.length - 1; i >= 0; i--) { + if (currentActivities[i]["$"]["android:name"] == "CameraView") { + needAddActivity = false; + } + }; + if (needAddActivity) { + contentAndroidManifest["manifest"]["application"][0]["activity"].push({ + $: { + "android:name": "CameraView", + "android:label": "CameraView", + } + }) + var newXmlAndroidManifest = builder.buildObject(contentAndroidManifest); + fs.writeFileSync( + pathAndroidManifestCordova, + newXmlAndroidManifest + ); + } + } else { + console.error("File AndroidManifest.xml for cordova not found."); + process.exit(1); + } +} + +/** + * Update differents config file (translate, res/layout, etc). + */ +var updateConfig = function() { + var pathLayoutCordova = pathResAndroidCordova+"layout/"; + var pathLayoutPlugin = pathAndroidPlugin+"customCamera/res/layout/"; + var pathLayoutCameraView = pathLayoutPlugin+"activity_camera_view.xml"; + + // create directory layout in cordova if it doesn't exist. + if (!fs.existsSync(pathLayoutCordova)) { + fs.mkdirSync(pathLayoutCordova); + } + + // "copy" layout for camera. + if (fs.existsSync(pathLayoutCameraView)) { + var layoutCameraViewContent = fs.readFileSync(pathLayoutCameraView, {encoding: "utf8"}); + + fs.writeFileSync(pathLayoutCordova+"activity_camera_view.xml", layoutCameraViewContent); + } else { + console.error("File activity_camera_view.xml in plugin not found."); + process.exit(1); + } + + // add translations. + var pathTranslations = pathResPlugin+"translations.json"; + if (fs.existsSync(pathTranslations)) { + // get translations. + var translationsForApplications = fs.readFileSync(pathTranslations, {encoding: "utf8"}); + translationsForApplications = JSON.parse(translationsForApplications); + for (lang in translationsForApplications) { + var pathFileTranslate = pathResAndroidCordova+"values-"+lang+"/"; + + var objToXml; + // already exist, get data. + if (fs.existsSync(pathFileTranslate+"strings.xml")) { + var objToXml = fs.readFileSync(pathFileTranslate+"strings.xml", {encoding: "utf8"}); + parseString(objToXml, function (err, result) { + objToXml = result; + }); + } else { + // generate minimal object. + objToXml = { + resources: { + string: [] + } + }; + } + + // add message. + for (tag in translationsForApplications[lang]) { + objToXml["resources"]["string"].push({ + _: translationsForApplications[lang][tag], + $: { + name: tag + } + }); + } + + var xmlBuild = builder.buildObject(objToXml); + if (!fs.existsSync(pathFileTranslate)) { + fs.mkdirSync(pathFileTranslate); + } + fs.writeFileSync(pathFileTranslate+"strings.xml", xmlBuild); + } + } else { + console.error("File translations.json in plugin not found."); + process.exit(1); + } +} + +// Check if files required exist. +if (fs.existsSync(pathConfigXml)) { + // Get the name package of the current application. + var configContent = fs.readFileSync(pathConfigXml, {encoding: "utf8"}); + parseString(configContent, function (err, result) { + configContent = result; + }); + var packageName = configContent["widget"]["$"]["id"]; + + createClasses(packageName); + updateAndroidManifest(packageName); + updateConfig(); +} else { + console.error("File config.xml for cordova not found."); + process.exit(1); +} \ No newline at end of file diff --git a/plugin.xml b/plugin.xml index 0e1ca98..5a64afc 100644 --- a/plugin.xml +++ b/plugin.xml @@ -12,6 +12,9 @@ + + + @@ -22,10 +25,10 @@ - - + + + + + \ No newline at end of file diff --git a/res/translations.json b/res/translations.json new file mode 100644 index 0000000..6245dea --- /dev/null +++ b/res/translations.json @@ -0,0 +1,10 @@ +{ + "fr": { + "sss": "", + "capture": "Prendre photo" + }, + "en": { + "sss": "", + "capture": "Take picture" + } +} \ No newline at end of file diff --git a/src/android/CameraLauncher.java b/src/android/CameraLauncher.java index a22d44d..4fc292c 100644 --- a/src/android/CameraLauncher.java +++ b/src/android/CameraLauncher.java @@ -1,5 +1,6 @@ package org.geneanet.customcamera; +import XXX_NAME_CURRENT_PACKAGE_XXX.CameraView; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.json.JSONArray; @@ -9,14 +10,9 @@ import android.content.Intent; public class CameraLauncher extends CordovaPlugin { public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { - Intent intent = new Intent("org.geneanet.customcamera.CameraView"); - cordova.startActivityForResult((CordovaPlugin) this, intent, 1111111); - + Intent intent = new Intent(this.cordova.getActivity(), CameraView.class); + cordova.getActivity().startActivity(intent); + return true; } - - public void testAction() - { - - } } diff --git a/src/android/CustomCamera.jar b/src/android/CustomCamera.jar deleted file mode 100644 index a780314..0000000 Binary files a/src/android/CustomCamera.jar and /dev/null differ diff --git a/src/android/.gitignore b/src/android/customCamera/.gitignore similarity index 100% rename from src/android/.gitignore rename to src/android/customCamera/.gitignore diff --git a/src/android/AndroidManifest.xml b/src/android/customCamera/AndroidManifest.xml similarity index 96% rename from src/android/AndroidManifest.xml rename to src/android/customCamera/AndroidManifest.xml index 34fccf4..bedecd1 100644 --- a/src/android/AndroidManifest.xml +++ b/src/android/customCamera/AndroidManifest.xml @@ -1,6 +1,6 @@ diff --git a/src/android/ic_launcher-web.png b/src/android/customCamera/ic_launcher-web.png similarity index 100% rename from src/android/ic_launcher-web.png rename to src/android/customCamera/ic_launcher-web.png diff --git a/src/android/project.properties b/src/android/customCamera/project.properties similarity index 96% rename from src/android/project.properties rename to src/android/customCamera/project.properties index 8937e94..9b84a6b 100644 --- a/src/android/project.properties +++ b/src/android/customCamera/project.properties @@ -11,4 +11,4 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-14 +target=android-16 diff --git a/src/android/res/drawable-hdpi/ic_launcher.png b/src/android/customCamera/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from src/android/res/drawable-hdpi/ic_launcher.png rename to src/android/customCamera/res/drawable-hdpi/ic_launcher.png diff --git a/src/android/res/drawable-hdpi/labs.png b/src/android/customCamera/res/drawable-hdpi/labs.png similarity index 100% rename from src/android/res/drawable-hdpi/labs.png rename to src/android/customCamera/res/drawable-hdpi/labs.png diff --git a/src/android/res/drawable-mdpi/ic_launcher.png b/src/android/customCamera/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from src/android/res/drawable-mdpi/ic_launcher.png rename to src/android/customCamera/res/drawable-mdpi/ic_launcher.png diff --git a/src/android/res/drawable-mdpi/labs.png b/src/android/customCamera/res/drawable-mdpi/labs.png similarity index 100% rename from src/android/res/drawable-mdpi/labs.png rename to src/android/customCamera/res/drawable-mdpi/labs.png diff --git a/src/android/res/drawable-xhdpi/ic_launcher.png b/src/android/customCamera/res/drawable-xhdpi/ic_launcher.png similarity index 100% rename from src/android/res/drawable-xhdpi/ic_launcher.png rename to src/android/customCamera/res/drawable-xhdpi/ic_launcher.png diff --git a/src/android/res/drawable-xhdpi/labs.png b/src/android/customCamera/res/drawable-xhdpi/labs.png similarity index 100% rename from src/android/res/drawable-xhdpi/labs.png rename to src/android/customCamera/res/drawable-xhdpi/labs.png diff --git a/src/android/res/drawable-xxhdpi/ic_launcher.png b/src/android/customCamera/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from src/android/res/drawable-xxhdpi/ic_launcher.png rename to src/android/customCamera/res/drawable-xxhdpi/ic_launcher.png diff --git a/src/android/res/drawable-xxhdpi/labs.png b/src/android/customCamera/res/drawable-xxhdpi/labs.png similarity index 100% rename from src/android/res/drawable-xxhdpi/labs.png rename to src/android/customCamera/res/drawable-xxhdpi/labs.png diff --git a/src/android/res/layout/activity_camera_view.xml b/src/android/customCamera/res/layout/activity_camera_view.xml similarity index 90% rename from src/android/res/layout/activity_camera_view.xml rename to src/android/customCamera/res/layout/activity_camera_view.xml index 338e5b3..d318c1b 100644 --- a/src/android/res/layout/activity_camera_view.xml +++ b/src/android/customCamera/res/layout/activity_camera_view.xml @@ -15,8 +15,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0.5" - android:contentDescription="@string/sss" - android:src="@drawable/labs" /> + android:contentDescription="@string/sss" />